miércoles, 3 de octubre de 2018

Caso práctico QGIS: estilo Tanaka en curvas de nivel.

Hoy vamos a intentar desarrollar un caso práctico con QGIS consistente en aplicar un estilo a las curvas de nivel conocido como Tanaka. Dicho en tres palabras este método consiste en aplicar una fuente de luz a los contornos de las curvas, con lo que se consigue una representación similar al 3D proporcionando un efecto de sombra realista sin necesidad de datos de relieve verdaderos. Dibujando en tonos más claros las líneas que miran directamente a la fuente de luz y en tonos más oscuros las que caen en sombra, y apoyados también en diferentes grosores (más delgadas las perpendiculares a la luz) se termina de pulir ese efecto realista del paisaje.
Dado que para este tipo de operaciones se requieren conocimientos avanzados de expresiones y funciones (que yo por desgracia no tengo), seguimos el excelente tutorial de LandscapeArchaeology. Todo lo que necesitamos para este caso práctico es un MDT (o DEM). Vamos con ello:

1.- Cargar en QGIS el MDT sobre el que trabajar.
Hemos elegido para este caso práctico una zona costera de las Rías Baixas para una mejor visualización del efecto.
2.- Extraer las curvas de nivel.
En QGIS disponemos de varias fórmulas para realizar esta operación: SAGA, GRASS, GDAL... Según nuestro guía parece conveniente para un resultado más óptimo que las curvas tengan la misma orientación o sentido (a favor o en contra de las agujas del reloj, pero nunca ambas). Y parece también que el algoritmo GDAL es el que nos asegura la consistencia en este proceso. Así pues, procedemos a generar las curvas de nivel con él.
Con los parámetros por defecto simplemente generamos las curvas con una equidistancia de p,ej. 20 metros.
Una rápida comprobación usando la simbología de flechas para comprobar que la orientación de las curvas es uniforme.

3.- Aplicando el estilo.
Dado que el método Tanaka busca aplicar el estilo a cada tramo de línea, es necesario segmentar la curva para disponer de polilíneas individualizadas cada dos nodos. Entendemos que este es uno de los quiz de la cuestión: a tramos más cortos el estilo se aplicará con mayor precisión que tratando la curva completa, pues cada segmento de la misma dispone de una orientación diferente respecto a la fuente de luz.
Aunque ya Anita Graser utilizó esta segmentación previa, parece que las últimas versiones de QGIS permiten integrarla dentro de la misma fórmula de estilo ahorrando este paso adicional.
  • Usamos Geometry generator como tipo de símbolo de la línea y la expresión segments_to_lines( $geometry) para conseguir la división de la línea en segmentos (split).
  • Introducimos el estilo como una expresión mediante el botón Edit. Primero para el color:
color_hsl( 0,0,
  scale_linear(
    abs(
      (135 +
        degrees(
          azimuth(
             end_point(geometry_n($geometry,@geometry_part_num)),
            start_point(geometry_n($geometry,@geometry_part_num))
     )))
      % 360 - 180),
  0, 180 ,0, 100))
  • Y después la expresión para el grosor:
scale_linear(
  abs(
    (135 +
      degrees(
        azimuth(
          end_point(geometry_n($geometry,@geometry_part_num)),
          start_point(geometry_n($geometry,@geometry_part_num))
      ) ))
    % 180 - 90),
 0, 90 ,0.2, 1)

Obviamente, sin tener los conocimientos necesarios de Python, la explicación técnica completa de estas expresiones a nosotros se nos escapa en gran parte (sigo sin entender por qué situar el Noroeste en 135° en vez de los 315° habituales depende de que las curvas estén en el sentido de las agujas del reloj o en el sentido contrario...), por lo que es conveniente que recurráis al artículo original para los detalles extra. Para variaciones en la dirección de la luz podéis modificar el "135" en ambas fórmulas (color y grosor).
  • Un par de retoques finales redondeando los extremos de línea y aplicando el modo de representación Overlay (Superponer) para un resultado más fino e integrado...

... y ya podemos Aplicar todos los cambios para ver el resultado.

4.- Podemos dar algún color al DEM para estar más cerca de un resultado realista mediante el uso de un Singleband pseudocolor.

Aunque creemos que la magia de este método es conseguir el efecto sin necesitar un DEM degradado por alturas, por lo que la prueba con un fondo plano es igualmente efectista. Hemos añadido algunos elementos básicos del mapa para comprobar el efecto conjunto:

Aún así, y a falta de probarlo a fondo, compartimos la impresión de Zoran Čučković cuando dice que "los ejemplos originales de Tanaka de contornos sombreados se usan principalmente para representar la topografía natural. Encuentro ese acercamiento visualmente demasiado pesado; es difícil agregar información adicional sin sobrecargar el mapa (pero eso es solo una impresión ...). Lo que funciona mejor son todos esos mapas de calor que, de otro modo, son salpicaduras de colores: ¡los contornos de Tanaka les dan vida! Solo echa un vistazo al hermoso mapa de profundidad a continuación ...".
Maravilloso ejemplo en el artículo original en el que se aprecia el radical efecto tras el cambio del color base y el ángulo de iluminación.
Decir por último que en el artículo original que nos ha servido de guía está disponible para descarga el archivo de definición de estilo generado con este efecto (tanaka_style.qml), y que como sabéis podemos cargar directamente en nuestra capa ahorrándonos todo el proceso, pero... ¿y lo bonito que es descubrir cómo se hacen las cosas?

Desde Cartografía Digital agradecemos de nuevo la impagable labor de estos profesionales que gracias a sus conocimientos descubren nuevas fórmulas de representación cartográfica, enriqueciendo desde la nada las posibilidades estéticas de nuestros mapas. 
Y brindamos por ellos.

3 comentarios: