Es gibt zwei Verfahren die API abzufragen, einmal mit der XAPI Variante und einmal mit dem XML Konstrukt. Dort gibt es auch die Möglichkeit eines UNION Blockes.
Für die Möglichkeiten auf der Clientseite die Ergebnisse zusammenzuführen müsstest Du uns schon etwas mehr von Deiner Umgebung und Deine Kenntnissen sagen.
Vielen Dank für eure Hinweise. Ich habe nun testweise über zwei separate API-Aufrufe zwei Dateien heruntergeladen: Landuse und Rail. Diese habe dann gemäß der verlinkten Anleitung mit osmconvert zusammengeführt. Im so erzeugten Output sind mir jedoch zwei kleinere Fehler aufgefallen:
osmconvert erzeugt zu Anfang ein Objekt mit der Id=0, das man manuell entfernen muss, um die Daten in Osmarender verarbeiten zu können.
osmconvert entfernt offenbar die zuvor mühsam heruntergeladenen Metainformationen. Beim Versuch, den Output in JOSM zu öffnen, kam die Fehlermeldung, dass er das Attribut “version” vermisst.
Kann man diesen Fehlerchen noch irgendwie beikommen?
Ich habs bisher immer so gemacht: von download.geofabrik.de die betreffende Region runtergeladen und danach auf meinem PC gefiltert.
Trotzdem müsste dein Weg natürlich auch gehen.
Sollte natürlich nicht passieren. Hast du die genauen Aufrufe, so dass ich den Fall einmal nachstellen kann?
Kann normalerweise nur dann sein, wenn du die Option --drop-version verwendest. Das solltest du nicht machen, wenn du die Daten später mit JOSM öffnen willst. Falls du die Datei nun trotzdem noch verwenden willst, kannst du den Version-Tag mit --fake-version wieder hinzufügen. Hochladen in die OSM-Datenbank mit JOSM geht dann natürlich nicht, aber das war ja auch nicht dein Ziel, wenn ich das richtig verstanden habe.
Ui, auch ein guter Trick - wieder was Neues für mich.
Zu dem Knoten mit ID 0:
Die Overpass-API nutzt einen XML-Tag, der in OSM-Dateien nicht vorgesehen ist: The data included in this document is from www.openstreetmap.org. It has there been collected by a large group of contributors. For individual attribution of each item please refer to http://www.openstreetmap.org/api/0.6/[node|way|relation]/id/history
Natürlich ist dieser Tag als XML-Tag zulässig, einzelne Programme werden ihn aber nicht erwarten und möglicherweise damit Probleme haben. osmconvert ist geschwindigkeitsoptimiert und spart dadurch Zeit, dass es den Syntax der .osm-Dateien nicht komplett prüft, sondern davon ausgeht, dass er stimmt:
Nach “<no” denkt sich das Programm “Das muss ein Node sein!” und rechnet nicht damit, dass es danach mit “te>” und nicht mit “de>” weitergeht.
Ich hab das eben geändert: die Version 0.5W fragt auch den dritten Buchstaben ab und sollte nicht mehr damit auf die Nase fallen.
Meine Erfahrung mit der Vervollständigung bei JOSM lehrte mich, dass zwei oft genug nicht reicht (noexit/note) aber auch drei zu wenig sein können (landuse/lanes).
Von daher würde ich sage, immer einen mehr als man denkt, dass es reicht.
Naja, das ist entweder schlampiges Programmieren oder der Versuch, das Programm bis zum letzten Bit auf Geschwindigkeit hin zu optimieren. Du kannst es so oder so sehen - und beide Sichtweisen sind irgendwie richtig.
Muss inzwischen ohne diese Option klappen. Die Option wird nach wie vor akzeptiert, aber ignoriert:
if(strcmp(a,"--in-josm")==0) {
// deprecated;
// this option is still accepted for compatibility reasons;
continue; // take next parameter
}
Grund für diese Änderung waren konkrete Ergänzungsvorschläge für den Quellcode, weil die FOSM-Dateien Hochkommas an Stelle von Anführungszeichen verwendeten. Die Programme sollen ja grundsätzlich für beide Lizenzarten verwendet werden können.
Ich steh trotzdem zu diesem Weg. Bei Milliarden von Einzelvergleichen macht es halt schon etwas aus, ob man nur den relevanten Teil einer Zeichenkette vergleicht oder immer die komplette Zeichenkette. osmconvert ist ein Kompromiss, der auf Geschwindigkeit ausgelegt ist. Wer XML-Dateien auf XML-Syntax-Treue parsen will oder damit rechnet, dass das vorausgehende Schreibprogramm einen XML-Syntax verwendet, der für OSM nicht definiert bzw. dokumentiert ist, muss eben ein anderes Programm verwenden - welches dann natürlicherweise langsamer läuft.
Manche Software bietet sogar beide Wege an: einen vollwertigen XML-Parser und eine Art “Abkürzung”, die den XML-Syntax nicht komplett prüft, aber eben schneller ist. Wenn ich mich recht erinnere, macht das osm2pgsql so. Den Luxus dieser Auswahl hab ich mir gespart, weil die “Abkürzung” sehr zuverlässig funktioniert und halt einfach flott arbeitet.
Aber wenn ich es richtig verstehe, dann musst du vergleichen, ob ein gegebener String einem von n gegebenen Werten entspricht. Dazu eignet sich ein TreeSearch Algorithmus. Ich habe es mit solch einem Algorithmus geschafft, ca. 800 MB/sec auf 10000 Suchbegriffe GLEICHZEITUNG zu untersuchen (single thread).
Dazu muss die Liste der Suchbegriffe in eine Baumstruktur umgewandelt werden. Jeder Node besteht aus einem Array von z.B. 256 (für 1 Byte) Child Nodes. Am Anfang sind alle Childnodes null. Nun wird für jeden Buchstaben des Suchwortes nacheinander ausgehend vom root-Node ein neuer Knoten erzeugt (falls noch keiner existiert).
Beim Suchen:
node = root;
c = firstchar;
while (node!=null && node.hit==null) {
node = node[c];
c = c.next;
}
if (node!=null) {
Treffer mit node.hit !
}
Das schöne ist, das die Anzahl der Suchworte in Baum fast keine Rolle spielt. Man muss für jedes Zeichen des zu untersuchenden Strings immer nur EINEN Vergleich vornehmen!
Falls noch Fragen offen sind, helfe ich dir gerne!
Hallo mdk, danke für das Angebot und die Mühe, die du dir gemacht hast!
Der Fall ist aber aus meiner Sicht so nicht vergleichbar, weil es in .osm-Dateien auf der äußeren Ebene nur sehr wenige verschiedene XML-Tags gibt. Zum Beispiel: “<node”, “<way”, “<relation”, "<create, “<modify”, “delete”. Hier ist ein hart codierter Vergleich deutlich schneller als die Suche in einem Baum.
Bei anderen Aufgaben (Bounding-Polygon, pbf- und o5m-Stringtabellen, --all-to-nodes usw.) verwendet das Programm je nach Eignung der Methode verkettete Listen, Hash-Tabellen, Binärsuche usw. Wenn du dort trotzdem irgendwo Optimierungsmöglichkeiten entdeckst, immer her damit!
nach langer Zeit noch etwas Senf von mir zu diesem Thema. Unten mein Perlskript, das ich mir auf die Schnelle zusammengepfuscht habe. Es erwartet als ersten übergebenen Parameter eine Koordinatenbox der Form, wie sie auch für XAPI verwendet wird also bspw. “1.234,56.789,9.876,57.321” und als zweiten Parameter den Pfad zu einer (lokalen) Datei mit Renderregeln für Osmarender. Das Skript lädt dann alle im Rulefile verwendeten Tagklassen für die angegebene Box runter und fasst diese Daten anschließend mit osmconvert zusammen. Im Skript selbst muss nur der korrekte Pfad zu osmconvert eingetragen werden.
Die so entstehende output.osm-Datei kann anschließend an Osmarender zum Rendern übergeben werden. Reduziert die herunterzuladende Datenmenge (und damit auch die Renderzeit) ganz erheblich, wenn man nur sehr wenige Elemente in relativ großen Bereichen rendern will.
Ohne jede Garatie für Funktionieren und eventuell auftretende Probleme oder Schäden. Aber vielleicht hilfts ja dem einen oder anderen:
use strict;
my $coords=$ARGV[0];
my $rulefile=$ARGV[1];
my $osmconvertpath='/pfad/zu/osmconvert/osmconvert32';
my $i=0;
my $wgetcmd;
my $osmconvertcmd;
my $delcmd;
my @elements;
#Koordinaten aus erstem Parameter filtern
$coords=~s/[^\d,.]//g;
#Benötigte Klassen aus der Rule-Datei auslesen
open INPUT, "<$rulefile" or die "Can't open Rulefile $rulefile: $1";
while (<INPUT>){
if (m!^<rule e=".*?" k="(.*?)" v="(.*?)">!){
push @elements, "$1=$2";
}
}
close INPUT;
#Daten herunterladen
foreach (@elements){
$wgetcmd="wget -O $i.osm \"http://www.overpass-api.de/api/xapi?*[bbox=$coords][$_][\@meta]\"";
`$wgetcmd`;
$osmconvertcmd.="$i.osm ";
$i++;
}
#Einzelne Dateien zusammenführen
$osmconvertcmd="$osmconvertpath $osmconvertcmd--fake-version -o=".'output.osm';
`$osmconvertcmd`;
#Einzeldateien löschen
$i=0;
foreach (@elements){
$delcmd="rm ".$i.'.osm';
`$delcmd`;
$i++;
}
print "Fertig\n";