Generador GML Catastro › Guías
Plantilla GML Catastro explicada etiqueta a etiqueta
Esta plantilla muestra la estructura de un GML de parcela INSPIRE v4 tal como la publica Catastro, con un comentario en cada bloque y coordenadas de relleno. Sirve para entender el archivo y revisar uno hecho a mano; no es un archivo utilizable para ninguna parcela real.
La plantilla de parcela, bloque a bloque
El archivo empieza con la declaración XML en UTF-8 y una raíz FeatureCollection del estándar WFS 2.0. Dentro hay un elemento member por parcela y, en cada uno, un cp:CadastralParcel con superficie, geometría, identificador y punto de referencia. Los valores X1 Y1… de la plantilla son marcadores que se sustituyen por los pares UTM reales del levantamiento.
El bloque del patio aparece comentado porque solo se incluye cuando la parcela tiene huecos interiores; si los tiene, cada patio lleva su propio gml:interior detrás del exterior, dentro del mismo PolygonPatch. El resto de bloques aparece siempre en el formato de Catastro, aunque algunos vayan vacíos, como cp:label o cp:nationalCadastralReference en una parcela nueva.
<?xml version="1.0" encoding="utf-8"?>
<!-- Plantilla de parcela INSPIRE v4 (cp/4.0). Solo estructura: X1 Y1… son marcadores, -->
<!-- no coordenadas reales. Este texto no sirve para presentar ninguna parcela. -->
<!-- Raíz WFS 2.0 con los espacios de nombres del ejemplo oficial de Catastro. -->
<!-- numberMatched y numberReturned = número de elementos member del archivo. -->
<FeatureCollection xmlns="http://www.opengis.net/wfs/2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:gml="http://www.opengis.net/gml/3.2"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:cp="http://inspire.ec.europa.eu/schemas/cp/4.0"
xmlns:gmd="http://www.isotc211.org/2005/gmd"
xsi:schemaLocation="http://www.opengis.net/wfs/2.0
http://schemas.opengis.net/wfs/2.0/wfs.xsd
http://inspire.ec.europa.eu/schemas/cp/4.0
http://inspire.ec.europa.eu/schemas/cp/4.0/CadastralParcels.xsd"
timeStamp="AAAA-MM-DDThh:mm:ss" numberMatched="1" numberReturned="1">
<!-- Un member por parcela. Con dos parcelas hay dos member y los contadores valen 2. -->
<member>
<!-- gml:id = namespace + localId: ES.LOCAL.CP.PARCELA_1 o ES.SDGC.CP.{referencia} -->
<cp:CadastralParcel gml:id="ES.LOCAL.CP.PARCELA_1">
<!-- Superficie neta (exterior menos patios) redondeada al m², sin decimales. -->
<cp:areaValue uom="m2">NNNN</cp:areaValue>
<!-- Fechas de versión: se dejan vacías y marcadas como no informadas. -->
<cp:beginLifespanVersion xsi:nil="true"
nilReason="http://inspire.ec.europa.eu/codelist/VoidReasonValue/Unpopulated"/>
<cp:endLifespanVersion xsi:nil="true"
nilReason="http://inspire.ec.europa.eu/codelist/VoidReasonValue/Unpopulated"/>
<!-- Geometría. srsName admite 25829, 25830, 25831 o 32628 con esta forma exacta. -->
<cp:geometry>
<gml:MultiSurface gml:id="MultiSurface_ES.LOCAL.CP.PARCELA_1"
srsName="http://www.opengis.net/def/crs/EPSG/0/25830">
<!-- Un solo surfaceMember: la Sede admite un recinto por parcela. -->
<gml:surfaceMember>
<gml:Surface gml:id="Surface_ES.LOCAL.CP.PARCELA_1.1"
srsName="http://www.opengis.net/def/crs/EPSG/0/25830">
<gml:patches>
<gml:PolygonPatch>
<!-- Anillo exterior en sentido horario. count = vértices + 1, -->
<!-- porque el último par repite V1. Decimales con punto. -->
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="2" count="5">
X1 Y1 X2 Y2 X3 Y3 X4 Y4 X1 Y1
</gml:posList>
</gml:LinearRing>
</gml:exterior>
<!-- Patio opcional: un gml:interior por patio, en sentido antihorario,
<gml:interior>
<gml:LinearRing>
<gml:posList srsDimension="2" count="5">
P1 Q1 P2 Q2 P3 Q3 P4 Q4 P1 Q1
</gml:posList>
</gml:LinearRing>
</gml:interior>
fin del bloque opcional. -->
</gml:PolygonPatch>
</gml:patches>
</gml:Surface>
</gml:surfaceMember>
</gml:MultiSurface>
</cp:geometry>
<!-- Identificador INSPIRE (base/3.3): localId libre con ES.LOCAL.CP, -->
<!-- o referencia catastral de 14 caracteres con ES.SDGC.CP. -->
<cp:inspireId>
<Identifier xmlns="http://inspire.ec.europa.eu/schemas/base/3.3">
<localId>PARCELA_1</localId>
<namespace>ES.LOCAL.CP</namespace>
</Identifier>
</cp:inspireId>
<!-- Etiqueta corta (A, B…) o vacía. La referencia catastral solo con ES.SDGC.CP. -->
<cp:label/>
<cp:nationalCadastralReference/>
<!-- Punto interior de la parcela, fuera de cualquier patio, con 2 decimales. -->
<cp:referencePoint>
<gml:Point gml:id="ReferencePoint_ES.LOCAL.CP.PARCELA_1"
srsName="http://www.opengis.net/def/crs/EPSG/0/25830">
<gml:pos>XR YR</gml:pos>
</gml:Point>
</cp:referencePoint>
</cp:CadastralParcel>
</member>
</FeatureCollection>
De FeatureCollection a posList: cómo se anida la geometría
FeatureCollection contiene member, que contiene cp:CadastralParcel; este lleva cp:geometry con un gml:MultiSurface, y dentro vienen surfaceMember, Surface, patches, PolygonPatch, exterior y LinearRing, hasta llegar al gml:posList con los números. Aunque se llame MultiSurface, la Sede admite un solo recinto por parcela: un surfaceMember y nada más.
Cada nivel geométrico lleva un gml:id derivado del de la parcela: MultiSurface_ES.LOCAL.CP.PARCELA_1, Surface_ES.LOCAL.CP.PARCELA_1.1 y ReferencePoint_ES.LOCAL.CP.PARCELA_1. El srsName se repite en MultiSurface, Surface y Point, siempre con el mismo código. Si alguien cambia el huso en un sitio y no en los otros, el archivo queda incoherente.
Qué contiene cada etiqueta y el error típico al rellenarla
La tabla recorre las doce etiquetas que deciden si un GML de parcela está bien construido, con lo que contiene cada una y el fallo que más se repite al rellenarla a mano o con una hoja de cálculo. La mayoría de esos fallos no se ven al abrir el archivo en un navegador o en un editor de texto: aparecen al validarlo.
Tres detalles concentran los errores. El count del posList es el número de vértices más uno, porque V1 se repite al final: una parcela de 6 vértices lleva count 7. Los decimales van con punto, aunque en pantalla se lean con coma. Y el areaValue es un número entero: 4.481,84 m² se escriben 4482.
| Etiqueta | Qué contiene | Error típico al rellenarla a mano |
|---|---|---|
| FeatureCollection | Raíz WFS 2.0 con los espacios de nombres gml 3.2, cp 4.0, xlink, xsi y gmd, el schemaLocation, timeStamp y los contadores numberMatched y numberReturned | Dejar numberMatched y numberReturned en 1 después de añadir una segunda parcela, o perder un espacio de nombres al copiar la cabecera |
| member | Un elemento por parcela; dentro va un solo cp:CadastralParcel | Escribir gml:featureMember, propio de la versión 3, o meter dos parcelas dentro del mismo member |
| cp:CadastralParcel gml:id | Identificador XML de la parcela: ES.LOCAL.CP.PARCELA_A o ES.SDGC.CP seguido de la referencia catastral | Repetir el mismo gml:id en dos parcelas o incluir espacios, que XML no admite en un identificador |
| cp:areaValue | Superficie neta de la parcela en metros cuadrados, como número entero, con el atributo uom «m2» | Escribir decimales o la superficie del anillo exterior sin restar los patios |
| cp:beginLifespanVersion | Fecha de alta de la versión; se deja vacía con xsi:nil «true» y nilReason Unpopulated, igual que endLifespanVersion | Borrar la etiqueta o escribir una fecha sin quitar xsi:nil, lo que deja el elemento contradictorio |
| gml:MultiSurface srsName | Sistema de referencia con la forma http://www.opengis.net/def/crs/EPSG/0/ y el código 25829, 25830, 25831 o 32628 | Escribir EPSG:25830 a secas, copiar la forma urn del GML de edificio o declarar el 4083 en Canarias |
| gml:Surface | El recinto de la parcela, con gml:id Surface_ más el identificador y .1, y el mismo srsName | Añadir un segundo surfaceMember para un trozo separado de la finca: cada recinto debe ir como parcela aparte |
| gml:exterior / gml:interior | Anillo exterior en sentido horario y, si hay patios, un gml:interior en sentido antihorario por cada uno | Copiar el patio con el mismo sentido que el exterior o dibujarlo tocando o cruzando el lindero |
| gml:posList srsDimension/count | Pares X Y separados por espacios y con punto decimal; count es el número de vértices más uno, porque V1 se repite al final | Usar coma decimal, olvidar repetir V1 o dejar el count antiguo después de añadir o quitar un vértice |
| cp:inspireId localId/namespace | Bloque Identifier de base/3.3 con localId (PARCELA_A o la referencia de 14 caracteres) y namespace ES.LOCAL.CP o ES.SDGC.CP | Combinar una referencia catastral con ES.LOCAL.CP o un nombre libre con ES.SDGC.CP |
| cp:label / nationalCadastralReference | Etiqueta corta de la parcela (A, B…) y referencia catastral de 14 caracteres, que solo se rellena con ES.SDGC.CP; en otro caso la etiqueta va vacía | Pegar la referencia de 20 caracteres del inmueble en lugar de la de 14 de la parcela |
| cp:referencePoint | gml:Point con un gml:pos situado dentro de la parcela y fuera de cualquier patio, con 2 decimales | Usar el centroide de una parcela en L o en U, que puede caer fuera del polígono o dentro de un patio |
areaValue, referencePoint e identificadores
cp:areaValue lleva la superficie neta, exterior menos patios, redondeada al metro cuadrado y con uom «m2». Una parcela de 838,34 m² con un patio de 16,00 m² declara 822. El cp:referencePoint debe caer dentro de la parcela y fuera de los patios; en parcelas en L o en U, el centroide puede quedar fuera, y por eso el estudio calcula un punto interior.
El bloque cp:inspireId usa el espacio de nombres base/3.3 y combina localId y namespace. Con una referencia catastral de 14 caracteres, el namespace es ES.SDGC.CP y la misma referencia va en nationalCadastralReference; con un nombre libre como PARCELA_A, el namespace es ES.LOCAL.CP y esa etiqueta queda vacía. El gml:id de la parcela une ambos valores.
Qué cambia en el GML de edificio
El GML de edificio no es la misma plantilla con otro nombre. Usa los espacios de nombres bu-ext2d/2.0, bu-core2d/2.0 y bu-base/3.0, la raíz gml:FeatureCollection con gml:featureMember y un srsName con la forma urn:ogc:def:crs:EPSG::25830. Los patios siguen siendo anillos interiores, pero cada piscina va aparte como OtherConstruction.
También cambia el significado de la superficie. En la parcela, cp:areaValue es la superficie neta del suelo; en el edificio, officialArea guarda como grossFloorArea la superficie construida de todas las plantas, y la huella queda en la geometría. Mezclar las dos plantillas es un error frecuente: un srsName de edificio dentro de un GML de parcela basta para que el sistema de referencia no se reconozca.
| Aspecto | Parcela (INSPIRE v4) | Edificio |
|---|---|---|
| Espacios de nombres | cp/4.0 (http://inspire.ec.europa.eu/schemas/cp/4.0) con gml 3.2 y base/3.3 para el Identifier | bu-ext2d/2.0, bu-core2d/2.0 y bu-base/3.0, también con gml 3.2 |
| Forma del srsName | http://www.opengis.net/def/crs/EPSG/0/ seguido del código, por ejemplo 25830 | urn:ogc:def:crs:EPSG:: seguido del código, por ejemplo urn:ogc:def:crs:EPSG::25830 |
| Elemento raíz | FeatureCollection de WFS 2.0 con un member por parcela | gml:FeatureCollection con un gml:featureMember por edificio o construcción |
| Anillos | Un Surface por parcela: exterior en sentido horario e interiores en sentido antihorario | Huella en un Surface con los patios como interiores; cada piscina va aparte como OtherConstruction |
| Superficie | cp:areaValue en m² enteros: superficie neta, exterior menos patios | officialArea con grossFloorArea: superficie construida de todas las plantas |
Rellenar la plantilla sin tocar el XML
Escribir el archivo a mano obliga a cuidar sentido de giro, count, decimales y redondeos en cada parcela. El estudio lo hace a partir del DXF, del CSV o de los vértices tecleados: orienta los anillos, calcula superficie y punto de referencia y muestra en el panel «Pack Pro Catastral» la cabecera, el member inicial y los dos primeros pares del posList.
Esa vista previa es gratuita y se actualiza con cada cambio; el archivo completo, con todos los pares, se descarga con «GML INSPIRE v4» del Pack Pro. Si ya tiene un GML y quiere saber si respeta esta plantilla, ábralo en el validador GML INSPIRE v4, que detecta versión, EPSG y diferencias de superficie.
Preguntas frecuentes
¿Puedo usar esta plantilla para presentar mi parcela?
No tal cual. La plantilla lleva marcadores como X1 Y1 y NNNN en lugar de coordenadas y superficie, y sirve para entender la estructura. Para un archivo real hay que sustituir cada marcador, orientar los anillos, ajustar count y calcular areaValue y referencePoint; el estudio hace todo eso a partir de su levantamiento.
¿Con qué programa se abre o se edita un archivo GML?
Un GML es texto XML: se abre con cualquier editor de texto, como el Bloc de notas, y se visualiza en QGIS. Si lo edita a mano, guárdelo en UTF-8 y no cambie el orden de las etiquetas. Después de cualquier cambio, vuelva a comprobarlo en el validador: un count desajustado no se nota a simple vista.
¿Por qué la cabecera declara gmd y xlink si no se usan?
Porque el ejemplo oficial del formato de Catastro los declara en la raíz junto a gml, cp y xsi, y la plantilla lo reproduce tal cual. Declarar un espacio de nombres que no se usa no estropea el XML; borrar uno que sí se usa, como cp o gml, deja el archivo inválido.
¿Qué valor va en el atributo timeStamp?
La fecha y la hora en que se genera el archivo, con la forma 2026-11-01T00:00:00. Es informativo: no afecta a la geometría ni a la superficie. Si exporta dos veces el mismo proyecto con el Pack Pro, solo cambia ese atributo; todo lo demás sale idéntico byte a byte.
¿Hay que rellenar beginLifespanVersion con una fecha?
No. En el formato de Catastro, beginLifespanVersion y endLifespanVersion se dejan vacíos, con xsi:nil «true» y el nilReason de INSPIRE para datos no informados. Si escribe una fecha dentro sin quitar xsi:nil, el elemento queda contradictorio; si borra la etiqueta, el archivo deja de seguir la estructura del ejemplo oficial.
¿Cómo se añade una segunda parcela a la plantilla?
Copiando el bloque member entero, con su cp:CadastralParcel, y cambiando el localId y todos los gml:id para que no se repitan, por ejemplo PARCELA_A y PARCELA_B. Después hay que poner numberMatched y numberReturned a 2. La página de segregación genera ese archivo conjunto y uno por parcela sin editar nada.
¿Qué pasa si escribo las coordenadas del posList con coma decimal?
El posList separa los valores con espacios y usa punto decimal. Con coma, 413210,40 deja de ser un número válido y el anillo no se puede leer. En pantalla el estudio muestra las coordenadas con coma, como es costumbre en España, pero en el archivo las escribe siempre con punto.
Abra el estudio
Cargue su DXF, CSV o KML y el estudio rellena la plantilla automáticamente: anillos orientados, count, areaValue y punto de referencia calculados, con la vista previa del GML en el panel Pack Pro.
Abrir el generadorGenerador GML Catastro prepara archivos con la estructura publicada por la Dirección General del Catastro y comprueba la geometría antes de subirla. El Informe de Validación Gráfica (IVG) solo lo emite la Sede Electrónica del Catastro; revise siempre el resultado de la Sede y, cuando el procedimiento lo exija, la intervención de un técnico competente.