Rede Geodésica Nacional

From OpenStreetMap Wiki
Jump to navigation Jump to search

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:

  1. Criar um novo changeset
  2. Submeter os pontos desse changeset
  3. 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>