Cómo hacer un mapa de curvas de nivel rellenas con QGIS y Python

Publicado: 11 de junio de 2023.

Motivación

Una región pequeña de un mapa con curvas de nivel rellenas (un mapa hipsometrico) que muestra los alrededores de Dolgellau y Cader Idris en Gales. Una parte de un mapa que muestra la topografía como curvas de nivel rellenas de color (tonos hipsometricos). Mi ruta en bicicleta se muestra a lápiz. Me alojé en el albergue juvenil de Kings cerca de Dolgellau y subí a Cader Idris a pied. Fuente: Bartholomew Serie de Mapas de Media Pulgada 22 (Gales Central), 1973. 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.

Que se puede hacer con curvas de nivel rellenas en QGIS

Un imagen de dos figuras. Cada undo muestra un ráster sin etiquetas de la topografía de una región cuadrado que incluye el lago de cráter del volcán Katmai, en que los colores mas claros indican alturas mas altas. La figura derecha tiene curvas de nivel grises cada 200 metros. Left: El imagen ráster de la topografía que se utiliza en este artículo. Se muestra el volcán Katmai en Alaska con el degradado magma. Right: El mismo ráster, con curvas de nivel cada 200 metros. 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.

Un imagen con dos tablas. Ambas tablas muestra el ráster topográfico del imagen previo. La tabla izquierda utiliza una rampa de color discreta que da la impresión de curvas de nivel rellenas. La tabla derecha muestra el resulto del algoritmo de Líneas a polígonos de QGIS, que no conecta de manera correcta las curvas de nivel que terminan al borde del imagen. Izquierda: La rampa de color del ráster es discreta, que da la impresión de curvas de nivel rellenas. Derecha:La función Líneas a polígonos no tiene éxito cuando las curvas de nivel tocan el borde del imagen. 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.

Para conseguir polígonos rellenos vectoriales añadiendo Python

Un imagen de dos tablas. La tabla izquierda muestra el resultado del algoritmo de curvas de nivel de QGIS después de afilar el ráster. Es correcto excepto de que no se incluyen los agujeros. La tabla derecha muestra las curvas de nivel después de remover los agujeros. Izquierda: Curvas de nivel rellenas generados por Líneas a polígonos, después de afilar el MDT (la región afilada está fuera del borde del imagen). Derecha: Las curvas de nivel rellenas después de remover los agujeros. Tenga en cuenta que el lago del cráter del volcán ya tiene el color correcto. 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.

Curvas de nivel rellenas con agujeros

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

Últimos retoques

El resultado de los pasos en este artículo, que muestra la topografía como curvas de nivel rellenas. Se ha removido la zona afilado y las agujeros en los contornos. Se utiliza varios tonos de gris para mantener constante el contraste entre los colores. El resultado de los pasos de este artículo. El ráster topográfio se ha sido convertido a curvas de nivel: polígonos discretos rellenos de color. Se han sido removidos la región afilada y los agujeros en los contornos. Se utiliza varios tonos de gris para mantener constante el contraste entre los colores. 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

Pensamientos finales

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!