domingo, 24 de enero de 2016

GML PARCELA CATASTRAL: COMO GENERAR UN FICHERO DE COORDENADAS GML VÁLIDO PARA CATASTRO.

GML PARCELA CATASTRAL: COMO GENERAR UN FICHERO DE COORDENADAS GML VÁLIDO PARA CATASTRO.


Recientemente un compañero me llamó para preguntarme como podía convertir un fichero DXF en un fichero GML para enviarlo a Catastro (Español) . Mi respuesta fue rápida y sencilla, “te vas a QGIS (por ejemplo) importas el DXF y lo guardas como GML y listo”….. Con este proceso efectivamente se crea un GML pero por desgracia no es reconocido por catastro para ser validado. El motivo de esto es que el GML que sirve para el Catastro sigue el protocolo INSPIRE que es el que ha adoptado Catastro como estándar y por tanto no todos los ficheros GML sirven (por lo visto hay varios tipos de ficheros GML y cada programa lo genera de una manera).

Quiero recordar que el GML es el fichero que sirve para el intercambio de información del Catastro con Registradores y Notarios y que estos, piden ya a los Técnicos Competentes  este fichero para que sea entregado junto a su informe de medición y planos en PDF y certificado de coordenadas.

Viendo que no servía cualquier GML, pensé que habrían hecho un programa conversor para convertir DXF o DWG en GML (Inspire) válido para catastro, pero a fecha de hoy (24/01/2016) no existe tal conversor, ni Script de SIG o Software que lo haga directamente o al menos yo no lo he encontrado. De hecho desde la web de la Sede Electrónica de Catastro (Coordinación Catastro - Registro), en el apartado de documentación técnica explican una forma de crear un GML válido de manera manual, editando el código directamente con un editor de texto, supongo que a falta de un programa que lo haga. En la entrada anterior del Blog hablé de esto mismo.


En la hoja 10 del fichero PDF de las Instrucciones Técnicas para la generación de un GML de parcela catastral (Cómo generar un GML de Parcela Catastral) se explica que cambiando algunas líneas del código del fichero que ponen como ejemplo se puede crear un GML válido para el catastro, pero yo a partir de ese mismo ejemplo, ni tan siquiera logré que pudiera ser leído por un SIG como QGIS  (debe existir algún fallo en el código que hace que no sea reconocido como GML, una sola coma o comilla o punto mal puesta u omitida, podría dar al traste con el resultado final).

Tras probar varias veces intentando modificar el “Ejemplo Explicativo de Catastro” y no conseguirlo, descargué un GML de una parcela catastral real mediante mi certificado digital, y tocando ese código y cambiando algunas cosas del fichero original, he conseguido obtener un estándar de GML válido para el Catastro (lo he probado en catastro cambiando los datos para distintas parcelas y funciona perfectamente). (Probablemente se pueda hacer un GML con menos código, de hecho en la parte del Estándar creado, he puesto muchos datos "a cero" pues no influyen en el resultado final por lo que algunas líneas de estas pueden sobrar).


El código resultante de este fichero es el siguiente (con un ejemplo ya terminado de una parcela real).

(Nota: como no cabe todo el código en una captura de pantalla, he tenido que cortarlo y pegarlo y ponerle flechas para saber donde va cada cosa).

EXPLICACIÓN DE COMO CAMBIAR EL CÓDIGO PARA GENERAR UN GML DE UNA PARCELA.

A continuación voy a explicar de manera gráfica que partes del código anterior son las que hay que cambiar para generar un fichero GML para una parcela catastral determinada (para generar un GML para varías parcelas habría que añadir de nuevo parte del código anterior, pero creo que es ya liar demasiado para hacerlo por lo que recomiendo presentar tantos ficheros GML como parcelas se quieran presentar pues el procedimiento de validación permite insertar varios ficheros a la vez en una misma sesión).

El siguiente pantallazo muestra las partes del código anterior que debe modificarse para adaptarlo a cada parcela catastral.



Una vez editado el fichero anterior, recordad ponerle cambiar la extensión .txt por .gml (GML) para que sea un fichero GML real. (Importante que las coordenadas tengan el separador decimal como punto y un haya espacio entre X e Y y que la superficie en caso de llevar decimal, sea también un punto, también conviene que copiar coordenada inicial al final a fin de cerrar el polígono).

Yo además recomiendo comprobar que lo que se ha creado es un GML “legible” y para ello recomiendo probarlo por ejemplo en QGIS (que es software SIG libre) y que lee ficheros GML de manera fácil (http://www.qgis.org/es/site/).

Descargamos QGIS e insertamos el GML creado.




Al final tenemos que ver algo parecido a esto.


Si llegamos a este punto y hemos seguido los pasos anteriores en la modificación del código GML, con mucha probabilidad (salvo error) el fichero creado tiene todas las trazas para ser validado correctamente por Catastro.

Por lo que ya podemos intentarlo en la SEDE ELECTRÓNICA DE CATASTRO.
Entramos en http://www.sedecatastro.gob.es/ pinchamos en VALIDACIÓN GRÁFICA ALTERNATIVA

Nos pedirá que pinchemos en nuestro certificado digital o sistema CLAVE y saldrá la pantalla siguiente, donde tendremos que meter nuestro datos como técnicos, cliente, precisión, …



En la siguiente pantalla metemos las referencias catastrales de las parcelas a validar (solo los primeros 14 números, que en rústica es hasta el número de parcela, dejando sin poner las últimas 6 cifras, es decir, los cuatro ceros y las dos letras finales).


Pinchamos en continuar y pasamos a la pantalla de inserción del/los fichero/s GML.


Agregamos la parcela e iniciamos la carga (aquí es donde sabremos si el fichero GML es válido o no)



Si el fichero GML es válido (estructuralmente para ser leído por Catastro), aparecerá así:


En este caso vemos que se ha cargado el fichero correctamente, vemos que se ha dibujado la parcela, que esta tiene un contorno en negro (perímetro) y un relleno (amarillo) y además observamos que tiene su número (que en este caso es el 65 añadido de PEFV-GPS, que son mis iniciales y el método de medición real que he usado y que he puesto para comprobar cómo quedaría estéticamente en el GML final).

En la parte inferior podemos activar CARTOGRAFÍA CATASTRAL y en otras cartografías ver lo que queremos ver bajo la parcela GML insertada (Plano Catastral o Plano Catastral con la Ortofotografía).




El proceso de Validación de una representación gráfica alternativa se explica aquí:

Llegados a este punto se puede decir que desde el punto de vista técnico hemos logrado un GML válido y apto para CATASTRO, sin saber aún porque hasta ahora solo he hecho unas pruebas si surgirá un problema posterior que no haya previsto en este proceso.

Comentar también que realizado una hoja de cálculo (Excel) que automatiza los cambios en el fichero GML anterior para cada parcela y que subiré en cuanto logre limar un detalle que no acaba de gustarme en el resultado final y que requiera de una pequeña interacción.

Este EXCEL muestra una hoja de datos inicial donde hay que introducir la superficie, sistema de referencia, número de parcela y las coordenadas del perímetro de la parcela (copiadas y pegadas desde otro Excel por ejemplo). Y con tan solo pinchar un botón de macro, saca un fichero GML y que es el mismo que pongo más adelante.




Una vez pinchado en el botón GENERAR GML se guarda el fichero GML en C:/, pero como he comentado el fichero GML final generado tiene un pequeño error que requiere de una pequeña intervención por parte del usuario y que me gustaría limar antes de compartir el EXCEL (realmente es una minucia, pero quiero ver si lo puedo arreglar).

A continuación copiaré el código de esta parcela en concreto para que quien lo desee pueda usarlo como código de partida. En varias pruebas que he hecho cambiando las coordenadas ha funcionado sin problemas.
Explicado mejor aquí
Enlace de descarga aquí.





CÓDIGO GML DE REFERENCIA (Copiar entero y cambiar solo lo que está en azul, excepto los enlaces).


<?xml version="1.0" encoding="utf-8"?>
<!--Parcela Catastral de la D.G. del Catastro FV.-->
<!-- Geometria en formato GML codigo versionado por PEDRO E. FUSTER (GESPASUR)  http://gespasur.blogspot.com.es/-->
<gml:FeatureCollection gml:id="ES.SDGC.CP" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:cp="urn:x-inspire:specification:gmlas:CadastralParcels:3.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:x-inspire:specification:gmlas:CadastralParcels:3.0 http://inspire.ec.europa.eu/schemas/cp/3.0/CadastralParcels.xsd">
<gml:featureMember>
<cp:CadastralParcel gml:id="ES.SDGC.CP.Parcela-65">
<gml:boundedBy>
<gml:Envelope srsName="urn:ogc:def:crs:EPSG::25830">
  <gml:lowerCorner>0 0</gml:lowerCorner>
  <gml:upperCorner>0 0</gml:upperCorner>
</gml:Envelope>
</gml:boundedBy>
<cp:areaValue uom="m2">11034.75</cp:areaValue>
<cp:beginLifespanVersion>1900-01-11T00:00:00</cp:beginLifespanVersion>
<cp:endLifespanVersion xsi:nil="true" nilReason="other:unpopulated"></cp:endLifespanVersion>
<cp:geometry>
<gml:MultiSurface gml:id="MultiSurface_ES.SDGC.CP.0" srsName="urn:ogc:def:crs:EPSG::25830">
  <gml:surfaceMember>
  <gml:Surface gml:id="Surface_ES.SDGC.CP.0" srsName="urn:ogc:def:crs:EPSG::25830">
  <gml:patches>
  <gml:PolygonPatch>
  <gml:exterior>
      <gml:LinearRing>
        <gml:posList srsDimension="2">
628977.5934 4270639.4075
628962.9994 4270649.2553
628934.6654 4270668.5733
628932.9774 4270669.5833
628931.8114 4270669.2533
628898.5899 4270692.7863
628898.582 4270692.787
628898.1184 4270693.1203
628801.3634 4270643.9313
628768.4554 4270629.109
628800.4194 4270568.5723
628810.8434 4270548.1223
628809.8994 4270557.7153
628805.7004 4270600.5173
628859.2844 4270626.8653
628882.0434 4270631.2493
628907.2784 4270631.3073
628906.6554 4270605.6473
628921.5094 4270594.8893
628923.8594 4270593.1563
628939.0969 4270581.8525
628957.8234 4270610.0633
628977.5934 4270639.4075

</gml:posList>
      </gml:LinearRing>
  </gml:exterior>
  </gml:PolygonPatch>
  </gml:patches>
  </gml:Surface>
  </gml:surfaceMember>
</gml:MultiSurface>
</cp:geometry>
<cp:inspireId xmlns:base="urn:x-inspire:specification:gmlas:BaseTypes:3.2">
<base:Identifier>
  <base:localId>Parcela-65</base:localId>
  <base:namespace>ES.SDGC.CP</base:namespace>
</base:Identifier>
</cp:inspireId>
<cp:label>64</cp:label>
<cp:nationalCadastralReference>0</cp:nationalCadastralReference>
<cp:referencePoint>
<gml:Point gml:id="ReferencePoint_ES.SDGC.CP.0" srsName="urn:ogc:def:crs:EPSG::0">
  <gml:pos>0 0</gml:pos>
</gml:Point>
</cp:referencePoint>
<cp:validFrom xsi:nil="true" nilReason="other:unpopulated"></cp:validFrom>
<cp:validTo xsi:nil="true" nilReason="other:unpopulated"></cp:validTo>
<cp:zoning xlink:href="#ES.SDGC.CP.Z.0"></cp:zoning>
</cp:CadastralParcel>
</gml:featureMember>
<gml:featureMember>
<cp:CadastralZoning gml:id="ES.SDGC.CP.Z.0">
<gml:boundedBy>
<gml:Envelope srsName="urn:ogc:def:crs:EPSG::0">
<gml:lowerCorner>0 0</gml:lowerCorner>
<gml:upperCorner>0 0</gml:upperCorner>
</gml:Envelope>
</gml:boundedBy>
<cp:beginLifespanVersion>1900-01-01T00:00:00</cp:beginLifespanVersion>
<cp:endLifespanVersion xsi:nil="true" nilReason="other:unpopulated"></cp:endLifespanVersion>
<cp:estimatedAccuracy uom="m">1.5</cp:estimatedAccuracy>
<cp:geometry>
<gml:MultiSurface gml:id="MultiSurface_ES.SDGC.CP.Z.0" srsName="urn:ogc:def:crs:EPSG::0">
<gml:surfaceMember>
<gml:Surface gml:id="Surface_ES.SDGC.CP.Z.0" srsName="urn:ogc:def:crs:EPSG::0">
<gml:patches>
<gml:PolygonPatch>
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="2">0 0 0 0 0 0 0 0 0 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:PolygonPatch>
</gml:patches>
</gml:Surface>
</gml:surfaceMember>
</gml:MultiSurface>
</cp:geometry>
<cp:inspireId xmlns:base="urn:x-inspire:specification:gmlas:BaseTypes:3.2">
<base:Identifier>
<base:localId>0</base:localId>
<base:namespace>ES.SDGC.CP.Z</base:namespace>
</base:Identifier>
</cp:inspireId>
<cp:label>0</cp:label>
<cp:level codeSpace="urn:x-inspire:specification:gmlas:CadastralParcels:3.0/CadastralZoningLevelValue">1stOrder</cp:level>
<cp:levelName>
<gmd:LocalisedCharacterString locale="esp">MAPA</gmd:LocalisedCharacterString>
</cp:levelName>
<cp:nationalCadastalZoningReference>0</cp:nationalCadastalZoningReference>
<cp:originalMapScaleDenominator>1</cp:originalMapScaleDenominator>
<cp:referencePoint>
<gml:Point gml:id="ReferencePoint_ES.SDGC.CP.Z.0" srsName="urn:ogc:def:crs:EPSG::0">
<gml:pos>0 0</gml:pos>
</gml:Point>
</cp:referencePoint>
<cp:validFrom xsi:nil="true" nilReason="unknown" />
<cp:validTo xsi:nil="true" nilReason="unknown" />
</cp:CadastralZoning>
</gml:featureMember>
</gml:FeatureCollection>


Espero que sea de vuestro interés y le podáis dar utilidad por lo menos a las explicaciones de como generar el GML a mano.

Quiero aclarar que este proceso solo soluciona el problema de crear el fichero GML válido para ser subido a catastro en "la validación de una representación gráfica alternativa" y catastro lo admite, pero no hay que confundir con la validación de lo que contenga el GML, que es un proceso posterior a la subida del fichero GML al servidor de Catastro.

(Recordad que el código creado es para una sola parcela, si el trabajo incluye más parcelas y se quieren meter más parcelas en un mismo fichero hay que añadir más código a partir de los "feature members" del final o dejarlo como está y generar un GML para cada parcela que se pueden meter en el mismo procedimiento (agregar y cargar más fichero GML)).
Saludos.