Rede Geodésica Nacional
Importação da Rede Geodésica Nacional
A importação da rede geodésica nacional é importante porque a própria rede é constituída por entidades físicas que queremos ver no mapa OSM (e que são marcadas como <tag k="man_made" v="survey_point"/> e, acima de tudo, porque constituem óptimas referências para validar imagens de satélite que se estejam a utilizar.
Esta importação serviu para, numa análise sumária, verificar que as imagens do Bing estão bem georreferenciadas.
Obtenção da Rede Geodésica Nacional
A RGN pode ser obtida a partir do site do IGP, mais precisamente a partir de http://www.igeo.pt/produtos/geodesia/vg/rgn/rgn.asp. Nessa página está um ficheiro RGN_Portugal.zip que se pode descarregar. Depois de descomprimido, obtém-se um RGN_Portugal.kmz, que contém a informação necessária. Como o kmz é um kml comprimido, é necessário descomprimir o kmz. É gerado um arquivo doc.kml.
wget http://www.igeo.pt/produtos/geodesia/vg/rgn/docs/RGN_Portugal.zip unzip RGN_Portugal.zip unzip RGN_Portugal.kmz
Transformar o documento KML em GPX (passo opcional)
Se se quiser ter uma ideia como a Rede aparece no OSM, pode-se converter o kml para gpx. O gpx gerado pode ser carregado no JOSM.
ogr2ogr -skipfailures -f "GPX" RGN_Portugal.gpx doc.kml
Transformar o KML num documento OSM
Para se fazer o upload de todos os marcos geodésicos, transformei o KML num documento no formato OsmChange, de acordo com a API 0.6. A transformação é feita com base numa especificação XSL, kml2osm.xsl. Este documento XSL está no fim da página. Antes da transformação, retirou-se o name space da tag kml, para simplificar a escrita do XSL.
sed -i 's/<kml.*/<kml>/' doc.kml xmlstarlet tr kml2osm.xsl < doc.kml > rgn.osm
Com isto, obteve-se um documento XML (no formato OsmChange), que irá ser submetido ao OSM.
O documento tem o seguinte aspecto:
<?xml version="1.0" encoding="UTF-8"?> <osmChange> <create> <node id="-1" version="1" changeset="7337815" lon="-8.44818655833333" lat="40.5808570388889"> <tag k="name" v="ÁGUEDA"/> <tag k="ref" v="137"/> <tag k="man_made" v="survey_point"/> </node> <node id="-2" version="1" changeset="7337815" lon="-8.35049121111111" lat="40.590555725"> <tag k="name" v="CASTANHEIRA"/> <tag k="ref" v="336"/> <tag k="man_made" v="survey_point"/> </node> <node id="-3" version="1" changeset="7337815" lon="-8.47212455555556" lat="40.7196347222222"> <tag k="name" v="SENHORA DO SOCORRO"/> <tag k="ref" v="869"/> <tag k="man_made" v="survey_point"/> </node> (...) <node id="-999" version="1" changeset="7337815" lon="-8.12412064722222" lat="40.6912991305555"> <tag k="name" v="PENA"/> <tag k="ref" v="690"/> <tag k="man_made" v="survey_point"/> </node> </create> </osmChange>
Utilização directa da API do OSM
Tento o ficheiro com todos os marcos a inserir no OSM, utiliza-se a API para fazer o upload directo desta informação. A operação é feita em 3 passos:
- Criar um novo changeset
- Submeter os pontos desse changeset
- Encerrar o changeset
Criar um novo changeset
Para criar um changeset, submete-se o seguinte documento criachangeset.osm:
<osm> <changeset> <tag k="created_by" v="jgrocha"/> <tag k="comment" v="Rede Geodésica Nacional"/> <tag k="source" v="Instituto Geográfico Português"/> </changeset> </osm>
com o comando:
curl -u "jgr@di.uminho.pt:pinguim" -i -T criachangeset.osm "http://api.openstreetmap.org/api/0.6/changeset/create"
É retornado um identificar do changeset.
7337815
Submeter os pontos desse changeset
curl -u "jgr@di.uminho.pt:pinguim" -H 'Content-type: text/xml' -X POST -d @rgn.osm http://api.openstreetmap.org/api/0.6/changeset/7337815/upload
Demora... demora, demora, mas por fim retorna um XML <diffResult>(...)</diffResult>.
Encerrar o changeset
curl -u "jgr@di.uminho.pt:pinguim" -X PUT http://api.openstreetmap.org/api/0.6/changeset/7337815/close
Se tudo correr bem, não retorna nada.
Verificar o upload da Rede Geodésica Nacional
Seguir o link http://www.openstreetmap.org/browse/changeset/7337815.
Apêndice
O documento XSL kml2osm.xsl utilizado é o seguinte:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl" exclude-result-prefixes="xd" version="1.0"> <xsl:output version="1.0" encoding="UTF-8" method="xml" indent="yes" omit-xml-declaration="no"/> <xsl:strip-space elements="*"/> <xsl:template match="/"> <osmChange> <create> <xsl:apply-templates select="//Placemark"/> </create> </osmChange> </xsl:template> <xsl:template match="Placemark"> <node> <xsl:attribute name="id"> <xsl:text>-</xsl:text> <xsl:value-of select="count(./preceding::Placemark)+1"/> </xsl:attribute> <xsl:attribute name="version"> <xsl:value-of select="1"/> </xsl:attribute> <xsl:attribute name="changeset"> <xsl:value-of select="7337815"/> </xsl:attribute> <xsl:apply-templates select="Point/coordinates"/> <xsl:apply-templates select="name"/> <xsl:apply-templates select="description"/> <tag k="man_made" v="survey_point"/> </node> </xsl:template> <xsl:template match="name"> <tag k="name"> <xsl:attribute name="v"> <xsl:value-of select="."/> </xsl:attribute> </tag> </xsl:template> <xsl:template match="coordinates"> <xsl:attribute name="lon"> <xsl:value-of select="substring-before( text(),',')"/> </xsl:attribute> <xsl:attribute name="lat"> <xsl:value-of select="substring-after( text(),',')"/> </xsl:attribute> </xsl:template> <xsl:template match="description"> <tag k="ref"> <xsl:attribute name="v"> <xsl:value-of select="substring-before( substring-after(text(),'num='), '"')"/> </xsl:attribute> </tag> </xsl:template> </xsl:stylesheet>