GENGMLGenerador GML Catastro

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.

Plantilla

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>
Estructura

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.

FeatureCollection raíz WFS 2.0 member uno por parcela cp:CadastralParcel areaValue, inspireId, referencePoint cp:geometry gml:MultiSurface y gml:Surface gml:exterior y un gml:interior por patio gml:posList X1 Y1 X2 Y2 … X1 Y1 · count = vértices + 1
Cada parcela es un member; dentro, la geometría baja hasta el posList con los pares de coordenadas.
Etiqueta a etiqueta

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.

EtiquetaQué contieneError típico al rellenarla a mano
FeatureCollectionRaí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 numberReturnedDejar numberMatched y numberReturned en 1 después de añadir una segunda parcela, o perder un espacio de nombres al copiar la cabecera
memberUn elemento por parcela; dentro va un solo cp:CadastralParcelEscribir gml:featureMember, propio de la versión 3, o meter dos parcelas dentro del mismo member
cp:CadastralParcel gml:idIdentificador XML de la parcela: ES.LOCAL.CP.PARCELA_A o ES.SDGC.CP seguido de la referencia catastralRepetir el mismo gml:id en dos parcelas o incluir espacios, que XML no admite en un identificador
cp:areaValueSuperficie 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:beginLifespanVersionFecha de alta de la versión; se deja vacía con xsi:nil «true» y nilReason Unpopulated, igual que endLifespanVersionBorrar la etiqueta o escribir una fecha sin quitar xsi:nil, lo que deja el elemento contradictorio
gml:MultiSurface srsNameSistema de referencia con la forma http://www.opengis.net/def/crs/EPSG/0/ y el código 25829, 25830, 25831 o 32628Escribir EPSG:25830 a secas, copiar la forma urn del GML de edificio o declarar el 4083 en Canarias
gml:SurfaceEl recinto de la parcela, con gml:id Surface_ más el identificador y .1, y el mismo srsNameAñadir un segundo surfaceMember para un trozo separado de la finca: cada recinto debe ir como parcela aparte
gml:exterior / gml:interiorAnillo exterior en sentido horario y, si hay patios, un gml:interior en sentido antihorario por cada unoCopiar el patio con el mismo sentido que el exterior o dibujarlo tocando o cruzando el lindero
gml:posList srsDimension/countPares 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 finalUsar coma decimal, olvidar repetir V1 o dejar el count antiguo después de añadir o quitar un vértice
cp:inspireId localId/namespaceBloque Identifier de base/3.3 con localId (PARCELA_A o la referencia de 14 caracteres) y namespace ES.LOCAL.CP o ES.SDGC.CPCombinar una referencia catastral con ES.LOCAL.CP o un nombre libre con ES.SDGC.CP
cp:label / nationalCadastralReferenceEtiqueta 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íaPegar la referencia de 20 caracteres del inmueble en lugar de la de 14 de la parcela
cp:referencePointgml:Point con un gml:pos situado dentro de la parcela y fuera de cualquier patio, con 2 decimalesUsar el centroide de una parcela en L o en U, que puede caer fuera del polígono o dentro de un patio
Superficie y punto

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.

Parcela o edificio

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.

AspectoParcela (INSPIRE v4)Edificio
Espacios de nombrescp/4.0 (http://inspire.ec.europa.eu/schemas/cp/4.0) con gml 3.2 y base/3.3 para el Identifierbu-ext2d/2.0, bu-core2d/2.0 y bu-base/3.0, también con gml 3.2
Forma del srsNamehttp://www.opengis.net/def/crs/EPSG/0/ seguido del código, por ejemplo 25830urn:ogc:def:crs:EPSG:: seguido del código, por ejemplo urn:ogc:def:crs:EPSG::25830
Elemento raízFeatureCollection de WFS 2.0 con un member por parcelagml:FeatureCollection con un gml:featureMember por edificio o construcción
AnillosUn Surface por parcela: exterior en sentido horario e interiores en sentido antihorarioHuella en un Surface con los patios como interiores; cada piscina va aparte como OtherConstruction
Superficiecp:areaValue en m² enteros: superficie neta, exterior menos patiosofficialArea con grossFloorArea: superficie construida de todas las plantas
Sin escribir XML

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.

Dudas

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.

Siguiente paso

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 generador