jueves, 28 de enero de 2016

MDT a partir de curvas de nivel.

Si en su día explicamos en este artículo el proceso para extraer las curvas de nivel a partir de un MDT, hoy vamos a hacer el proceso contrario, es decir, conseguir un MDT a partir de un archivo vectorial de curvas de nivel. Un sencillo y habitual ejercicio que ahora podemos hacer tanto en Global Mapper como en QGIS. Para ello vamos a utilizar las curvas de nivel en formato vectorial shape .shp incluidas en cualquiera de las hojas descargadas de la BTN25 de la que hablamos en el artículo anterior, recordando que ahora contienen información tridimensional (en el ejemplo de hoy las de la hoja 105-2 del MTN25).

- En Global Mapper.
Cargamos en el programa el archivo de curvas de nivel BTN25_ETRS_BCN0201L_CUR_NIV_line.shp (recordad que debe estar descomprimido en una carpeta con sus homónimos .prj, .shx y .dbf que son los que contienen atributos y georeferencia). Desde el menú Analysis/Create Elevation Grid from 3D Vector Data... accedemos a la ventana de opciones.
Podemos elegir un nombre para la capa o modificar algunos parámetros (básicamente la resolución o Grid Spacing. Interesante la opción Save Triangulation Network (TIN) as a Vector Layer si queremos generar una capa vectorial suplementaria con los polígonos TIN). Para este ejemplo lo dejamos por defecto como veis en la imagen pues el resultado es bueno. Pulsamos OK y en unos segundos Global Mapper nos carga en pantalla nuestra malla de elevaciones resultante.
MDT en Global Mapper
Ahora simplemente lo exportamos a alguno de los muchos formatos de elevación para MDT disponibles en Global Mapper (asc o geotiff son de los más comunes) y listo.

- En QGIS.
El proceso en QGIS es el siguiente. Cargamos nuestro vectorial con las curvas de nivel y a través del menú Ráster/Interpolación accedemos a la ventana del complemento de interpolación.
En dicho complemento habremos de completar la información de algunos campos, unos son obligatorios y otros opcionales para conseguir mayor resolución. Podéis probar con toda tranquilidad a variar los parámetros e ir viendo los resultados. Para este ejemplo yo lo he configurado como sigue:
Capas vectoriales debe contener nuestra capa de curvas. En Atributo de interpolación debemos seleccionar el campo que contenga los datos de altura de nuestras curvas. Marcamos Usar coordenada Z para interpolación. Y pulsamos Añadir para insertar los datos en la ventana. En la zona derecha de la ventana escogemos el Tamaño X e Y de celda (resolución en metros del MDT) y pulsamos Establecer a la extensión actual para acotar el terreno. Por último seleccionamos un nombre y carpeta para el archivo de salida y marcamos la opción Añadir resultado al proyecto para que cargue el resultado como capa. Pulsamos Aceptar.
QGIS genera entonces nuestro archivo de relieve (por defecto parece que en formato asc) y lo carga en pantalla (por defecto también en escala de grises). Desconozco porqué la escala de alturas que nos ofrece no se corresponde con la realidad (en amarillo en la imagen), pues nuestro vectorial contiene curvas de nivel desde la cota 1110 hasta la cota 2080 metros (no importa, he comprobado que las cotas están ahí).
Coloreamos entonces el MDT a nuestro gusto y le aplicamos sombreado (podéis ver cómo hacerlo en esta entrada sobre mapas hipsométricos) para que nos resulte más lógico y atractivo, y ya tenemos nuestro resultado final: MDT degradado por alturas generado a partir de curvas de nivel vectoriales. Precioso.
PD: He probado a realizar este mismo proceso con las curvas de nivel de la misma hoja anteriores a la BTN25 (lo que era la BCN25) y los MDT generados resultan planos (sin datos) tanto en Global Mapper como en QGIS. O sea, que lo de la nueva información tridimensional de la BTN25 parece que tiene su importancia...
Versiones utilizadas para este artículo: Global Mapper v16.1 y QGIS 2.12.3 Lyon.

12 comentarios:

  1. Respuestas
    1. Pues si no estoy equivocado, y con las opciones por defecto, en Global Mapper sale resolución de 4 metros y en QGIS de 40-42 metros. Obviamente en ambos se pueden modificar los parámetros (algo que parece bastante necesario en QGIS vista la resolución tan pobre por defecto).

      Eliminar
  2. La resolucion dependerá de lo separadas que estén las curvas de nivel. Resolucion de 4 m. significa un paso de malla de 4 m., no? Si tienes curvas cada 50 m. ya me dirás como vas a consegir una resolucion de 4m. en el espacio entre esas dos lineas. O no?

    ResponderEliminar
    Respuestas
    1. A ver, básicamente estoy de acuerdo, pero... 1.Las cuervas de nivel de la BTN25 son cada 10 metros no cada 50. 2.Entiendo y comprendo que este no debe ser un proceso 100% real. Estará hecho en base a complicados algoritmos y triangulaciones mediante las que el programa presume que puede conseguir determinada resolución con bastante realismo, y 3. supongo que evidentemente el programa genera un relieve más o menos uniforme, de forma que si entre dos curvas de nivel hay un agujero de x metros de profundidad será imposible para esta fórmula reflejarlo.

      Eliminar
    2. Lo primero que hay que tener en cuenta, es que el IGN, no genera los MDT a partir de las curvas de nivel (por logica, asi lo creo). Si no al contrario, generarara las curvas a partir del MDT, como tambien parece logico.
      En el MDT original, la malla generada se adapta al terreno, en el cual no existen lineas, por lo que cada azulejo tiene su altura pendiente y orientacion.
      En cambio al generar las curvas de nivel, estos datos, forzosamente (creo), sufriran al menos un cambio. Si las curvas de nivel son, por ejemplo, cada 50m, elaboradas a partir de un MDT05, se supone que entre lineas hay 10 pasos de malla que habran sufrido algun cambio al generar las lineas.
      No se si me he explicado bien ò si me entendeis.

      Eliminar
    3. Para mi el resumen es más o menos claro. Cualquier MDT necesita para hacerse una colección de puntos con altura. A mayor cantidad de puntos por zona mayor definición del MDT, ya que el software tiene que hacer más moldeados del modelo. Obviamente no van a dar el mismo paso de malla unas curvas cada 10 metros que una nube de puntos LIDAR, pero el resultado desde curvas de nivel (que no son más que unos puntos representados como líneas) me parece de lo más válido y aceptable, a no ser que estemos hablando entre profesionales y pretendamos que en nuestro MDT salga esa grieta de 3 metros que yo se que está entre estas dos curvas, y no sale!! Jaja...

      Eliminar
  3. Es que el concepto de resolución aplicado a un dem generado a partir se curvas de nivel no tiene sentido. A ver si me explico... Si p.e. tengo un dem con paso de malla de 5 y a partir de él genero unas curvas, estoy añadiendo un montón de información "falsa". Si le quiero dar la vuelta al proceso y volver al dem, o hago magia o no podré mejorar la resolución real del dem primitivo, entendiendo por resolución la malla de alturas reales. Otra cosa es que el programa te haga una malla de 4 metros poniendo alturas "no reales" calculadas por interpolacion

    ResponderEliminar
    Respuestas
    1. Estamos de acuerdo. Sacar unos pocos puntos desde muchos reales es realista y fiable. Sacar muchos puntos desde unos pocos reales se llama interpolación y es fruto de fórmulas, no de datos reales. Saludos!

      Eliminar
    2. Me ha quedado claro , pregunta sin fundamento me había salido :). Gracias. Ya "perdemos resolucion" al crear las curvas de nivel a partir de un mdt. Yo hace años si que lo hacía así, para los programas que había de 3d de paisajes me creaba el mdt a partir de colorear tramos entre curvas de nivel a escala de grises, blanco punto mas elevado y negro punto mas bajo. Ya que para usuarios no profesionales del GIS esos datos eran inalcanzables, igual ni existían. :)

      Eliminar
  4. Estimado,
    Me gustariá saber como puedo realizar un 3D, a partir de datos LiDAR y un shp en QGIS.
    Saludos Cordiales

    ResponderEliminar
  5. Buenas,

    Estoy intentando realizar este mismo proceso con la versión 2.16.3 de Qgis, pero con el shape de lineas no se logra desplegar los campos en el "atributo de interpolación " para seleccionar el campo que contiene el valor de las curvas de nivel, no así cuando trabajo con los shape de puntos o de polígono, con los cuales puedo desplegar los campos y realizar el proceso.
    Saben si se realizó algún cambio a este complemento o hay otro complemento que pueda utilizar para esto?

    De antemano, gracias.

    ResponderEliminar
  6. Muchas gracias. Una pregunta: siempre se escoge la opción de tipo "puntos" y se activa la opción "usar coordenadas z para interpolación"?....

    ResponderEliminar