User:LandShark/GPX2OSM

From OpenStreetMap Wiki
Jump to navigation Jump to search

Увод

Сравнително нов участник съм в проекта. За сега използвам JOSM за редактиране на картата. Още първоначално ми се стори малко досаден процеса на обработване на грубата следа свалена от GPS приемника, за да се вкарат нови участъци в картата. Първоначално ръчно вкарвах нови възли и пътища. Реших че може би ще е от полза ако може грубата следа направо да се превърне във формат на новодобавена поредица от възли на един път. Затова реших да се опитам да направя този шаблон за конвертиране от GPX формат кым OSM. Първоначално нищо не се получаваше, докато не попитах мой приятел и колега Л. Добрев за съвет. С негова помощ се стигна до този XSLT шаблон.

Код

<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:gpx="http://www.topografix.com/GPX/1/1">

  <xsl:strip-space elements="*" />

  <xsl:output method="xml" indent="yes" encoding="UTF-8" standalone="no" />

  <xsl:template match="/gpx:gpx">
    <osm version='0.5' generator='JOSM'>
      <!-- Extract the points. -->
      <xsl:apply-templates select="gpx:trk/gpx:trkseg/gpx:trkpt" mode="nodes">
        <xsl:sort select="gpx:time/text()" />
      </xsl:apply-templates>
      <!-- Create the ways. -->
      <xsl:apply-templates select="gpx:trk" mode="ways" />
    </osm>
  </xsl:template>

  <xsl:template match="gpx:trkpt" mode="nodes">
    <!-- Node with all the needed attributes -->
    <!-- Numbered from -200001 by position. -->
    <xsl:element name="node">
      <xsl:attribute name="id">-<xsl:value-of select="position()+200000" /></xsl:attribute>
      <xsl:attribute name="visible">true</xsl:attribute>
      <xsl:attribute name="lat"><xsl:value-of select="@lat" /></xsl:attribute>
      <xsl:attribute name="lon"><xsl:value-of select="@lon" /></xsl:attribute>
      <!--
      <xsl:attribute name="time"><xsl:value-of select="gpx:time/text()" /></xsl:attribute>
       -->
    </xsl:element>
  </xsl:template>

  <xsl:template match="gpx:trk" mode="ways">
    <xsl:element name="way">
      <xsl:attribute name="id">-<xsl:value-of select="position()+100000" /></xsl:attribute>
      <xsl:attribute name="action">modify</xsl:attribute>
      <xsl:attribute name="visible">true</xsl:attribute>
      <xsl:apply-templates select="gpx:trkseg/gpx:trkpt" mode="ways">
        <xsl:sort select="gpx:time/text()" />
      </xsl:apply-templates>
    </xsl:element>
  </xsl:template>

  <xsl:template match="gpx:trkpt" mode="ways">
    <xsl:element name="nd">
      <xsl:attribute name="ref">-<xsl:value-of select="position()+200000" /></xsl:attribute>
    </xsl:element>
  </xsl:template>

</xsl:transform>

Поставете кода по-горе във файл, наименуван примерно gpx2osm.xsl. След това можете да прилагате този шаблон върху gpx файл (за сега с ограничението че в него се очаква да има само една следа!) за да получите като резултат osm файл.

Например:

xmlstarlet tr gpx2osm.xsl tracks.gpx > trackes.osm