Cómo dibujar ríos afilados en QGIS
(english version here
)
Aquí explico una manera de hacer mapas de ríos con QGIS que representan de manera mucho más realista las características de una cuenca, mostrando el rango de cada río y quebradaEn Panamá le llamamos quebradas a los riachuelos o arroyos y dibujando líneas afiladas. Las cuencas hidrográficas trazadas de esta manera reflejan muy bien los caudales relativos y agregan un elemento gráfico adicional para visualizar la dirección del flujo de las aguas.
La técnica es una mejora del método propuesto por Anita Graser (autora de “QGIS map design”) en su blog.
Necesitarás, por supuesto, una base de datos de ríos decente. En mi caso, he usado la hidrografía de la nueva cartografía de Panamá en 1:25,000 del Instituto Geográfico Nacional Tommy Guardia (IGNTG). El IGNTG todavía no ha publicado las capas geográficas de la nueva cartografía, así que me he visto obligado a dibujarla directamente sobre mapas PDF georeferenciados, como este:
Esto también lo puedes hacer usando imágenes satelitales o fotos aéreas de drones. Te debes asegurar que los datos cumplen con ciertas características mínimas:
- Cada río y quebrada debe estar representado en un solo elemento. Si el río está dividido en varias líneas, deberás unir estas líneas para que quede una sola. No voy a entrar en detalles aquí, pero puedes intentarlo seleccionando las distintas partes del río y usando Vectorial/Herramientas de geoproceso/Disolver. El mapa que pongo aquí sufre de este problema en uno de sus ríos, a ver si lo encuentras.
- La línea de cada río y quebrada debe estar dibujada desde su nacimiento hasta su desembocadura, es decir en dirección río abajo. O al menos todos en la misma dirección. La dirección de la línea es importante para que el algoritmo usado en el procedimiento que se muestra aquí sepa cómo dibujar la parte delgada y el gradual engrosamiento del cuerpo de agua. De otro modo quedarás con ríos que nacen gruesos y terminan delgados. Cuando eso ocurre se verá como aquíHace falta invertirle el sentido a esta quebrada, en ese caso selecciona tu río y usa Invertir línea en la barra de herramientas Digitalización avanzada para corregir la dirección de la línea.
- Deberás incluir en tu tabla de atributos una columna que represente el rango de cada río y quebrada. En la capa de ejemplo que pongo aquí, este campo se llama
"AA_ORDEN"
. Los ríos más grandes tendrán el orden 0, los que desembocan en los ríos grandes serán 1 y así. Aquí utilicé 6 niveles, del 0 al 5, el número 5 es para las quebradas más pequeñas en las que no desemboca ninguna otra quebrada, el 4 para las que reciben las aguas de una o dos quebradas y así voy hasta los ríos más grandes con el 0. Aquí puedes ver la clasificación que le di a los ríos en mi mapa: Puedes inventar tu propio sistema de clasificación: 'río grande', 'arroyo pequeño', 'río mediano' o como quieras llamarle.Si tienes la suerte de contar con datos de caudal de los ríos de tu cuenca puedes utilizar estos datos convirtiéndolos a una distribución de frecuencias. Estos valores los irás ajustando por ensayo y error según cómo se ve, porque al final es un asunto de apariencia visual, con la idea de representar los ríos más grandes con líneas más gruesas y los pequeños más delgados. - Según la escala a la que hagas tu mapa, deberás incluir la mayor cantidad de nodos posibles en cada trayecto. Mientras más detalle pongas en cada río, mejor se verá, ya que el algoritmo va engrosando la línea segmento por segmento.
- Si quieres puedes agregar un campo a tu tabla con el nombre de la cuenca a la que pertenece el cuerpo de agua. Esto resulta conveniente para tener la opción de mostrar una cuenca específica en tu mapa, con un color diferente o para mostrar tu cuenca de interés con más detalle y las otras cuencas sólo con los ríos más grandes.
Aquí incluyo una capa de ejemplo para que puedas empezar a hacer tus pruebas, la de los ríos Sansón y Sansoncito en la provincia de Darién en Panamá. Esta capa está proyectada en el sistema de coordenadas WGS 84/UTM 18N (EPSG 32618).
(Baja aquí la capa de ejemplo en geopackage o en shapefile).
Una vez tengas tu capa de ríos estamos listos para comenzar.
Advertencia: este método utiliza mucho CPU de tu computadora, especialmente con los ríos más grandes y si tu capa es muy amplia y compleja. Si estás usando QGIS en una laptop con poco poder prepárate para que se caliente y quizá tome un largo tiempo en mostrar tus ríos.Es una buena idea hacer en QGIS un duplicado de la capa con simbología sencilla que puedas usar para visualizar tus datos de manera rápida y solo actives la capa de ríos afilados cuando sea necesario.
- Abre tus datos
- Desde la ventana de Propiedades de la capa/Simbología agrega una capa tipo Generador de geometrías con el Tipo de geometría CadenaDeLínea/CadenaMultiLínea. En el espacio para la expresión, escribe
segments_to_lines($geometry)
- En la misma ventana aparece una capa Línea sencilla. Selecciónala y elige tu color. En el campo de Anchura de marca selecciona Metros a escala (aunque también puedes usar milímetros u otro tipo de medida). No importa el ancho que pongas aquí, porque lo vamos a generar dinámicamente con el código que pondremos a continuación. Haz clic en Suplantación definida por datos (el ícono que aparece del lado derecho) y elige Editar.... En la ventana Constructor de cadena de expresión, pon el siguiente código:
CASE
WHEN "AA_ORDEN" = 5 THEN 1
WHEN "AA_ORDEN" = 4 THEN 2
WHEN "AA_ORDEN" = 3 THEN 3
WHEN "AA_ORDEN" = 2 THEN 3.5
WHEN "AA_ORDEN" = 1 THEN 5
ELSE 10
END
* ( log10(@geometry_part_num) / log10(@geometry_part_count) )
* log10($length)
* 3
Vamos a analizar el código. Tu columna de orden de río, la que explico en el punto 3 arriba, es la que yo he llamado "AA_ORDEN"
. Reemplaza en el código aquí el nombre de tu columna de orden. El número que aparece a continuación ( = 5
, = 4
etc) son los números que usaste para calificar las quebradas más pequeñas (5) hasta los ríos más grandes (0, el cero no aparece porque se selecciona con el ELSE
). Si usas otra manera de clasificar tus ríos, reemplázalo aquí (por ejemplo, = 'río grande'
ó = 'arroyo chico'
).
El número que sale después de THEN
(1
, 2
, 3
, 3.5
, 5
y el 10
en el ELSE
) es el grosor que tendrá la última parte de tu línea. Como más arriba elegimos Metros a escala este número es el grosor de tu río en metros. Puedes ir ajustando estos valores según la realidad o como mejor se vean. Si usaste milímetros, estos valores serán diferentes.
La siguiente parte del código es la que hace la magia de los ríos afilados. Utiliza las expresiones @geometry_part_num
, @geometry_part_count
y $length
para asignar grosores progresivamente mayores a cada segmento de la línea de tu río, engrosándolo según la longitud total de la línea. He usado una función logarítmica (log10
) para que el grosor aumente rápidamente al principio del río y luego aumente más gradualmente. Me parece que los ríos más largos se ven mejor así. Puedes modificar esa parte del código y usar* ( @geometry_part_num / @geometry_part_count )
si prefieres que tus líneas se engrosen más gradualmente. Intenta ambas opciones para ver cuál te gusta más.
La última parte, * 3
, es un factor adicional que puedes utilizar si quieres que todos los ríos se vean más gruesos (multiplica por un valor mayor que 1) o más delgados (menores que 1, como 0.5, por ejemplo). Este factor y los valores de grosor los podrás ir ajustando por ensayo y error.
Puedes descargar el resultado final en alta resolución aquí.
Este método requiere un poco más de trabajo preparando tu capa y luego tiempo para ajustar los valores de grosor en la expresión. Pero el resultado vale la pena y tu mapa se verá mucho más bonito. Comparte tus modificaciones a este método y tus mapas dejando un comentario abajo o en Twitter, me encantaría escuchar tus ideas.
Comentarios
Los comentarios son moderados antes de publicarse.
También puedes comentar vía Twitter
Wao! Que cool que QGIS ha implementado los órdenes de los ríos, se pueden hacer mejores trabajos hidrológicos y hacer estudios de caudal, tiempo de concentración y saltos hídricos.
En definitiva podríamos romper hasta la pugna entre quién es afluente de quién si del chucunaque al Tuira o el Tuira al Chucunaque.
-- José Manuel (2/12/2019)