Tags aus OSM Datei vermischen

Hallo,

ich habe mit der Overpass API bestimmte Nodes aus OSM extrahiert um diese als Garmin GPI Datei aufzubereiten. Darunter ist auch eine OSM Datei mit Berggipfeln. In den OSM Tags stehen nun natürlich Name und Höhe getrennt. Wenn ich diese Datei mit gpsbabel ins Garmin GPI Format wandle, dann stehen nur die Namen als Namen des POI drin. Ich hätte aber gerne auch die Höhe. Gibt es daher ein Tool mit dem ich OSM-Tags nach Regeln vermischen kann, mit dem ich also aus:

<tag k="ele" v="972"/>
<tag k="name" v="Nußhardt"/>

einfach:

<tag k="name" v="Nußhardt, 972M"/>

machen kann?

Gruß
unixasket

Wir machen genau das mit einer erweiterten Version von osmfilter.
Es sollte aber auch mit tag_transform gehen …

Gruß Klaus

Was heißt erweiterten Version? Gibt es die irgendwo zum runterladen?

OK, grade gelesen das dies ein osmosis Plugin ist. Also muß ich mich erst mit osmosis beschäftigen.

Gruß
unixasket

wird auch langsam Zeit :wink:

Im Ernst: osmosis soll das mit dem Plugin können - ich bin aber mehrfach daran gescheitert, dieses Plugin zum Rennen zu bekommen. Es gibt (oder gab) da anscheinend eine sehr starke Abhängigkeit zwischen den Versionen. Du musst wirklich das zum aktuellen Osmosis genau passende Plugin benutzen, dann hast du ne Chance.
Ich hab zumindest letztes Jahr kapituliert. Wenn’s klappt, kast du dich ja mal melden.

Gruss
walter

nachtrag: gerade mal geprüft. Bei osmosis 0.42 ist das Plugin bereits dabei “osmosis-0.42/lib/default/osmosis-tagtransform-0.42.jar”. Das fehlte noch bei der 0.41 und musste nachinstalliert werden.

Und wenn’s mit osmosis nicht klappen sollte, hier der Weg mit GNU Emacs.

(dolist (x (osm-objects-from-file "input.osm"))
  (if (and (osm-obj-tag x "name")
	   (osm-obj-tag x "ele"))
     (progn (osm-obj-modify-tag x "name"
		       (concat (osm-obj-tag x "name") ", "
			       (osm-obj-tag x "ele") " m"))))
	    ;; output ...
	    )

Das benötigte OSM-Paket gibt’s im Bedarfsfall bei mir. Allerdings sind die Ausgabefunktionen primär darauf getrimmt, den API-Server zu füttern. Ob die XML-Ausgabe schon ein dateitaugliches Format ausliefern kann, weiß ich gerade selbst gar nicht (deshalb die Kommentarzeile “;; output …”).

Nahmd,

Wenn das Format Deiner Daten, insbesondere die Verwendung des Doppelquotes (") sich nicht ändert und Du ein Element für eine Pipeline braucht, kannst Du ein winziges Perl-Script benutzen:


#!/usr/bin/perl
use strict;
my %T;
while (<>) {
        #-----------------------------------------------------------
        #       Speichere Tag.
        #-----------------------------------------------------------

        if (m#^\s*<tag\s+k="([^"]*)"\s+v="([^"]*)"\s*/>\s*$#) {
                $T{$1}=$2;
                next;
        }

        #-----------------------------------------------------------
        #       Gib tagfreie Zeile aus, wenn keine Tags gespeichert
        #-----------------------------------------------------------

        if (!%T) {
                print $_;
                next;
        }

        #-----------------------------------------------------------
        #       Manipuliere die Tags
        #-----------------------------------------------------------

        if ($T{'name'} && $T{'ele'}) {

                $T{'name'} = $T{'name'} . ", " . int($T{'ele'}) . 'm';
        }

        #-----------------------------------------------------------
        #       Gib die gespeicherten und manipulierten Tags aus.
        #-----------------------------------------------------------

        for my $key (sort keys %T) {
                print "<tag k=\"$key\" v=\"$T{$key}\"/>\n";
        }
        %T=();

        #-----------------------------------------------------------
        #       Gib die tagfreie Zeile aus.
        #-----------------------------------------------------------

        print $_;
}
__END__

Das Teil ist strunzdumm und weiß nicht einmal, wie man XML schreibt. Aber es kann Tags manipulieren.

Gruß Wolf

@Netzwolf: Absolut cool :sunglasses: dein Perl-Script. Herzlichen Dank. Habe es gerade ausprobiert, scheint zu funktionieren.

Schöne grüße
unixasket

Hast du das etwa angezweifelt? Das hab ich mir bei seinen Tips schon lange abgewöhnt :wink:

Gruss
walter

Auch eine Mölichkeit bietet ein XLST auf die gefilterten Daten bzw über overpass.api erhaltenen Daten angewendet:

<?xml version="1.0"?>
<xsl:stylesheet  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">      
  <xsl:output indent="yes" method="xml"/>
   
  <xsl:template match="/">
    <xsl:apply-templates />
  </xsl:template>
  
  <xsl:template match="@*|*|processing-instruction()|comment()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
 
  <xsl:template match="tag[@k='name']">
    <xsl:element name="tag">
      <xsl:attribute name="k">name</xsl:attribute>
      <xsl:attribute name="v">
        <xsl:value-of select="@v"/>
        <xsl:text> (</xsl:text>
        <xsl:value-of select="../tag[@k='ele']/@v"/>
		<xsl:text>)</xsl:text>
      </xsl:attribute>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

danach sollte das name-tag den Gipfelnamen und die Höhe in Klammern enthalten…

Das ist mMn der -einzig- richtige Weg, mit xml-Daten umzugehen. Durch einen xslt-Prozessor jagen und dem die Arbeit überlassen. Ich mach sowas gelegentlich mit Xalan, hatte heute aber nur wenig Zeit, das Filter zu schreiben.

Danke
walter

p.s. Das teil kommt natürlich in meine “Sammlung”. Kann man immer gut gebrauchen.

Jetzt kommt noch das 101 Problem!

Ich erstelle ganz normal eine Garmin IMG

mit den üblichen Tools: splitter.jar [mit --overlap=0 !!!] und mkgmap.jar

Natürlich mit angepassten Regeln

die jage ich durch http://www.glopus.de/tools/ExportPOI.zip

Das Programm spuckt nun alle POI’s die in der IMG sind als ASC-Datei aus.

Dann muß ich nur noch die ASC umbennenen - (gibt die POI’s mit der HEXnummern aus die in den Rgelen (points) festgelegt wurden).

Und aus einer ASC das geweilige Format zu konvertieren ist nur noch formsache!
Es lassen sich auch noch aus der ASC dieverse Bereiche ausschneiden so das man nur 1mal z.B ganz Deuschland erstellen muß und sich jenach diverse Bereiche ausscheiden kann.