Auflisten von POIs aus Openstreetmap mit XAPI und XSL

August 24, 2010

Vor einiger Zeit wurde ich auf das Schorndorfer Stadtwiki Schopedia aufmerksam, dass von ein paar Freiwilligen betreut wird. Mir fiel auf, dass im Wiki einige Seiten mit Listen von z.B. Gastätten oder Museen angelegt wurden.

Als aktiver Openstreetmap Mapper habe ich mich natürlich gleich gefragt, ob es nicht möglich wäre die Daten einfach aus Openstreetmap auszulesen, da diese dort größtenteils schon vorhanden sind. Damit könnte man sich das aufwendige Pflegen der Daten im Wiki sparen.

Für die Abfragen von POIs aus Openstreetmap kann man die XAPI verwenden. An die API-Server kann man über http sehr leicht Anfragen schicken. Als Antwort erhält man die gewünschten Daten im XML Format.

Beispiel:

Folgender Link liefert alle Nodes vom Typ amenity=restaurant im XML-Format zurück. Die bounding box (bbox) schränkt das Gebiet auf Schorndorf ein:

http://xapi.openstreetmap.org/api/0.6/node[amenity=restaurant][bbox=9.4908142,48.7810801,9.5660019,48.8387351]

Hier ein Ausschnitt aus den zurückgelieferten Daten:

<?xml version='1.0' standalone='no'?>
<osm version='0.6' generator='xapi: OSM Extended API 2.0' xmlns:xapi='http://www.informationfreeway.org/xapi/0.6' xapi:uri='/api/0.6/node[amenity=restaurant|fast_food|pub|cafe][bbox=9.4908142,48.7810801,9.5660019,48.8387351]' xapi:planetDate='20100824' xapi:copyright='2010 OpenStreetMap contributors' xapi:license='Creative commons CC-BY-SA 2.0' xapi:bugs='For assistance or to report bugs contact 80n80n@gmail.com' xapi:instance='zappyOsm'>
 <node id='721241970' lat='48.830856' lon='9.5116892' user='mabe75' timestamp='2010-05-04T19:01:28Z' uid='260302' version='1' changeset='4607010'>
 <tag k='amenity' v='restaurant'/>
 <tag k='name' v='Lamm'/>
 </node>
 <node id='392682646' lat='48.8315734' lon='9.5468864' user='MattGPS' timestamp='2010-05-11T19:00:20Z' uid='12973' version='3' changeset='4671372'>
 <tag k='amenity' v='restaurant'/>
 <tag k='name' v='Gasthaus an der Wieslauf'/>
 </node>
 <node id='319597380' lat='48.8277913' lon='9.5477029' timestamp='2008-12-17T21:13:15Z' version='1' changeset='444629'>
 <tag k='amenity' v='restaurant'/>
 <tag k='name' v='Gasthaus zur Linde'/>
 </node>
[...]

Nun haben wir die Daten im XML Format. Die Daten lassen sich nun mit Hilfe einer XSL Transformation (XSLT) z.B. in ansprechenden HTML-Code umwandeln.

Hierfür habe ich ein einfaches XSL Stylesheet (nodes.xsl) erstellt. Dieses erzeugt eine einfache HTML-Datei, die eine Openlayer Karte und eine Tabelle mit allen gefundenen Nodes enthält. Für jede Node befindet sich in der Karte ein Marker. Ich verwende zum Durchführen der XSL-Transformation die Anwendung xsltproc.

wget 'http://xapi.openstreetmap.org/api/0.6/node[amenity=restaurant][bbox=9.4908142,48.7810801,9.5660019,48.8387351]'
xsltproc nodes.xsl nodes.xml  > nodes.html

Den Quellcode für das XSL Stylesheet gibts hier als PDF: nodes.xsl.

Doku über die XAPI von Openstreetmap findet ihr hier: http://wiki.openstreetmap.org/wiki/Xapi

Hier ist ein einfaches Beispiel zum Anzeigen einer Karte mit Markern (wird auch in meinem XSL Code verwendet): http://wiki.openstreetmap.org/wiki/OpenLayers_Marker

Update: Inzwischen gibt es hier eine Demo Seite mit obigem Beispiel

<?xml version=’1.0′ standalone=’no’?>
<osm version=’0.6′ generator=’xapi: OSM Extended API 2.0′ xmlns:xapi=’http://www.informationfreeway.org/xapi/0.6&#8242; xapi:uri=’/api/0.6/node[amenity=restaurant|fast_food|pub|cafe][bbox=9.4908142,48.7810801,9.5660019,48.8387351]’ xapi:planetDate=’20100824′ xapi:copyright=’2010 OpenStreetMap contributors’ xapi:license=’Creative commons CC-BY-SA 2.0′ xapi:bugs=’For assistance or to report bugs contact 80n80n@gmail.com’ xapi:instance=’zappyOsm’>
<node id=’721241970′ lat=’48.830856′ lon=’9.5116892′ user=’mabe75′ timestamp=’2010-05-04T19:01:28Z’ uid=’260302′ version=’1′ changeset=’4607010′>
<tag k=’amenity’ v=’restaurant’/>
<tag k=’name’ v=’Lamm’/>
</node>
<node id=’392682646′ lat=’48.8315734′ lon=’9.5468864′ user=’MattGPS’ timestamp=’2010-05-11T19:00:20Z’ uid=’12973′ version=’3′ changeset=’4671372′>
<tag k=’amenity’ v=’restaurant’/>
<tag k=’name’ v=’Gasthaus an der Wieslauf’/>
</node>
<node id=’319597380′ lat=’48.8277913′ lon=’9.5477029′ timestamp=’2008-12-17T21:13:15Z’ version=’1′ changeset=’444629′>
<tag k=’amenity’ v=’restaurant’/>
<tag k=’name’ v=’Gasthaus zur Linde’/>
</node>

Advertisements

%d bloggers like this: