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>