DE:Xapi
Die OSM Extended API (auch xapi) ist eine read-only API, d.h. es sind nur Lesezugriffe erlaubt. Sie basiert auf einer modifizierten Version der Standard API, welche erweiterte Such- und Abfragemechanismen anbietet. Neben den üblichen Kartenabfragen sind viele Möglichkeiten, OSM-Daten z.B. nach Schlüsselwerten zu selektieren, implementiert.
Die verwendete Datenbank ist ein Mirror der zentralen OSM Datenbank. Normalerweise sind Änderungen in der Hauptdatenbank nach 10 Minuten auch auf den Mirror übertragen.
Je nach Tageszeit muss auf Grund der Vielzahl der Zugriffe mit sehr hohen Antwortzeiten und gelegentlich kurzen Ausfällen gerechnet werden.
Osmxapi benutzt eine REST-Style-Schnittstelle mit X-path.
Alle Antworten haben grundsätzlich das gleiche Format wie das Standard-Protokoll, können aber erweiterte Namensräume besitzen. Die Suche nach Schlüsseln verwendet eine X-path-ähliche Syntax zum Spezifizieren der Suchbegriffe.
Contents |
Server
Der xapi-Service wird von mehreren verschiedenen Servern angeboten. Jeder dieser Server kann entweder direkt oder über informationfreeway, der die Anfrage an einen geeigneten Server weiterleitet, angesprochen werden. Auf der englischen Seite sind die Servernamen je nach Verfügbarkeit eingefärbt.
- http://www.informationfreeway.org/api/0.6/... leitet die Anfrage an einen geeigneten Server (derzeit an xapi.openstreetmap.org) weiter.
- http://osmxapi.hypercube.telascience.org/api/0.6/... ein schneller Server in San Diego.
- http://xapi.openstreetmap.org/api/0.6/... der Standard-Server von OSM, ein relativ langsamer Server. (öfter überlastet)
- http://tagwatch.stoecker.eu/osmxapi/... und http://tagwatch.openstreetmap.de/osmxapi/... leiten Anfrage an einen geeigneten Server weiter. (Schnell, unterstützen jedoch nicht die volle Syntax.)
- http://wiki.openstreetmap.org/wiki/Overpass_API neu und schnell
Kartenabfrage
Die Kartenabfrage funktioniert identisch wie die Kartenabfrage auf der Haupt-API und liefert:
- Alle Punkte, die sich im gegebenen Rechteck (Bounding-Box) befinden und alle Relationen, die mindestens einen der Punkte enthalten.
- Alle Wege, die mindestens einen der Punkte innerhalb der Bounding-Box enthalten und alle Relationen, die diese Wege referenzieren. Zusätzlich alle Punkte außerhalb der Bounding-Box, welche durch einen Weg referenziert werden.
GET /api/0.6/map?bbox=links,unten,rechts,oben
mit:
-
linksist die geografische Länge der westlichen Begrenzung der Bounding-Box. -
untenist die geografische Breite der südlichen Begrenzung der Bounding-Box. -
rechtsist die geografische Länge der östlichen Begrenzung der Bounding-Box. -
obenist die geografische Breite der nördlichen Begrenzung der Bounding-Box.
Beispiel
http://www.informationfreeway.org/api/0.6/map?bbox=11.54,48.14,11.543,48.145
( http://xapi.openstreetmap.org/api/0.6/map?bbox=11.54,48.14,11.543,48.145 )
Kommentar
- Im Gegensatz zur Haupt-API, welche nur Anfragen bis 0.25 Quadrat-Grad (z.B. ein Quadrat mit einer Seitenlänge von einem halben Grad) erlaubt, bearbeitet xapi Anfragen bis zu einer Größe von 100 Quadrat-Grad.
- Diese Abfrage ist identisch zu der folgenden Abfrage nach Schlüsseln:
/api/0.6/*[bbox=links,unten,rechts,oben]
Tag Query
Osmxapi verarbeitet Anfragen für alle drei Sorten von Elementen; Punkte, Wege und Relationen.
Punkte
Eine Punkte-Abfrage liefert ein XML-Dokument, welche Punkte zusammen mit den dazugehörigen Tags enthält. Die URL für eine Punkt-Abfrage hat folgende Form:
http://www.informationfreeway.org/api/0.6/node[...]
Dies liefert eine Standard-OSM-API-Antwort, welche die Punkte und ihre Tags enthält. Beispiel:
<?xml version='1.0' standalone='no'?>
<osm version='0.6' generator='osmxapi: OSM Extended API'
xmlns:osmxapi='http://www.informationfreeway.org/osmxapi/0.6'
osmxapi:uri='/api/0.6/node[amenity=hospital]'
osmxapi:planetDate='200803150826'
osmxapi:copyright='2008 OpenStreetMap contributors'
osmxapi:instance='zappy2'>
<node id='672180' lat='48.2111685091189' lon='16.3035366605548' timestamp='2006-09-11T16:28:25+01:00'>
<tag k='amenity' v='hospital'/>
<tag k='name' v='Wilhelminenspital'/>
</node>
<node id='3596186' lat='53.4633699598014' lon='-2.22667910006381' timestamp='2007-06-21T17:10:58+01:00'>
<tag k='amenity' v='hospital'/>
<tag k='name' v='Manchester Royal Infirmary'/>
</node>
...
</osm>
Wege
Für die Abfrage von Wegen hat die URL folgende Form:
http://www.informationfreeway.org/api/0.6/way[...]
Dies liefert wieder ein XML-Dokument, welches die Wege enthält, die auf die Suchbegriffe zutreffen. Für jeden passenden Weg werden außerdem alle referenzierten Punkte geliefert. Eine Antwort könnten so aussehen:
<?xml version='1.0' standalone='no'?>
<osm version='0.6' generator='osmxapi: OSM Extended API'
xmlns:osmxapi='http://www.informationfreeway.org/osmxapi/0.6'
osmxapi:uri='/api/0.6/way[landuse=residential]'
osmxapi:planetDate='200803150826'
osmxapi:copyright='2008 OpenStreetMap contributors'
osmxapi:instance='zappy2'>
<node id='218963' lat='52.5611324692581' lon='-1.79024812573334' timestamp='2006-03-22T16:47:48+00:00'>
</node>
<node id='331193' lat='53.7091237972264' lon='-1.50282510180841' timestamp='2007-03-31T00:09:22+01:00'>
<tag k='highway' v='traffic_signals'/>
<tag k='source' v='Yahoo'/>
</node>
...
<way id='4958218' timestamp='2007-07-25T01:55:35+01:00'>
<nd ref='218963'/>
<nd ref='331193'/>
...
<tag k='landuse' v='residential'/>
<tag k='source' v='landsat'/>
</way>
</osm>
Relationen
Für Relationen sieht die URL so aus:
http://www.informationfreeway.org/api/0.6/relation[...]
Das gelieferte XML-Dokument enthält die Relationen, die auf die Suchbegriffe passen. Für jede Relation werden zusätzlich alle referenzierten Punkte und Wege geliefert. Beispiel:
<?xml version='1.0' standalone='no'?>
<osm version='0.6' generator='osmxapi: OSM Extended API'
xmlns:osmxapi='http://www.informationfreeway.org/osmxapi/0.6'
osmxapi:uri='/api/0.6/way[landuse=residential]'
osmxapi:planetDate='200803150826'
osmxapi:copyright='2008 OpenStreetMap contributors'
osmxapi:instance='zappy2'>
<node ...
<way ...
<relation id='2670' timestamp='2007-10-25T03:05:34Z'>
<member type='way' ref='3992472' role=/>
<member type='way' ref='3992524' role=/>
<member type='way' ref='4253050' role=/>
<member type='way' ref='4253053' role=/>
<member type='way' ref='4266813' role=/>
<member type='way' ref='10285106' role=/>
<tag k='name' v='Fonnereau Way'/>
<tag k='network' v='Ipswich footpaths'/>
<tag k='type' v='route'/>
</relation>
</osm>
Beliebige Elemente
Möchte man nicht nach Elementen (Punkte, Wege, Relationen) selektieren, sondern in einem Aufruf gleich alle Elemente für bestimmte Suchbegriffe erhalten, ist folgende URL zu verwenden:
http://www.informationfreeway.org/api/0.6/*[...]
Dies liefert wieder ein XML-Dokument, welches alle Punkte, Wege und Relationen enthält, die auf die Suchbegriffe passen. Wie auch bei der selektierten Abfrage werden hier für alle passenden Wege die referenzierten Punkte und für alle Relationen die dazugehörigen Punkte und Wege (von diesen natürlich auch die Punkte) geliefert. Beispiel:
<?xml version='1.0' standalone='no'?>
<osm version='0.6' generator='osmxapi: OSM Extended API'
xmlns:osmxapi='http://www.informationfreeway.org/osmxapi/0.6'
osmxapi:uri='/api/0.6/*[amenity=hotel]'
osmxapi:planetDate='200803150826'
osmxapi:copyright='2008 OpenStreetMap contributors'
osmxapi:instance='zappy2'>
<node id='218963' lat='52.5611324692581' lon='-1.79024812573334' timestamp='2006-03-22T16:47:48+00:00'>
</node>
<node id='331193' lat='53.7091237972264' lon='-1.50282510180841' timestamp='2007-03-31T00:09:22+01:00'>
<tag k='amenity' v='hotel'/>
</node>
...
<way id='4958218' timestamp='2007-07-25T01:55:35+01:00'>
<nd ref='218963'/>
<nd ref='331193'/>
...
<tag k='amenity' v='hotel'/>
<tag k='building' v='hotel'/>
</way>
<relation id='123456' timestamp='2007-10-25T03:05:34Z'>
<member type='node' ref='331193' role=/>
<member type='node' ref='331194' role=/>
...
<tag k='amenity' v='hotel'/>
<tag k='operator' v='Premier Inns'/>
<tag k='type' v='operators'/>
</relation>
</osm>
Suchbegriffe
An jede API-Anfrage können Prädikate angehängt werden um festzulegen, welche Elemente selektiert werden sollen. Beispielsweise selektiert [amenity=hospital] alle Elemente, bei denen der Schlüssel amenity den Wert hospital besitzt. Die komplette URL für eine solche Abfrage wäre dann:
http://www.informationfreeway.org/api/0.6/node[amenity=hospital]
Es ist auch möglich mehrere solcher Prädikate anzuhängen, wobei jedes weitere angehängte Prädikat das Ergebnis weiter einschränkt. Momentan ist dies begrenzt auf ein Schlüssel-Prädikat und ein Bounding-Box-Prädikat. Beispiel:
http://www.informationfreeway.org/api/0.6/node[amenity=hospital][bbox=-6,50,2,61]
Diese Anfrage liefert alle Punkte mit amenity=hospital, welche in der genannten Bounding-Box liegen. Die angegebene umfasst ganz England, Wales und Schottland.
Tag-Prädikate
Ein Prädikat hat die Form [key=value]. Beispiel: node[amenity=hospital] passt auf alle Punkte, die den Schlüssel amenity mit dem Wert hospital besitzen, d.h. <tag k="amenity" v="hospital"/>.
Für Schlüssel und Wert können auch Platzhalter verwendet werden:
-
way[construction=*] -
node[*=gate] -
node[*=*]Nicht empfohlen, liefert GByte-weise Daten.
Um verschiedene Werte eines Schlüssels gleichzeitig zu selektieren (also die Vereinigungsmenge aus mehreren Einzelanfragen zu bilden), kann der Vereinigungsoperator benutzt werden. Um beispielsweise alle größeren Straßen zu selektieren:
-
way[highway=motorway|motorway_link|trunk|primary]
Der Vereinigungsoperator funktioniert auch bei Schlüsseln:
-
node[amenity|leisure=golf_course]
Hinweis: Die URL muss in UTF-8 kodiert und URLEncoded sein, falls Nicht-ASCII-Zeichen verwendet werden. Firefox (Version 2.0.0.11 und höher) benutzt als Standard immer noch ISO-8859-1-Kodierung. [1]
BBox Prädikate
Eine andere Form des Prädikats ist die Verwendung des bbox-Pseudo-Schlüssels. Ein Prädikat der Form [bbox=links,unten,rechts,oben] definiert ein Rechteck, welches die Größe des Ergebnisses beschränkt. Nur Elemente, welche teilweise innerhalb dieses Rechtecks liegen, sind im Ergebnisdokument enthalten.
Im Gegensatz zur Standard-OSM-API besteht bei xapi keine Größenbegrenzung für die Bounding-Box, wenn es zusammen mit einem Tag-Prädikat verwendet wird. Ohne Tag-Prädikat ist es auf 100 Quadrat-Grad beschränkt.
Die Standard-Bounding-Box, die angenommen wird, wenn keine spezifiziert wird, umfasst den ganzen Planeten.
Tags
Hauptsächlich sind Anfragen an xapi solche, die eine Schlüssel/Wert-Kombination selektieren. Zusätzlich zu den üblichen Schlüsseln speichert xapi eine Reihe nützlicher Pseudo-Schlüssel. Diese befinden sich alle im osm: Namensraum um Konflikte zu vermeiden.
- osm:user - wenn bei einem Element das user-Attribut gesetzt ist, wird dies im Pseudo-Schlüssel osm:user gespeichert.
- osm:users - enthält eine Liste aller Benutzer, die an diesem Element Änderungen vorgenommen haben (Änderungen vor der Version 0.6 API können nicht berücksichtigt werden)
- osm:timestamp
Benutzung
Die xapi-URLs können prinzipiell in jedem Browser benutzt werden. Einfache Abfragen können aber mehrere MByte Daten produzieren, welche manche Browser in die Knie zwingen. Deshalb ist zu empfehlen Tools wie wget oder curl zu benutzen, um den Datenstrom direkt in eine Datei zu leiten. Beispiel: Folgende Anfrage speichert alle Krankenhäuser in der Datei data.osm:
$ wget http://www.informationfreeway.org/api/0.6/node[amenity=hospital] -O data.osm
Achtung: curl kann Weiterleitungen nicht automatisch behandeln. Deshalb muss hier ein Server direkt angesprochen werden. Außerdem muss die Option -g angegeben, andernfalls würde [...] als Teil der Kommandozeile angesehen.
$ curl -g http://www.informationfreeway.org/api/0.6/node[amenity=hospital] -o data.osm
Statistiken
Statistiken über den Inhalt der xapi-Datenbank: http://osmxapi.hypercube.telascience.org/total.xml. Diese werden tägliche aktualtisiert.
RSS Feed
Mit dem xapi-RSS-feed können Änderungen an Elementen, die auf der persönlichen Watchlist stehen, überwacht werden.
Jedes Element, welches mit watch:deineBenutzerId=1 (oder yes oder true) gekennzeichnet ist, wird von xapi überwacht. Jede Änderung an diesem Element, Löschung eingschlossen, wird im RSS-feed angezeigt. Überwachte Punkte können zu Kategorien gruppiert werden, indem der Wert das Watch-Tags auf einen Kategorie-Namen gesetzt wird. Z.B. watch:80n=churches fügt ein Element der Kategorie churches hinzu.
Um ein Element wieder von der Watchlist zu entfernen genügt es, die Kennzeichnung/das Tag vom entsprechenden Element zu löschen.
Um seine eigene Watchlist zu abonnieren, ist folgende URL zu benutzen:
http://www.informationfreeway.org/api/0.6/watch/yourUserId
Beispiel:
http://www.informationfreeway.org/api/0.6/watch/80n
Um eine bestimmte Kategorie zu abonnieren, muss an diese URL der Name dieser Kategorie angehängt werden. Beispiel:
http://www.informationfreeway.org/api/0.6/watch/80n/churches
Anmerkungen:
- Jeder kann deine Watchlist abonnieren. Du kannst jede Watchlist eines anderen abonnieren.
- Momentan ist die Überwachung nur für Punkte möglich.
- Diese Feature ist noch experimentell, d.h. es kann noch deutliche Änderungen geben.
- Das Hinzufügen oder Entfernen eines Watch-Tags eines anderen Benutzers bewirkt nichts. Das Watch-Tag eines anderen Benutzers kann zwar bearbeitet werden, aber dadurch kann das Element nicht von der Watchlist des anderen Benutzers entfernt oder hinzugefügt werden. Jeder Benutzer kann nur seine eigene Watchlist kontrollieren.
Einschränkungen
- Created_by tags. Diese Tags sind im Allgemeinen uninteressant und werden deshalb aus Performanzgründen unterdrückt.
- Prädikate. Momentan ist jede Anfrage auf ein Tag-Prädikat und ein Bounding-Box-Prädikat beschränkt. Irgendwann werden komplexere Suchanfragen implementiert. Die Angabe mehrerer Bounding-Boxen wäre hervorragend für Anwendungen wie GpsMid - für einzelne Regionen wurde ein Datendownload über xapi in Osm2GpsMid implementiert, was sehr hilfreich ist.
- Syntax der Anfrage. Der Aufbau der Anfrage ist nicht formal definiert und wird auch nicht von einem entsprechenden Parser verarbeitet. Anfragen, die nicht dem obigen Schema entsprechen, können unvorhersagbare Ergebnisse produzieren.
- user. Die diff-Dateien enthalten Benutzerinformationen, die Datei planet.osm aber nicht. Wenn das user-Attribut vorhanden ist, ist es auch in der Antwort enthalten. Eine Liste aller Benutzer, die ein Element bearbeitet haben, wird erstellt und ist in
osmxapi:usersenthalten. Diese Listen enthalten alle Änderungen seit die Datenbank das letzte Mal (12. März 2008) aus einer kompletten planet.osm resynchronisiert wurde.