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:
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 …”).
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.
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.
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.