Publicado: 11 de junio de 2023.
Cuando tenía 19 años, salí a hacer una aventura solo por primera vez: un viaje de 1,611 kilómetros por Gales. Planifiqué y navegué con mapas de Bartholomew que mi papá había comprado en los principios de la década de 1970 por 30 peniques cada uno. Aunque Gales no cambia rápidamente, estaban desactualizados: algunos pueblos habían crecido, y algunos puentes habían desaparecido. Pero tenían una gran ventaja: mostraban la topografía en color, por curvas de nivel rellenas. Estos tonos hipsometricos fueron iniciados por John Bartholomew hijo en el siglo 19. Me asistieron en visualizar el paisaje y planificar una ruta sin demasiadas subidas.
Por supuesto, las curvas de nivel rellenas no siempre son la mejor manera de mostrar la topografía. Sombrear el mapa con una ranja de colores puede oscurar otros símbolos, así mapas multiusos a menudo emplean curvas de nivel no rellenas, quizás aumentado con relieve sombreado. No obstante, pienso que las curvas de nivel rellenas son la base mas útil para un mapa de rutas de pied o bicicleta.
Desafortunadamentre, no se puede generar curvas de nivel vectoriales rellenas in QGIS automáticamentre. Sin embargo, es posible aproximarlos con un ráster, o generarlos con el ayudo de Python.
Comenzaremos ilustrando lo que se puede hacer en QGIS, utilizando un model digital de terreno (MDT) del volcán Katmai en Alaska, que se descargó con
el complemento de SRTM-Downloader. Al ingresar una extensión de mapa que cubre el volcán, se descargarán dos mosaicos, que se pueden fusionar en un solo MDT por Ráster > Miscelánea > Combinar
. Recorto el ráster al área de interés usando Ráster > Extracción > Cortar ráster por extensión
para acelerar la calculación de las curvas de nivel.
Podemos generar las curvas de nivel con Ráster > Extracción > Curvas de nivel
, que llama a una función de la biblioteca GDAL subyacente. Para garantizar una resula sencilla, utilicé un intervalo de contorno de 200 metros.
Esto ya es casi un mapa de curvas rellenas, excepto de que los colores entre las curvas no son constantes. Por eso es mas difícil distinguir entre los niveles diferentes. Para aproximar contornos rellenos, podemos aplicar una rampa de color discreta en la simbología de la tapa ráster. Si elegimos
Interpolación > Discreto
, Mín: 0
, Máx: 2000
, Mode: Intervalo igual
y Clases: 10
, el ráster se mostrará cómo bandas de color que se alinean a las curvas de nivel.
A menudo la aproximación ráster a las curvas rellenas está satisfactoria. Sin embargo, en otras situaciónes es mejor hacer curvas rellenas verdaderas, representadas por polígonos vectoriales. Estas se ven mejor bajo gran aumento, tienen propiedades geométricas utiles, y en algunos casos tienen tamaños de archivo mas pequeños.
La solución es convertir las curvas de nivel a polígonos, usando Vectorial > Herramientos de geometría > Líneas a polígonos
. Sin embargo, normalmente los polígonos (aquí en naranja) resultan incorrectos. El problema mayor es que el algoritmo no sabe cómo cerrar las curvas cuando se terminen al borde del imagen. Vamos a ver cómo arreglar eso con un codigo de Python.
La solución es ‘cavar un foso’ alrededor del MDT, asi que todos las curvas de nivel queden cerradas. Se afila el borde de ráster hasta un valor arbitrario pequeño. Escribí una función en Python para hacer eso se llama
taper_geotiff()
, que se encuentra en mi repositorio de GitHub geotiff_helper
. Es necesario instalar el módulo de Python osgeo
. Aunque no es un concepto complejo, es necesario tener cuidado en asegurar que la transición al borde es suave. En el terminal de línea de comandos, el comando sería
python3 taper_geotiff.py raster.tif raster_tapered.tif 50 500
en que 50 es la anchura de la zona de afilar (en píxeles), y 500 es la profundidad de la dimunición (en las mismas unidades que el ráster).
Pues utilizamos los mismos pasos que antes para generar las curvas de nivel y convertirlos en polígonos (Ráster > Extracción > Curvas de nivel
, Vectorial > Herramientas de geometría > Líneas a polígonos
). Dado que los polígonos son opacos, tiene que asegurar que las curvas mas bajas se renderizan primeras, yendo a Propriedades > Simbología > Representación de capas > Controlar orden de representación de objetos
y elegiendo Ascendente
orden del variable ELEV
. Pues puede hacer el estilo de los polígonos cómo cualquier otro polígono en QGIS. La manera mas facil de aplicar una rampa de color es seleccionar Propriedades > Simbología > Categorizado
. Elije una rampa de color y haga clic enClassificar
. Puede borrar las niveles mas bajas que no son visibles, y la categoría todos los otros valors
, para utilizar todo de la ranja de colores (para asegurar eso, elije de nuevo la rampa de color). Debe tener polígonos vectoriales hermosos que representan curvas de nivel rellenas.
En algunos paisajes extraños, por ejemplo cráteres volcánicos, algunas de las curvas de nivel tienen agujeros (zonas cerradas de menor elevación). También es posible que el proceso de afilar hacer agujeros. Cuando contornos tienen agujeros, las curvas de nivel rellenas no se renderizan correctamente, porque la curva interna se muestra como otro polígono relleno.
Ese problema tambíen se puede arreglar en Python, al deteccionar los agujeros (curvas de nivel totalmente rodeadas por otras curvas del mismo nivel) ‘restando’ el contorno internal del contorno external. El algoritmo utiliza el area de los polígonos, asi que es mejor convertir a un sistema de coordenadas proyectadas (si no lo son ya) usando Vectorial > Herramientas de gestión de datos > Reproyectar capa
. Para el volcán Katmai, la zona 5N de UTM es adecuado.
Puede encontrar la function que hace eso find_contour_holes()
en mi repositorio de GitHub contour_helper
, y se utiliza asi:
python3 find_contour_holes.py contours_filled.gpkg contours_filled_no_holes.gpkg
Si se ha afilado el ráster, no olvide recortar esta región de los contornos. Se puede hacer eso por crear una nueva capa con un rectángulo y aplicar
Vectorial > Herramientos de geoproceso > Cortar
.
Puede ser tedioso y restrictivo controlar la simbología de polígonos con los menus de QGIS. A veces, utilizo codigos de Python para lograr un resultado mas automático o preciso. Por ejemplo, me gusta cambiar la intensidad de las curvas de nivel para coincidir a la intensidad de los colores adyacentes. Resulta que las curvas siempre son visibles pero nunca se ven demasiadas fuertes.
Si se gustaría estilizar sus mapas asi, o ver como funciona, puede descargar y cambiar los codigos en mi repositorio de GitHub
qgis_style
. En este artículo utilizo la funcíon make_style_files()
con este archivo de entrada:task make_filled_contours
z_min 0.0
d_z 200.0
n_bins 10
colour_ramp_type pyplot_linear
pyplot_ramp_name magma
outline_contrast 0.15
outline_style solid
outline_width 2.0
outline_width_unit Pixel
dir_out styles/
qgis_version 3.22.9-Białowieża
style_file_name filled_contours
En este artículo, he mostrado como hacer un mapa hypsométrico que ilustra la topografía con curvas de nivel rellenas de colores discretos, como un capa ráster con curvas de nivel vectoriales o como un capa vectorial de polígonos rellenos. Este método no está limitado a topografía: cualquier ráster pdría ser tratado igualmente, por ejemplo un mapa de la temperatura.
En el futuro, a medida que aprenda mas sobre el funcionamiento interno de QGIS, espero agregar ese método de hacer contornos rellenos al software, y también incluir los rásteres globales. ¡Por favor siéntase libre de contribuir!