Cómo Calcular Curvas de Nivel desde LiDAR en QGIS: Guía de Ingeniería 3D para CAD
Guía completa y técnica para transformar nubes de puntos LiDAR (.LAS/.LAZ) en curvas de nivel 3D reales para AutoCAD y Civil 3D, utilizando el núcl...
Read article →Metodología nativa de bajo nivel para procesar nubes de puntos de alta resolución en QGIS sin depender de licencias de terceros o software obsoleto.
Respuesta Rápida de Ingeniería: Para calcular curvas de nivel desde LiDAR en QGIS de forma nativa, no se puede aplicar el algoritmo de contornos directamente sobre la nube de puntos. El flujo técnico exige de forma estricta: 1) Clasificar y filtrar la nube aislando la Clase 2 (Suelo) mediante el algoritmo PDAL SMRF; 2) Rasterizar los puntos filtrados usando triangulación de Delaunay para generar un Modelo Digital del Terreno (MDT) continuo; y 3) Ejecutar gdal_contour forzando geometría tridimensional LineStringZ para evitar que AutoCAD colapse las polilíneas en cota cero.
La consolidación del núcleo de procesamiento de nubes de puntos en QGIS se fundamenta en la integración nativa de la biblioteca Point Data Abstraction Library (PDAL). A través del motor de ejecución binario pdal_wrench, QGIS proporciona un entorno de procesamiento multiproceso que realiza el análisis, filtrado y transformación de datos LiDAR directamente sobre archivos binarios .las y .laz. Esta arquitectura elimina por completo la dependencia histórica de herramientas propietarias o complementos externos con restricciones de licenciamiento, como LAStools.
Dentro de la Caja de Herramientas de Procesos de QGIS, el grupo de algoritmos de "Nubes de puntos" (Point clouds) se compone de tres familias fundamentales de herramientas nativas: Conversión de Nubes de Puntos (Point Cloud Conversion), Gestión de Datos de Nubes de Puntos (Point Cloud Data Management) y Extracción de Nubes de Puntos (Point Cloud Extraction). La equivalencia funcional directa con respecto a las herramientas clásicas se detalla en la siguiente matriz de correspondencia técnica:
| Función en LAStools | Algoritmo nativo en QGIS | Identificador técnico (ID) | Mecanismo y Procesamiento Interno |
|---|---|---|---|
lasground / lasground_new |
Clasificar terreno (SMRF) | pdal:classifyground |
Implementa el Filtro Morfológico Simple (Simple Morphological Filter - SMRF) para segmentar el suelo basándose en pendientes y diferencias de elevación relativas. |
las2dem / blast2dem (IDW) |
Exportar a ráster | pdal:exportraster |
Rasteriza variables de la nube utilizando una interpolación ponderada por el Inverso de la Distancia al Cuadrado (IDW) sobre la vecindad de cada celda. |
las2dem / blast2dem (TIN) |
Exportar a ráster (triangulación) | pdal:exportrastertin |
Genera una Red de Triángulos Irregulares (TIN) mediante triangulación de Delaunay y proyecta de forma lineal las facetas tridimensionales al plano del píxel. |
laslas / lasclip |
Filtrar / Recortar | pdal:filter / pdal:clip |
Ejecuta consultas lógicas en base a atributos lógicos o recorta la extensión espacial mediante geometrías poligonales de máscara. |
lasmerge |
Combinar | pdal:merge |
Fusiona múltiples archivos de entrada consolidando sus tablas de puntos y unificando los parámetros de las cabeceras. |
Para aislar el terreno natural, el algoritmo nativo pdal:classifyground aplica el filtro SMRF, el cual requiere una parametrización geométrica precisa para evitar la omisión de relieve real o la inclusión de vegetación baja. Las variables críticas del algoritmo se definen a continuación:
CELL_SIZE (Tamaño de celda de rejilla): Tipo de dato doble (m). Determina la resolución espacial de la cuadrícula de análisis morfológico inicial. Valores excesivamente bajos incrementan el ruido en el modelo, mientras que valores muy altos omiten variaciones topográficas locales.SCALAR (Escalar): Tipo de dato doble. Factor de multiplicación para pendientes pronunciadas. Actúa como un umbral para terrenos rugosos o montañosos, donde se requiere un valor más elevado para evitar que pendientes reales sean clasificadas erróneamente como objetos sobre el suelo.SLOPE (Pendiente): Tipo de dato doble (m/m). Umbral de pendiente máxima tolerable para clasificar puntos como suelo continuo. Debe configurarse con valores altos en relieves abruptos.THRESHOLD (Umbral): Tipo de dato doble (m). Altura máxima permitida para que un punto se considere parte de la superficie del suelo de referencia estimada.WINDOW_SIZE (Tamaño de ventana): Tipo de dato doble (m). Diámetro de búsqueda del filtro de apertura morfológica que discrimina objetos grandes (como naves industriales o coberturas forestales densas) del suelo continuo.
Una vez clasificado el terreno, el algoritmo nativo para filtrar y exportar los puntos de suelo a un Modelo Digital del Terreno (MDT) en formato ráster es pdal:exportraster. Su sintaxis interna y la parametrización de sus variables clave se estructuran de la siguiente manera:
INPUT: Capa de nube de puntos de entrada (archivo .las, .laz o índice virtual .vpc).ATTRIBUTE: Dimensión de la nube a extraer, definida como Z para procesar cotas de elevación.RESOLUTION: Dimensión lineal del píxel del ráster de salida (m).TILE_SIZE: Tamaño de la tesela para el procesamiento paralelo en la CPU (por defecto, 1000 metros).FILTER_EXPRESSION: Expresión lógica nativa de PDAL para filtrar los puntos de entrada. Para aislar de forma estricta los puntos clasificados como terreno, se define el siguiente parámetro sintáctico:
La carga y gestión de archivos masivos se realiza mediante la indexación espacial automática basada en el formato Cloud Optimized Point Cloud (COPC). Al cargar un archivo binario .las o .laz convencional, QGIS ejecuta un subproceso de lectura y reestructuración para generar una jerarquía de árbol octogonal (octree) que permite el acceso indexado bajo demanda. Si el archivo carece de índice, se genera una estructura Entwine Point Tile (ept_...) o un archivo .copc.laz adyacente que evita la lectura secuencial completa del archivo binario.
La estabilidad del sistema durante la visualización y análisis de datos masivos se regula mediante la gestión del "Presupuesto de puntos" (Point budget). El límite de estabilidad de renderizado en memoria RAM por defecto está parametrizado en un millón de puntos ($1.0 \times 10^6\text{ pts}$) para la visualización en el lienzo de trabajo. El motor de ejecución nativo evita el colapso del sistema administrando la densidad de visualización según el nivel de detalle (LoD) requerido por la escala del mapa, mientras que las tareas de procesamiento pesado mediante pdal_wrench se ejecutan por bloques espaciales (teselas) independientes con buffers de solape (collars) para mantener constante el consumo de recursos físicos.
La determinación de la resolución espacial óptima del píxel (tamaño de celda en metros) para un Modelo Digital del Terreno (MDT) derivado de LiDAR se basa en directrices técnicas estandarizadas de agencias cartográficas líderes, como el Servicio Geológico de los Estados Unidos (USGS) en sus especificaciones para el programa 3DEP, y el Instituto Geográfico Nacional (IGN) de España en el marco del proyecto PNOA-LiDAR.
El criterio de muestreo de Nyquist-Shannon adaptado a cartografía digital establece que para representar fielmente un terreno sin introducir distorsiones por submuestreo o redundancia estructural, el tamaño de celda teórica del ráster de salida ($G$, en metros) debe determinarse a partir del espaciamiento nominal de impulsos de la nube de puntos ($S$, en metros). El espaciamiento nominal de impulsos se relaciona directamente con la densidad nominal de puntos por metro cuadrado ($D$, en $\text{pt/m}^2$) mediante la expresión:
Para garantizar la estabilidad geométrica y la continuidad topográfica del MDT, evitando la generación de artefactos, el estándar de rasterización óptima se define mediante la aplicación de un factor multiplicador de escala sobre el espaciamiento nominal de impulsos:
La siguiente matriz detalla las equivalencias de resolución y densidad según las especificaciones técnicas del USGS y del IGN de España:
| Organismo / Especificación | Nivel de Calidad / Cobertura | Densidad de Puntos ($D$, $\text{pt/m}^2$) | Espaciamiento Nominal ($S$, m) | Resolución Óptima MDT ($G$, m) | Justificación Estructural del Relieve |
|---|---|---|---|---|---|
| USGS 3DEP | Quality Level 0 (QL0) | $\ge 8.0$ | $\le 0.35$ | 0.5 | Máxima definición estructural. Permite capturar elementos microtopográficos finos y discontinuidades lineales. |
| USGS 3DEP | Quality Level 1 (QL1) | $\ge 8.0$ | $\le 0.35$ | 0.5 | Alta densidad equivalente a QL0, orientada a proyectos de ingeniería con menor restricción de calibración vertical global. |
| USGS 3DEP | Quality Level 2 (QL2) | $\ge 2.0$ | $\le 0.71$ | 1.0 | Resolución estándar recomendada para estudios de inundabilidad, modelado hidrológico y obras lineales. |
| USGS 3DEP | Quality Level 3 (QL3) | $\ge 0.5$ | $\le 1.41$ | 2.0 | Orientado a análisis de escala regional, caracterizaciones forestales amplias y geomorfología regional. |
| IGN España | PNOA Cobertura I (2009-2015) | $0.5$ | 1.41 | 5.0 | Nube de baja densidad. Forzar celdas menores a 5 m introduce artefactos sistemáticos por interpolación vacía. |
| IGN España | PNOA Cobertura II (2015-2021) | 0.5 a 4.0 | 1.41 a 0.50 | 2.0 | Transición tecnológica. El MDT de 2 m equilibra la representación de laderas y valles bajo cubiertas forestales. |
| IGN España | PNOA Cobertura III (2021-2025) | 5.0 | 0.45 | 1.0 (u óptimo 0.5) | Captura de alta densidad homogénea. Permite el desarrollo de modelos digitales de alta resolución en zonas forestales. |
El proceso de clasificación de la nube de puntos genera áreas vacías de datos de suelo (clase 2) en zonas donde la vegetación densa absorbe o intercepta la señal del pulso láser, impidiendo retornos en la superficie terrestre. La elección del método de interpolación matemática para rellenar estas lagunas espaciales determina la calidad final del relieve:
La interpolación por Inverso de la Distancia al Cuadrado (IDW) estima el valor de elevación de cada celda de origen desconocido basándose en un promedio ponderado de los valores de los puntos circundantes, donde el peso disminuye exponencialmente con la distancia ($w_i = d_i^{-p}$). En coberturas boscosas densas donde los puntos de suelo válidos están sumamente aislados y dispersos, IDW genera el efecto "ojo de buey" (bull's eye). Este artefacto topográfico se caracteriza por la aparición de depresiones o sobreelevaciones artificiales concéntricas y circulares alrededor de los puntos aislados, alterando la morfología real del terreno. Además, si la densidad local disminuye por debajo del umbral de puntos mínimos definidos dentro del radio de búsqueda del algoritmo, IDW genera celdas con valores NoData (píxeles vacíos), interrumpiendo la continuidad matemática del MDT.
Por el contrario, la interpolación basada en Triangulación (TIN) construye en primera instancia una superficie continua tridimensional compuesta por caras triangulares planas empleando la triangulación de Delaunay sobre todos los puntos clasificados como suelo. Al rasterizar esta malla continua para generar el MDT, la elevación de cada píxel intermedio se deduce mediante una interpolación lineal simple basada en la posición planar exacta del centro del píxel dentro de su faceta triangular correspondiente. Este procedimiento asegura que los vacíos de información geométrica generados por el filtrado de vegetación densa queden cubiertos por facetas inclinadas continuas, eliminando por completo la formación de "píxeles vacíos" (NoData) y el efecto "ojo de buey". El relieve resultante mantiene la coherencia geométrica de las pendientes, lo que resulta indispensable para un trazado limpio y homogéneo de las curvas de nivel vectoriales.
La extracción de curvas de nivel propiamente dicha a partir de nuestro Modelo Digital del Terreno (MDT) se efectúa de manera óptima utilizando el backend GDAL integrado. Este proceso lee los valores de elevación del archivo ráster de entrada y genera líneas que conectan píxeles con la misma cota de forma continua.
Para configurar de forma correcta la extracción de curvas, se debe acceder al menú superior de QGIS y ejecutar el algoritmo de GDAL a través de la ruta: Ráster ➜ Extracción ➜ Curvas de nivel.... En la interfaz del algoritmo gdal_contour, se deben parametrizar las siguientes variables esenciales:
.tif generado en el paso anterior mediante interpolación TIN (pdal:exportrastertin).ELEV o ELEVATION. Este campo de tipo flotante en la tabla de atributos de salida almacenará la cota numérica extraída.Al exportar un archivo de curvas de nivel desde un entorno SIG a un archivo DXF/DWG, es común que AutoCAD interprete las polilíneas como elementos bidimensionales planos en cota cero ($Z=0$), a pesar de que la tabla de atributos asociada contenga el valor correcto de altitud.
La causa raíz exacta de este comportamiento reside en el tipo de entidad vectorial empleada en la conversión. Por defecto, QGIS exporta las geometrías lineales planas (tipo de objeto LineString) mapeándolas en el formato DXF como entidades de tipo LWPOLYLINE (Lightweight Polyline). La especificación técnica de la entidad LWPOLYLINE está optimizada para el dibujo bidimensional eficiente y no admite valores de coordenada $Z$ independientes en cada vértice. En su lugar, almacena un único valor de elevación uniforme para toda la entidad en el código de grupo DXF 38. Si la geometría de la polilínea en QGIS carece de componentes tridimensionales reales en sus vértices (es decir, si la geometría es puramente 2D), el motor de exportación de vectores no genera el registro para el código de grupo 38 en el archivo DXF, provocando que AutoCAD sitúe la polilínea en su plano por defecto de elevación cero ($Z=0$).
Por el contrario, para que AutoCAD reconozca curvas de nivel con elevaciones variables en cada vértice utilizando entidades tridimensionales de tipo 3DPOLYLINE, los datos de elevación deben estar inyectados en los códigos de grupo de vértice DXF 10 (coordenada $X$), 20 (coordenada $Y$) y 30 (coordenada $Z$), lo cual requiere de forma estricta que la geometría origen en QGIS sea de tipo tridimensional LineStringZ.
Se accede al menú superior de QGIS y se ejecuta el algoritmo de extracción de GDAL a través de la ruta: Ráster ➜ Extracción ➜ Curvas de nivel.... En la interfaz del algoritmo gdal_contour, se configuran las siguientes variables de trabajo:
.tif derivado de la triangulación de la nube de puntos (pdal:exportrastertin).ELEV o ELEVATION. Este campo de la tabla de atributos almacenará el valor numérico flotante de la cota extraída de cada píxel de origen.
Para transformar las curvas de nivel vectoriales planas de 2D a polilíneas 3D reales, abre la Caja de Herramientas de Procesos de QGIS y localiza el algoritmo: Geometría vectorial ➜ Establecer valor Z (ID técnico: native:setzvalue). Ajusta las variables bajo las siguientes directrices técnicas:
LineString a LineStringZ.Bajo ninguna circunstancia se deben exportar curvas de nivel en un Sistema de Coordenadas Geográficas (grados decimales como el elipsoide WGS 84 / EPSG:4326). AutoCAD interpreta las unidades angulares de longitud y latitud del archivo de intercambio como unidades métricas planas, lo que compactará todo tu proyecto a una escala microscópica concentrada en las cercanías inmediatas del origen físico $(0,0)$.
Para solventar esto, se debe aplicar el algoritmo: Vectorial ➜ Herramientas de gestión de datos ➜ Reproyectar capa. Elige un Sistema de Referencia de Coordenadas Proyectado (PCS) métrico de tipo UTM adecuado para la cuadrícula geográfica del proyecto (p. ej., EPSG:25830 - ETRS89 / UTM zone 30N para España peninsular).
Puedes automatizar este proceso de conversión geométrica mediante la consola de comandos de Python de QGIS ejecutando la siguiente lógica de reproyección sistemática:
Para consolidar el archivo final de intercambio sin pérdida de datos en la coordenada Z, utiliza la herramienta nativa del sistema accediendo a: Proyecto ➜ Importar/Exportar ➜ Exportar proyecto a DXF.... En el diálogo de configuración, se deben definir exactamente los siguientes parámetros:
.dxf.LineStringZ.Al abrir el archivo resultante en AutoCAD, Civil 3D o MicroStation, cada polilínea conservará su posición 3D real, permitiendo su uso inmediato en el modelado de superficies del terreno y cálculos de movimiento de tierras.
¿No dispones de un archivo LiDAR optimizado para validar este flujo de procesamiento técnico? Descarga nuestro paquete de práctica de libre uso:
Durante el procesamiento masivo de datos geoespaciales se reportan de forma repetida incidencias derivadas de los límites estructurales de formatos y hilos de procesamiento. Mapeamos las tres incidencias principales de los foros de soporte técnico en 2026:
Síntoma: Al intentar cargar un archivo binario .las o .laz de alta densidad (especialmente archivos generados bajo la especificación ASPRS LAS 1.4 con formatos de punto del 6 al 10) en la interfaz de QGIS, el proceso se detiene de forma abrupta a mitad de carga mostrando la alerta de error: readers.las Error: Global encoding WKT flag not set for point format 6 - 10. Al intentar forzar la carga mediante el motor de indexación, el sistema colapsa devolviendo el mensaje: Untwine error: Can't infer reader for [archivo].
Causa Raíz: La especificación técnica del formato LAS 1.4 establece de manera obligatoria que cualquier archivo que emplee formatos de registro de puntos superiores al 5 debe codificar su Sistema de Referencia de Coordenadas (CRS) utilizando de forma estricta la sintaxis Well-Known Text (WKT). Para validar la presencia de este CRS en WKT, la especificación exige que el encabezado del archivo tenga activo el bit de codificación global número 4 (Global Encoding Bit 4). Cuando el software de captura o conversión que generó el archivo LiDAR escribe el CRS en formato WKT pero omite activar físicamente este bit de control en los bytes de la cabecera binaria, la biblioteca PDAL rechaza la lectura al detectar una inconsistencia estructural en los formatos de puntos 6 a 10, interrumpiendo el flujo del indexador espacial untwine en QGIS.
Solución Técnica: Reescribe la cabecera de metadatos utilizando la consola integrada de PDAL con la siguiente instrucción de traducción de bajo nivel:
Síntoma: QGIS se cierra repentina e inesperadamente al generar perfiles longitudinales de elevación o al procesar con pdal_wrench, arrojando mensajes en la consola del sistema operativo como: terminate called after throwing an instance of 'pdal::pdal_error' what(): writers.raster: Unable to read band/block information... o fallos de dirección de memoria en entornos Windows: Crash in pdalcpp.dll / segfault at qgsabstractprofilesurfacegenerator.cpp:157.
Causa Raíz: En el caso de la herramienta de Perfiles de Elevación de QGIS, el fallo de segmentación se produce cuando la función interna interpolatePoint (ubicada en el archivo fuente de C++ src/core/elevation/qgsabstractprofilesurfacegenerator.cpp) calcula una intersección de cota nula o un valor de elevación inexistente sobre líneas vectoriales de referencia desprovistas de información altimétrica. Al no estar interceptado este valor de retorno, la función devuelve un puntero nulo (nullptr), y el motor intenta evaluar inmediatamente la condición point->is3D(), provocando una violación de acceso de memoria del sistema que colapsa la aplicación. Por su parte, la biblioteca pdal_wrench arroja excepciones críticas de lectura/escritura de bloques cuando el usuario define directorios locales de trabajo que contienen caracteres especiales, espacios en blanco o tildes (diacríticos) en sus rutas de carpeta, lo que corrompe el mapeo del sistema de archivos de bajo nivel de PDAL.
Solución Técnica: Para corregir el error en el código de origen, la comunidad de OSGeo aplicó un parche de control en las ramas LTR a partir de las versiones 3.40.11 and 3.44.3, el cual evalúa si el puntero es nulo antes de ejecutar la llamada al método de validación 3D:
Para los usuarios que trabajen en versiones afectadas que no puedan actualizarse inmediatamente, se aplican dos soluciones operativas:
/home/usuario/temp_output/ en lugar de /C:/Documentos/MDT_Curvás/).Síntoma: Al abrir el archivo DXF exportado, los vértices están elevados en Z pero la proyección en planta de las curvas se ve comprimida a un punto diminuto de escasas unidades ubicado cerca del origen de coordenadas $(0,0)$.
Causa Raíz: Inconsistencia en la interpretación de unidades en AutoCAD. Se produce al exportar las curvas manteniendo las unidades angulares en grados decimales de una proyección geográfica (EPSG:4326). AutoCAD interpreta estos valores angulares pequeños directamente como metros lineales de dibujo planos, alterando catastróficamente la escala del plano (con amplitudes que oscilan entre -180 y 180 para la longitud, y -90 y 90 para la latitud).
Solución Técnica: Reproyecta siempre el vector en QGIS de forma previa a la exportación a DXF. Puedes automatizar esta conversión métrica ejecutando el script de reproyección UTM desde la consola de Python de QGIS o utilizando el algoritmo "Reproyectar capa" seleccionando un SRC plano como EPSG:25830 (UTM Zona 30N para España bajo datum ETRS89), conservando la escala real 1:1.
Democratizamos el acceso a datos topográficos de alta resolución para investigadores y topógrafos a nivel global.