Modelado de corredores sobre terreno para QGIS: secciones tipo,
TIN, mediciones de tierras, perfiles y planos.
Rafael Vázquez · Claude
Este plugin resuelve un problema concreto: extruir una sección tipo a lo largo de una directriz, cortarla contra el terreno y obtener la superficie resultante, con sus mediciones y sus planos. Es un Civil 3D reducido deliberadamente a eso.
El flujo de trabajo completo es:
1. Defines una o varias secciones tipo en el editor 2. Las aplicas a una capa de líneas (una sección por tramo si quieres) 3. El plugin las corta contra cualquier DEM y teje el TIN 4. Obtienes capas, mediciones de tierras y, si quieres, el terreno fusionado 5. Revisas el resultado en el visor de perfiles 6. Sacas los planos: planta, longitudinal, transversales y cubicaciones 7. Guardas el corredor completo en un archivo para reabrirlo cuando toque
Funciona en QGIS 3.28 y posteriores, incluida la serie 4.x.
Ejecuta instalar.bat desde la carpeta del proyecto. Copia (o
enlaza) el plugin en la carpeta de complementos de todos los perfiles de QGIS que
encuentre. Después, en QGIS: Complementos → Administrar e instalar
complementos → Instalados, y marca AQGIS-Sivil3D.
Desde la versión 1.0.0 el plugin está también en el repositorio oficial de QGIS: Complementos → Administrar e instalar complementos → Todos, se busca «Sivil3D» y se instala. Ya no hace falta activar «Mostrar también los complementos experimentales»: la 1.0.0 sale como versión estable.
instalar.bat
cada vez que cambie el código, y recargar el plugin (el complemento Plugin
Reloader ahorra reiniciar QGIS).La fusión con el terreno necesita scipy, que viene en las
instalaciones estándar de QGIS. Sin él todo lo demás funciona y la fusión avisa
en lugar de fallar.
Una sección no se dibuja: se compone. Cada elemento arranca donde acabó el anterior y produce uno o más vértices. Eso es lo que permite que la misma sección se adapte a un terreno distinto en cada PK.
Sección tipo ├─ eje cota (terreno | Z de la directriz), desnivel, desplazamiento ├─ izquierda ─┬─ fijos[] calzada, arcén, berma, bordillo, cuneta… │ ├─ desmonte[] se aplica si el terreno queda por ENCIMA │ └─ terraplén[] se aplica si queda por DEBAJO └─ derecha ──┘ rama independiente, misma estructura
Las dos ramas son completamente independientes: un talud distinto a cada lado sale gratis, sin nada que configurar.
En cada PK y para cada lado por separado, el plugin mira el punto de
enganche (el último elemento de fijos de ese lado) y compara la
cota de proyecto con la del terreno:
| En el punto de enganche | Grupo que se aplica |
|---|---|
| proyecto por debajo del terreno | desmonte |
| proyecto por encima o igual | terraplén |
Una sección a media ladera sale con un lado en terraplén y el otro en desmonte sin tocar nada.
| Opción | Qué hace | Para qué |
|---|---|---|
| del terreno (DEM) | el eje se apoya exactamente en el DEM | ver qué sale solo con el bombeo de la plataforma, sin excavar ni rellenar en el eje |
| de la Z de la directriz | la cota la lleva la geometría | una rasante ya proyectada, editable vértice a vértice |
| valor constante | la misma cota en todos los PK: plataforma horizontal | una explanada, el vaso de una balsa, una plataforma de acopio, o tantear el movimiento de tierras de una rasante antes de proyectarla |
| offset desde el terreno | rasante paralela al terreno a la distancia indicada: positiva por encima, negativa por debajo | un espesor de tierras constante: la caja de un firme, un camino excavado medio metro, un caballón o una mota |
Las dos últimas se escriben en el campo que hay al lado del desplegable. El desnivel del eje que se define en el editor de secciones se suma en los cuatro casos: con offset −0.30 en el diálogo y desnivel −0.20 en la sección, la rasante queda 0.50 m bajo el terreno.
Junto al campo hay un botón Escribir en la Z de la capa, activo con las dos opciones que llevan valor. Con valor constante pone esa cota en la Z de todos los vértices; con offset desde el terreno hace un drapeado: cada vértice toma la cota del DEM en su posición más el offset. En los dos casos deja seleccionada la opción «de la Z de la directriz». A partir de ahí la rasante vive en la geometría y se puede editar vértice a vértice con las herramientas normales de QGIS: es la forma de arrancar de una plataforma horizontal y luego darle pendientes.
Hay un límite que no se puede sortear: el tipo de geometría lo fija el proveedor de la capa. De ahí dos comportamientos:
| Si la capa… | Qué ocurre |
|---|---|
ya admite Z (LineStringZ) | se edita en el sitio: la Z que tuviera se reemplaza y los cambios quedan guardados |
es 2D (LineString) | no se toca —su proveedor descartaría la Z al guardar— y se crea una capa nueva con los mismos campos y atributos, con la Z puesta, que queda seleccionada como directriz |
Con «solo los features seleccionados» marcado, la cota se escribe únicamente en esos. El diálogo avisa antes de tocar nada, y en el registro queda escrito cuántos features se han modificado.
En el drapeado, si el DEM no tiene datos en algún vértice de una directriz, esa directriz se deja sin tocar y se avisa: es mejor que meterle una cota inventada.
El valor constante es el atajo para una plataforma horizontal —una explanada, el vaso de una balsa, una plataforma de acopio— y también para tantear cuánto movimiento de tierras costaría una rasante antes de tenerla proyectada: se pone una cota, se calcula y se lee el volumen. El desnivel del eje se suma en los tres casos, así que con cota constante 250 y desnivel −0.5 la rasante queda a 249.50.
Cada elemento produce vértices con un código
(CALZADA, TALUD_DAY…), al que se añade el prefijo
I_ o D_ según el lado. Los códigos sirven para tres
cosas:
TALUD en los dos grupos condicionales es lo deseable, y por eso
la validación no lo marca como duplicado.El vértice donde el talud corta el terreno lleva siempre el sufijo
_DAY, sea cual sea el elemento que lo generó, para que la línea de
daylight sea continua.
Vector → AQGIS-Sivil3D → Editor de secciones tipo…
A la izquierda, la librería de secciones. En el centro, las dos ramas con sus tres grupos y los botones de orden. A la derecha, los parámetros del elemento seleccionado. Abajo, la sección resuelta sobre una ladera de prueba.
Los elementos se resuelven en el orden en que están, así que Subir y Bajar cambian el resultado. Los botones son:
| Botón | Qué hace |
|---|---|
| Añadir | menú con los elementos válidos para cada grupo; se inserta detrás del seleccionado |
| Duplicar | copia el elemento seleccionado justo detrás |
| Quitar | elimina el seleccionado |
| Subir / Bajar | mueve el elemento una posición en la cadena |
| copiar al otro lado | sobrescribe la rama opuesta con esta; para secciones simétricas |
La ladera de prueba es configurable y es la forma rápida de comprobar que el talud engancha y que la banqueta cabe, sin necesidad de DEM ni de directriz:
| Control | Para qué |
|---|---|
| terreno (%) | pendiente transversal del terreno de prueba; con un valor alto se ve el caso de media ladera |
| terreno en eje (m) | cota del terreno respecto a la rasante. Positivo = terreno por encima = desmonte en los dos lados |
| exag. Z | exageración vertical del dibujo |
| ancho máx | semiancho máximo de búsqueda del terreno |
| códigos | muestra u oculta las etiquetas de los vértices |
Colores: marrón el terreno, azul el proyecto, ocre el desmonte, verde el terraplén. Un círculo verde es un punto de daylight; un círculo rojo, un talud truncado que no llegó a cortar.
La librería es un archivo JSON que vive en el perfil de usuario
(<perfil QGIS>/aqgis_sivil3d/secciones.json), así que no se
pierde al actualizar el plugin. Se puede importar y exportar para
compartirla.
| Sección | Qué es |
|---|---|
| Carretera 1+1 | calzada, arcén y berma, con cuneta en desmonte y talud en terraplén |
| Camino 5 m | un camino sencillo con cuneta a los dos lados |
| Plataforma en ladera (banqueada) | desmonte con bermas, para media ladera |
| Plataforma según campos | anchos y taludes leídos de la capa: una sección distinta por feature |
| Zanja 2 m | fondo de cota impuesta y cajeros, para una zanja o un canal |
| Presa de hormigón de gravedad | el perfil triangular de siempre: paramento de aguas arriba 0,15H:1V y de aguas abajo 0,75H:1V |
| Presa de escollera con pantalla | talud de aguas arriba 1,25H:1V —el de la pantalla— y espaldón 1,4H:1V con bermas de 5 m cada 15 m de altura |
| Presa de materiales sueltos | taludes 2,5H:1V a los dos lados, con bermas en el espaldón de aguas abajo |
| Pantalla de hormigón | paramentos verticales; arranque para un muro o una pantalla |
Las nueve están ya en la librería al abrirla por primera vez. El paquete
completo viaja además dentro del plugin, en
docs/secciones_pack.json, por si hace falta reimportarlo.
El cuerpo de una presa se levanta desde el terreno hasta la coronación, así que va entero en el grupo de terraplén: el talud arranca en el borde de coronación y baja hasta encontrar el valle. El grupo de desmonte entra solo donde el terreno queda por encima de la coronación, es decir, en los estribos.
Dos cosas se hacen distinto que en una carretera:
Y para el vaso, la herramienta de curva de embalse (ver 13) da la relación cota-volumen-superficie a partir del DEM.
La franja inferior avisa de los problemas que se pueden detectar sin terreno:
| Aviso | Qué significa |
|---|---|
| códigos repetidos | dos elementos que pueden coincidir en la misma sección resuelta tienen el mismo código; el mallado no sabrá emparejarlos |
| grupo vacío | un lado tiene desmonte pero no terraplén (o al revés): en los PK donde toque el grupo vacío, la superficie quedará abierta |
| no busca el terreno | el grupo condicional no acaba en un talud que enganche |
| no es el último | hay elementos detrás del que busca el terreno; se ignorarán |
| Elemento | Qué hace | Parámetros | Grupos |
|---|---|---|---|
offset_pendiente | avanza un ancho con una pendiente | ancho, pendiente (%) | todos |
offset_cota | avanza un ancho hasta un desnivel o una cota absoluta | ancho, modo, valor | todos |
vertical | sube o baja sin avanzar: bordillo, muro, escalón | desnivel | todos |
cuneta | cuneta triangular o trapecial (2 o 3 vértices) | profundidad, ancho de fondo, taludes interior y exterior, desnivel de salida | todos |
talud_daylight | talud continuo hasta cortar el terreno; sube en desmonte y baja en terraplén | talud, altura máxima | desmonte, terraplén |
talud_banqueta | repite talud + banqueta hasta cortar el terreno | talud, altura y ancho de banqueta, pendiente de banqueta, máximo de banquetas, talud de la 2.ª y siguientes | desmonte, terraplén |
Los dos últimos buscan el terreno y por construcción van al final de la
cadena. Con talud_banqueta, el número de banquetas lo decide el
terreno en cada PK, no tú.
| Tipo | Cómo se escribe |
|---|---|
| longitudes | metros: 3.5 o 3,5 (vale la coma) |
| pendientes | en % con signo: -2, -2%. Positivo = sube al alejarse del eje, así que un bombeo del -2% baja hacia fuera en los dos lados |
| taludes | V:H, la notación de siempre: 1:1.5 es tendido, 1:0.5 escarpado. También valen 66% y un número desnudo (1.5 = 1:1.5) |
| talud opcional | vacío o 0 significa «hereda el del elemento anterior» |
Cualquier parámetro admite además dos formas que se resuelven una vez por feature de la directriz:
| Forma | Ejemplo | Cuándo |
|---|---|---|
| referencia a campo | @ancho | un valor por tramo, leído de la capa de directrices |
| expresión QGIS | =if("roca" = 1, '1:0.5', '1:1.5') | lógica por tramo |
En el editor, la casilla de valores de prueba permite previsualizar una
sección con parámetros dinámicos: ancho=7, talud_desmonte=1:1. Lo que
no se indique usa el valor por defecto del parámetro.
Vector → AQGIS-Sivil3D → Extruir sección tipo (corredor)…
| Campo | Qué es |
|---|---|
| Directrices | capa de líneas. Cada feature es un corredor independiente, y cada parte de una multilínea también |
| solo los seleccionados | procesa únicamente los features seleccionados |
| Terreno (DEM) | cualquier ráster que lea GDAL (GeoTIFF, ASC, IMG, DEM, HGT, VRT…) o una capa de malla. Puede estar en otro sistema de referencia: se transforma |
| Librería de secciones | archivo JSON; el botón abre el editor |
| Campo con la sección | columna de texto cuyo valor es el nombre exacto de la sección que se aplica a ese tramo. Vacío = sección por defecto |
| Sección por defecto | la que se usa cuando no hay campo o viene vacío |
| Cota del eje | cuatro opciones, ver 6.2.0 |
| Opción | Qué hace |
|---|---|
| Paso entre PK | separación de las secciones a lo largo del eje |
| PK en cada vértice | déjalo activado. En un vértice la sección se coloca según la bisectriz del ángulo; sin PK ahí, la malla se abre por fuera de la curva |
| PK inicial | valor de PK del principio de cada tramo |
| Intervalo de PK rotulados | cada cuánto se rotulan los PK (100 m por defecto). Es independiente del paso de cálculo: puedes calcular cada 5 m y rotular cada 100. Con 0 no se crea la capa de PK |
| Paso de muestreo | cada cuánto se consulta el DEM al buscar el corte. 0 = automático según la resolución |
| Semiancho máximo | distancia máxima a la que se busca el terreno. Si un talud no corta dentro, se marca como truncado |
Muestreo del DEM. Se interpola bilinealmente entre los centros de los cuatro píxeles vecinos, no se toma el valor del píxel. Con valores de píxel, la búsqueda del corte da saltos y la línea de daylight sale con dientes de sierra. La lectura va por teselas con caché, porque cada bisección son unas 40 muestras.
Curvas cerradas. Por el interior de una curva las normales convergen y a partir de cierta distancia al eje las secciones contiguas se cruzan. El plugin calcula esa distancia por PK y avisa si el ancho de la sección la supera: reduce el paso entre PK o suaviza la directriz. No lo corrige solo.
NoData. Si el eje cae en NoData, la sección se descarta. Si es el talud el que entra en NoData, se avisa y se trunca.
Con la opción activada, el TIN de salida incluye también el terreno original alrededor del corredor, cosido a la línea de daylight, de modo que se obtiene una sola superficie continua.
Cómo funciona: se muestrea el terreno en una rejilla, se descartan los nodos que caen dentro de la huella del corredor (y los demasiado próximos al borde, que solo darían triángulos aguja), se añade la huella densificada con las cotas del corredor —esos son los nodos de la costura— y se triangula. Después se tiran los triángulos cuyo centroide cae dentro de la huella.
| Opción | Qué hace |
|---|---|
| Celda del terreno | paso de la rejilla. 0 = la resolución del DEM |
| Margen alrededor | cuánto terreno se incluye más allá de la huella |
Si la celda pedida daría una rejilla inmanejable, se agranda y se avisa, en vez de agotar la memoria. El resultado no tiene huecos ni solapes: en los tests, la suma de áreas de los triángulos coincide con el rectángulo completo.
Todas salen dentro de un grupo llamado
<alineación>-corredor, ordenadas para dibujar y con simbología
aplicada. Cada cálculo crea un grupo nuevo (… (2), (3)…)
para poder comparar alternativas.
| Capa | Geometría | Contenido |
|---|---|---|
| PK | PointZ | PK redondos con P.K. (1+250), distance y angle; etiqueta girada y separada del eje |
| puntos | PointZ | todos los vértices, con código, offset y cota |
| líneas características | LineStringZ | una por código, más DAYLIGHT_IZQ y DAYLIGHT_DER |
| secciones | LineStringZ | una por PK: modo de cada lado, anchos, cota roja, áreas de desmonte y terraplén, avisos |
| eje | LineStringZ | el eje con símbolo de carretera: la línea sobre la que se rotulan los PK |
| huella | PolygonZ | contorno en planta de cada tramo |
| TIN | PolygonZ | un polígono por triángulo, con zona, espesor, área, cotas y pendiente en % |
| mediciones | tabla | volúmenes de tierras entre secciones |
| Malla 2DM | archivo .2dm | se carga como capa de malla nativa: curvas de nivel, vista 3D, cálculos de malla |
El TIN sale categorizado por el campo zona:
| zona | Color | Qué es |
|---|---|---|
desmonte | ocre | el proyecto va por debajo del terreno: hay que excavar |
terraplen | verde | el proyecto va por encima: hay que rellenar |
a cota | gris | franja junto al daylight, prácticamente sobre el terreno |
terreno natural | tostado | terreno sin tocar, en la malla fusionada |
La clasificación se hace triángulo a triángulo comparando su cota media con la
del terreno bajo su centroide. El campo espesor guarda el desnivel con
signo (negativo excava, positivo rellena), así que también se puede graduar el
color por espesor de tierras. Son los mismos colores que la previsualización del
editor.
Las áreas de desmonte y terraplén de cada sección se obtienen integrando entre la línea de proyecto y la del terreno, partiendo por los cruces: no es una estimación, es el área exacta de los polígonos que se ven sombreados.
Los volúmenes van por áreas medias:
V = (A1 + A2) / 2 · L
que es la convención de proyecto y la que hay que usar si los números tienen que cuadrar con una medición hecha a mano. Hay también método prismatoide, que amortigua el sesgo en el paso de desmonte a terraplén, donde una de las dos áreas es cero.
El diagrama de masas es el volumen neto acumulado, con coeficiente de esponjamiento configurable: 1.0 significa que un metro cúbico excavado rellena un metro cúbico; 0.9, que solo se aprovecha el 90 %.
La medición sale en dos sitios: la capa secciones lleva
cota_roja, area_des y area_ter por PK, y la
tabla mediciones lleva, por cada tramo entre secciones consecutivas, las
áreas, los volúmenes de desmonte y terraplén, el neto y el acumulado.
Vector → AQGIS-Sivil3D → Perfiles del corredor
Panel acoplable con tres vistas del corredor calculado:
| Vista | Qué muestra |
|---|---|
| Perfil longitudinal | rasante contra terreno a lo largo del eje, con desmonte y terraplén sombreados y los PK marcados |
| Sección en el PK actual | la sección transversal con sus códigos, su cota roja y sus áreas |
| Diagrama de masas | volumen neto acumulado |
| Control | Qué hace |
|---|---|
| Alineaciones | lista con casilla de todas las alineaciones de todos los corredores de la sesión: se marcan las que se quieren ver a la vez. Ver 10.2 |
| ◀ PK ▶ | navega por los PK; el desplegable permite saltar a uno concreto |
| exag. long. | exageración vertical del longitudinal. Sin ella la rasante sería una raya horizontal |
| códigos | etiquetas de los vértices en la sección |
| pinchar en el mapa | activa una herramienta que salta al PK más cercano al punto pinchado |
| Exportar… | guarda la vista actual como PNG |
La navegación está sincronizada con el mapa en los dos sentidos: al moverte por los PK se resalta la sección sobre el mapa con una banda elástica, y al pinchar en el mapa (con la casilla activada) se salta al PK más cercano. También se puede pinchar directamente sobre el perfil longitudinal para ir a ese PK.
El recuadro Alineaciones es el mismo widget en el visor y en el diálogo de planos. Lista una fila por alineación (una por feature de la directriz) de cada corredor de la sesión, con un color propio y una casilla:
| Concepto | Qué significa |
|---|---|
| marcada (casilla) | entra en el dibujo conjunto: sale en el perfil longitudinal y en el diagrama de masas, superpuesta y a trazos con su color, y sale en los planos |
| principal (desplegable de arriba) | manda donde solo cabe una: la sección transversal, la navegación por PK y, en los planos, el trazado que define las hojas de planta. Se dibuja con línea continua y da el título |
Los botones Todas / Ninguna / Solo esta son atajos. Resaltar una fila de la lista también la hace principal, y al revés. La principal no tiene que estar marcada: se puede comparar dos trazados en el longitudinal mientras se va mirando la sección de un tercero.
En los planos el criterio es el mismo, pero cada dibujo hace lo que tiene sentido con varias alineaciones:
Lo decide el desplegable Juego de planos, que está arriba del diálogo porque manda sobre los tres dibujos (ver 11.3):
| Plano | Un solo juego, el de la principal (por defecto) | Un juego por alineación |
|---|---|---|
| Transversales | los cortes de la principal, y solo esos. Las demás salen como traza en esos mismos planos de corte | todas las secciones en la misma lámina, con fid n delante del PK: dos PK 0+000 de ejes distintos serían indistinguibles |
| Longitudinal | el de la principal. Las demás aparecen donde cortan su plano vertical | una tira por alineación, una tras otra, con su etiqueta en el título |
| Planta | un juego de hojas encajado y girado sobre la principal | cada alineación genera sus propias hojas |
| Cubicaciones | la de la principal | una tabla por alineación. Medir tramos distintos juntos inventaría un volumen entre el final de uno y el principio del siguiente |
Y en los tres, con la casilla Otros marcada, los demás corredores se dibujan donde crucen o vayan cerca. Ver 11.4.
Vector → AQGIS-Sivil3D → Generar planos…
QGIS no tiene ningún elemento de composición que dibuje perfiles, y montar cientos de polilíneas de layout es inviable. Así que se convierte «dibujar en el plano» en «generar geometría»: una capa de dibujo en espacio papel donde X e Y son milímetros de papel y cada sección va trasladada a su celda de una retícula. El plano no es más que un mapa encuadrado sobre esa capa.
Ventajas: se simboliza con QGIS como cualquier capa, el atlas pagina solo, la exportación a DXF sale gratis y las escalas quedan explícitas.
| Plano | Cómo se genera |
|---|---|
| Planta por hojas | capa de rectángulos de hoja a lo largo del eje, usada como cobertura de atlas: una página por hoja, con el mapa girado según el campo rotacion para que el eje salga horizontal, y solape configurable entre hojas |
| Perfil longitudinal | espacio papel a escalas H y V independientes (por defecto 1:1000 y 1:100) con la guitarra debajo: PK, cota de terreno, cota de rasante y cota roja, con los valores girados. Se pagina en tiras: se corta la hoja cuando se agota el ancho o cuando el desnivel ya no cabe en el alto |
| Transversales | retícula de n×m secciones por hoja. Las celdas se dimensionan para llenar el papel que elijas |
| Cubicaciones | hoja de cierre con la tabla de volúmenes por tramo y el resumen de totales. Pagina sola si no cabe, y los totales van siempre en la última |
Un plano es el de un eje: sus transversales son los cortes de su recorrido y su longitudinal es su plano vertical. Con varios trazados marcados hay que decir si se quiere un solo proyecto o varios, y de eso va el desplegable Juego de planos, arriba del diálogo junto a la lista de alineaciones:
| Modo | Qué hace | Cuándo |
|---|---|---|
| Un solo juego, el de la alineación principal | transversales, longitudinal y hojas de planta de la principal. Las demás no traen su propio juego: salen donde cortan esos planos, a trazos | trazados que van juntos: una carretera y su reposición, dos calzadas, un ramal |
| Un juego completo por alineación | cada una genera sus transversales, su longitudinal y sus hojas, uno tras otro y numerados de corrido | trazados lejanos o que son obras distintas, que cada uno necesita su encuadre |
Con la casilla Otros marcada (lo está de partida), en el plano de un trazado aparecen también los demás:
| Plano | Qué se ve |
|---|---|
| Transversales | la traza del otro corredor en ese mismo plano de corte. Se calcula cortando el plano de la sección con las líneas características del otro (borde de calzada, arcén, pie de talud…), así que es literalmente su sección ahí |
| Longitudinal | la intersección de los demás corredores con el plano vertical que recorre la principal. Un trazado que la cruza sale solo en ese tramo —lo que mide de ancho al cruzar—, con su cota, así que se ve por dónde pasa: por encima o por debajo. Uno que va paralelo y no la corta no aparece |
| Planta | salen siempre, porque el mapa dibuja sus capas |
Las trazas ajenas se dibujan a trazos y en morado, para que no se confundan con el proyecto que se está acotando, y se recortan al marco de la celda: un corredor que pasa a 40 m de un dibujo que abarca 15 no puede salir pintado por encima del cajetín. Si no entra, no se ve.
El corte se hace contra las dos familias de líneas de la otra superficie: las longitudinales (las características) y sus propias secciones. Hacen falta las dos: con trazados casi paralelos el plano cruza las longitudinales, y con dos que se cortan en ángulo recto pasa lo contrario —las longitudinales del otro son paralelas al plano y no lo tocan nunca—.
El recuadro Capas del plano lista las capas del proyecto que pueden ir al mapa y deja marcar las que de verdad se quieren. De partida se marcan las salidas del corredor (TIN, huella, eje, líneas características, secciones, PK) y la directriz; el resto del proyecto —catastro, ortofotos, capas de trabajo— se queda fuera.
Los botones son Todas, Ninguna y Del corredor. Las capas de dibujo en espacio papel no se listan siquiera: sus coordenadas son milímetros y en el mapa aparecerían a cientos de kilómetros.
Las hojas del perfil longitudinal se cortan por dos motivos: porque se agota el ancho del papel o porque el desnivel ya no cabe de alto. Lo segundo es lo que descoloca: se elige A3 y salen tiras que ocupan la mitad.
Con A3 apaisado y márgenes, quedan unos 366 mm de ancho útil y 221 mm de alto de dibujo. A escala horizontal 1:1000 caben 366 m de eje por hoja; a escala vertical 1:100 caben 22 m de desnivel. Si el terreno sube más de 22 m en menos de 366 m —una pendiente por encima del 6 %—, manda el desnivel y la hoja se corta antes:
| Escala vertical | Desnivel que cabe | Ancho aprovechado |
|---|---|---|
| 1:100 | 22,1 m | 71 % |
| 1:200 | 44,2 m | 98 % |
No es un fallo: si el dibujo no cabe de alto, hay que partirlo. La solución es bajar la escala vertical (1:200, 1:250) o subir la horizontal. El registro lo dice al generar, con la escala que llenaría la hoja.
| Grupo | Opciones |
|---|---|
| Qué planos | alineaciones marcadas y cuál es la principal, juego de planos (11.3), casilla Otros (11.4), título y plantilla .qpt |
| Transversales | papel, columnas y filas de la retícula, escala (o automática) y hoja de cubicaciones |
| Longitudinal | papel, escalas H y V, y cada cuántas secciones se pone una columna en la guitarra |
| Planta | papel, escala, solape entre hojas y qué capas del proyecto llegan al mapa (11.5) |
| Exportar | carpeta de salida y formatos: PDF y DXF |
.qpt, se carga y el plugin solo rellena sus variables
(@corredor_titulo, @corredor_subtitulo,
@corredor_papel), respetando su tamaño de página y usando su elemento
de mapa. Así el formato corporativo lo controláis vosotros.Vector → AQGIS-Sivil3D → Editor de rasantes
Es el perfil longitudinal en modo digitalización: la rasante se dibuja con el ratón sobre el terreno, con las mismas herramientas con las que se digitaliza en planta, y al terminar se escribe en la Z de la directriz. A partir de ahí el corredor se calcula con cota del eje = Z de la directriz (ver 6.2.0), así que este editor es la pieza que faltaba para proyectar en alzado sin salir de QGIS.
| Control | Qué hace |
|---|---|
| Directriz | capa de líneas sobre la que se proyecta. Al abrir se elige la capa activa, o la primera que no sea una salida del propio corredor (el eje, las secciones y las líneas características son salidas, no directrices) |
| Tramo | la feature (y la parte, si es una multilínea) que se está editando; cada tramo tiene su propia rasante |
| DEM | ráster o malla del que sale el perfil del terreno. Es opcional: sin él se puede dibujar a ciegas, pero no se ve contra qué |
| exag. | exageración vertical de la vista. Sin ella una rasante al 3 % es una raya horizontal |
| Encajar | vuelve a encajar la vista tras haber hecho zoom o desplazado |
| Del terreno | arranca una rasante pegada al terreno con el número de vértices que se indique: el punto de partida habitual |
| De la Z de la capa | lee la rasante que ya tiene la geometría, vértice a vértice. Al elegir un tramo con Z se hace solo |
La vista se maneja como cualquier otro plano: rueda para hacer zoom alrededor del cursor y botón central arrastrando para desplazar.
Lo primero que hay que tener claro es que en la barra hay dos cosas distintas:
| Qué son | Cómo se comportan | |
|---|---|---|
| Mover, Insertar, Borrar | modos | se quedan activos hasta que se cambia de herramienta |
| Recta, Arco, Bézier, NURBS, + control | acciones de un solo uso | cambian el segmento y el mando vuelve solo a Mover, que es lo que se quiere hacer después: arrastrar los tiradores |
Las acciones se pueden usar de dos maneras: con un segmento ya seleccionado (se aplican al pulsar el botón, sin más) o sin nada seleccionado (quedan armadas y se aplican al segmento que se pinche a continuación). Debajo de la barra hay un rótulo que dice en cada momento qué se espera que hagas.
| Qué | Aspecto | Qué hace |
|---|---|---|
| Vértice | cuadrado blanco (naranja el seleccionado) | se arrastra en PK y en cota; es un vértice de la rasante |
| Tirador | círculo morado, unido por una línea a trazos | da forma al segmento curvo. El arco tiene uno y pasa exactamente por él; la Bézier tiene dos y se acerca sin llegar; el NURBS tiene los que le añadas |
Al pasar el ratón por encima, lo que se puede coger se rodea de un círculo, y el segmento bajo el cursor se marca en grueso. Si no se resalta nada, ahí no hay nada que agarrar.
La rasante es una ley de cotas independiente de la planta: sus vértices no tienen nada que ver con los de la polilínea de la directriz. Aun así puede tener unos cuantos, y subir o bajar un tramo entero de uno en uno deformaría las pendientes por el camino. Por eso se pueden coger varios:
| Gesto | Qué hace |
|---|---|
| Ctrl (o Mayús) + clic | añade o quita ese vértice del grupo |
| arrastrar desde el vacío | abre una ventana de selección; al soltar entran los vértices que hayan quedado dentro |
| Ctrl+A / botón Todos | selecciona todos |
| Esc / botón Ninguno | deshace la selección |
| arrastrar un vértice del grupo | mueve todos el mismo incremento, así que el tramo sube o baja sin deformarse |
| Supr | borra todos los seleccionados (nunca deja menos de dos) |
Los vértices del grupo se pintan en naranja, y arriba a la izquierda aparece cuántos hay cogidos.
Una directriz puede tener cientos de vértices, y si la rasante ya está escrita en su Z estará densificada además. Leer eso vértice a vértice daría una rasante de trescientos nodos que no hay quien maneje.
Por eso, al leer la Z de la capa se simplifica con el campo tol. del pie (tolerancia en metros de cota): se queda con los vértices que de verdad definen la rasante, garantizando que en ningún punto se aparta más de esa tolerancia de la original. Con 0 se leen todos. El botón Simplificar… hace lo mismo sobre la rasante que se esté editando.
| Gesto | Qué hace |
|---|---|
| doble clic | mete un vértice ahí, con cualquier herramienta activa |
| botón derecho sobre un vértice | lo quita, como en la digitalización de QGIS |
| Supr | quita el vértice seleccionado |
| Esc | vuelve al modo Mover |
| rueda | zoom alrededor del cursor |
| botón central arrastrando | desplaza la vista |
| Encajar | vuelve a encuadrar todo |
Además de los tipos de segmento —que son los de la digitalización en planta— cada vértice interior admite un acuerdo vertical: la parábola simétrica de toda la vida, que redondea la esquina entre dos rectas. Es la herramienta que se usa de verdad al proyectar una carretera y no tiene equivalente en planta.
Se define de dos maneras: escribiendo su longitud L en la columna correspondiente de la tabla, o escribiendo su K y pulsando Aplicar K. K son los metros de acuerdo por cada 1 % de cambio de pendiente, que es como viene en la normativa; el editor calcula L = K · |Δ pendiente en %| y a la inversa.
| Regla | Por qué |
|---|---|
| solo en vértices interiores | en los extremos no hay dos pendientes que acordar |
| solo entre dos rectas | sobre una Bézier o un NURBS lo que manda son los tiradores; el acuerdo se ignora y se avisa |
| no puede pasar de la tangente disponible | si no, se comería el vértice de al lado. Se recorta al que cabe y se avisa |
| si no hay cambio de pendiente, no hay acuerdo | una parábola de curvatura nula es la propia recta |
En la vista, el acuerdo se rotula con su L y su K, y sus dos extremos se marcan con un circulito: ahí es donde empieza y acaba la curva.
| Ajuste | Efecto |
|---|---|
| ajustar al terreno | el vértice que se mueve se pega a la cota del terreno. Útil para arrancar y para forzar un paso a nivel |
| m PK | la abscisa se redondea a múltiplos de ese valor (25 m, 50 m…) |
| m cota | la cota se redondea a múltiplos de ese valor (0,10 m, 0,50 m…) |
La tabla de la derecha es la otra mitad del editor: PK, cota y L se escriben a mano, y el tipo de segmento, la K y la pendiente se leen. Es como se remata una rasante cuando ya está casi: con el ratón se busca la forma y con los números se cierra.
Mientras se edita, el mapa resalta la directriz del tramo con una banda elástica y marca con una cruz el punto por el que va el ratón y el vértice seleccionado. La lectura de arriba de la vista da, para la posición del cursor, PK, cota, cota del terreno y cota roja. Desmonte y terraplén se sombrean en los mismos colores que el resto del plugin (ocre y verde), así que se ve de un golpe qué parte de la rasante excava y qué parte rellena.
Aplicar a la Z de la capa escribe la rasante en la geometría del tramo que se está editando:
LineStringZ), se edita en el sitio,
dentro de una sesión de edición normal;El campo paso es la densificación: además de los vértices que ya tiene la directriz, se meten puntos a ese paso y en los puntos singulares de la rasante (vértices y extremos de cada acuerdo). Hace falta porque una parábola entre dos vértices separados 300 m se perdería si solo se escribiesen sus extremos. Con paso 0 se escriben únicamente los vértices existentes.
Vector → AQGIS-Sivil3D → Curva de embalse
Curva característica de un embalse o una balsa a partir del DEM del vaso: para cada cota, el volumen embalsado y la superficie inundada.
Para una cota de agua e:
Es el cálculo de siempre, pero resuelto por acumulación en un histograma: cada celda se clasifica una sola vez según a partir de qué cota empieza a contar, y dos sumas acumuladas dan la curva completa. El resultado es exacto y el coste no depende del número de cotas, así que un vaso de varios GB con paso de 10 cm sale de una pasada. El DEM se lee por bloques, por GDAL cuando es un archivo y por el proveedor de QGIS cuando no lo es.
| Entrada | Qué es |
|---|---|
| DEM del vaso | cualquier ráster que QGIS pueda leer |
| Recortar con un polígono | opcional: capa de polígonos con la que recortar el DEM para evaluar solo dentro. Admite «solo los seleccionados» y reproyecta el polígono al sistema del DEM si hace falta |
| Cotas a cubicar | por defecto del mínimo al máximo del ráster (o del recorte, si lo hay). También se puede fijar el rango a mano: por ejemplo del fondo a la cota de coronación |
| Paso | intervalo entre cotas. 0,10 m es lo habitual |
| Salida | Cuándo |
|---|---|
| CSV de la curva | siempre. Cinco columnas: cota, volumen en hm³, superficie en ha, volumen en m³ y superficie en m². Con separador «;» y coma decimal, para que Excel en español lo abra sin tocar nada |
| PNG del gráfico | siempre. Los dos paneles tal y como se ven, dibujados a 1800 × 1200 |
| DEM recortado cargado y estilado | solo si se ha recortado. Es lo que distingue las dos formas de usar la herramienta |
Con la carpeta indicada y la casilla marcada, el CSV y el PNG se escriben al
terminar el cálculo; los botones Guardar CSV y Guardar PNG permiten
elegir el sitio a mano. Los archivos del recorte llevan el sufijo
-vaso para no machacar los del DEM completo.
El DEM recortado se carga con una rampa azul en pseudocolor interpolado: azul oscuro en el fondo y azul claro cada vez más transparente hacia la orilla, de modo que por donde el calado es pequeño se ve el terreno de debajo. La rampa se estira entre la cota mínima y la máxima del recorte, así que el mismo estilo vale para una balsa de 3 m de calado y para un embalse de 60 sin tocar nada. El valor 0 se deja transparente, porque en un recorte es hueco y no una cota.
Pasando el ratón por el gráfico se leen cota, volumen y superficie de cada punto; pinchando se fija una cota, que queda dibujada con su etiqueta. Los dos paneles comparten el eje de cotas y tienen su propia escala: son dos magnitudes distintas, hm³ y ha, y un doble eje Y obligaría a mirar dos escalas para leer un solo punto.
Exportar corredor a archivo… y Importar corredor de archivo…
Las capas de salida están en memoria: al cerrar QGIS se pierden. La exportación escribe dos archivos hermanos:
| Archivo | Qué lleva |
|---|---|
<nombre>.gpkg | todas las capas del grupo, cada una con su estilo dentro y su nombre original. Formato abierto: se abre en cualquier SIG y en CAD |
<nombre>.corredor.json | las secciones resueltas: línea de terreno, cota del eje y códigos de cada vértice |
El JSON es lo que el GeoPackage no puede guardar y sin lo cual no se recupera más que el dibujo. Con él, al importar vuelve el corredor entero y se puede usar el visor de perfiles, medir y generar planos sin el DEM y sin recalcular.
Para exportar, selecciona el grupo del corredor en el panel de capas. Si solo
quieres el dibujo, el .gpkg por sí solo vale; al importarlo sin el
JSON se avisa de que el visor no tendrá datos.
Cada cálculo y cada importación se registran como una alternativa
independiente, con el nombre del grupo (eje-corredor,
eje-corredor (2)…). No se machacan entre sí, así que se pueden
comparar.
El recuadro Alineaciones del panel de perfiles y del diálogo de planos lista las alineaciones de todas las alternativas juntas, así que no hay que elegir una y descartar las demás: se marcan las que se quieran comparar, sean del mismo corredor o de corredores distintos. Ver 10.2.
Un corredor calculado es más que sus capas: las secciones resueltas —lo que necesitan el visor de perfiles y el generador de planos— viven en memoria y no están en ninguna capa. Para que no se pierdan al cerrar, el plugin las guarda y las recupera solo por dos caminos:
| Camino | Cuándo |
|---|---|
<proyecto>.sivil3d.json | al guardar el proyecto se escribe al lado, y al abrirlo se lee. Es el camino normal: basta con guardar el proyecto como siempre |
<paquete>.corredor.json | si en el proyecto hay capas que salen de un GeoPackage exportado con la herramienta de paquetes (ver 14), su JSON hermano se lee también. Sirve aunque el proyecto no se haya guardado nunca, y es lo que recupera el corredor de un compañero |
La recuperación se intenta al abrir el proyecto y también al abrir el visor o el diálogo de planos, por si acabas de cargar un GeoPackage a mano. Lo calculado en la sesión de trabajo siempre manda sobre lo recuperado, que es más antiguo.
El algoritmo aqgis:corredor está en la Caja de herramientas,
proveedor AQGIS-Sivil3D, grupo Corredor. Sirve para modelos, para
procesos en lote y para la consola:
import processing
processing.run("aqgis:corredor", {
"DIRECTRICES": capa_lineas,
"DEM": capa_dem,
"LIBRERIA": r"C:\...\secciones.json",
"CAMPO_SECCION": "seccion",
"SECCION_DEFECTO": "Carretera 1+1",
"PASO_PK": 10.0,
"INCLUIR_VERTICES": True,
"COTA_EJE": 0, # 0 = del DEM, 1 = de la Z de la directriz
"INTERVALO_PK": 100.0,
"FUSIONAR": True,
"CELDA_FUSION": 0.0, # 0 = resolución del DEM
"HOLGURA": 50.0,
"GRUPO": "", # vacío = <alineación>-corredor
"OUT_TIN": "TEMPORARY_OUTPUT",
"OUT_SECCIONES": "TEMPORARY_OUTPUT",
"OUT_LINEAS": "TEMPORARY_OUTPUT",
"OUT_HUELLA": "TEMPORARY_OUTPUT",
"OUT_EJE": "TEMPORARY_OUTPUT",
"OUT_PK": "TEMPORARY_OUTPUT",
"OUT_2DM": r"C:\...\corredor.2dm",
})
Los parámetros finos (paso de muestreo, semiancho máximo, PK inicial, banda del DEM, factor y desplazamiento de cota, extensión de fusión, librería en JSON y grupo de capas) están bajo Avanzado.
| Síntoma | Causa y solución |
|---|---|
| «el talud 1:X no corta el terreno en N m» | el talud no engancha dentro del semiancho máximo. Caso típico: un terraplén 1:2 sobre una ladera al 50 % es paralelo al terreno y nunca corta. Cambia el talud o amplía el semiancho |
| «N PK en curva donde las secciones contiguas se cruzan» | curva demasiado cerrada para el ancho de la sección. Reduce el paso entre PK o suaviza la directriz |
| «el terreno no tiene datos… (NoData)» | el DEM no cubre esa zona, o hay un hueco. Amplía el DEM o rellena el hueco |
| «sección '…' desconocida; se salta» | el valor del campo de sección no coincide con ningún nombre de la librería. El registro lista los válidos |
| «usa campos que no existen en la capa» | una sección con parámetros @campo se aplica a una capa que no tiene esos campos |
| «grupo vacío… la superficie quedará abierta» | falta el grupo desmonte o terraplén en un lado. Si de verdad quieres que ese lado sea siempre de un tipo, pon el mismo talud en los dos grupos |
| no se genera ningún triángulo | el DEM no cubre las directrices, o están en sistemas de referencia incompatibles |
| la fusión avisa de que falta scipy | instala scipy en el Python de QGIS; el resto del plugin funciona sin él |
| el perfil longitudinal no cabe | reduce la escala horizontal o deja que se pagine: se parte en tiras automáticamente |
@campo o expresiones).La separación es deliberada: core/ es Python puro y no importa nada
de QGIS, así que toda la geometría delicada (el cosido del TIN, la búsqueda del
daylight, las mediciones, el espacio papel) se puede probar sin abrir QGIS.
gis/ es lo que habla con QGIS; ui/, la interfaz;
processing/, el algoritmo.
python -m unittest aqgis_sivil3d.tests.test_core \
aqgis_sivil3d.tests.test_medicion \
aqgis_sivil3d.tests.test_paperspace
Los de la capa QGIS necesitan el Python de QGIS:
aqgis_sivil3d.tests.test_gis. Entre ellos hay dos guardas que
conviene no quitar: una comprueba que no queden APIs de PyQt5 eliminadas en PyQt6
(exec_, QRegExp…), y otra que no haya enums de Qt sin
ámbito fuera de ui/qtcompat.py. Son fallos que no se ven al importar,
solo al pulsar el botón.
Escrito por Rafael Vázquez con Claude (Anthropic). Versión 1.0.0.
Se distribuye como software libre bajo la Licencia Pública General GNU, versión 3 o posterior (GPL v3+). Cualquiera puede usarlo, estudiarlo, modificarlo y redistribuirlo, pero con una condición que la hace la más restrictiva de las licencias libres: quien distribuya el plugin, o una versión modificada de él, tiene que hacerlo bajo esta misma licencia y entregar el código fuente. Nadie puede cerrarlo ni integrarlo en un producto propietario. Se entrega sin garantía de ningún tipo.
El texto completo está en el archivo LICENSE que acompaña al
plugin, y también en gnu.org/licenses.