Open Streetmap API Tutorial: Umkreissuche

Für ein Hochschulprojekt („Ortsbezogene Freizeitgestaltung“) gilt es, die Open Streetmap API zum finden von POI’s in der Umgebung zu verwenden. In Darmstadt ist auf der OSM fast jede Parkbank kategorisiert. Also frisch ans Werk!

API Overflow! – Kurzvorstellung der einzelnen APIs

  • Die eigentliche OSM-Api (aktuell: v0.6) fokussiert sich eher auf das Erstellen, Bearbeiten und Auslesen von speziellen Punkten. Weniger hilfreich für den Zweck der Umkreissuche.
  • Die Overpass (X)API macht uns schon glücklicher. Per REST geben wir den Typ der zu suchenden Punkte in einem einzugrenzenden Bereich an. Beispiele folgen.
  • Die Nominatim API ist am simpelsten zu verwenden: Einfach als Query-Parameter „Pub, Darmstadt“ angehangen und los gehts. Auch dazu gleich mehr.

Die Noninatim API

Alle Cafes in Darmstadt gesucht?

http://nominatim.openstreetmap.org/search?q=cafe+darmstadt&format=xml&polygon=0&addressdetails=1
<searchresults timestamp="Mon, 17 Oct 11 12:20:28 -0400" attribution="Data Copyright OpenStreetMap Contributors, Some Rights Reserved. CC-BY-SA 2.0." querystring="cafe darmstadt" polygon="false" exclude_place_ids="6854404,1531978,7020825,8296635,12289661,4985586,7174479,5407915,4156862,1062456" more_url="http://open.mapquestapi.com/nominatim/v1/search?format=xml&exclude_place_ids=6854404,1531978,7020825,8296635,12289661,4985586,7174479,5407915,4156862,1062456&accept-language=de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4&addressdetails=1&q=cafe+darmstadt">
	<place place_id="6854404" osm_type="node" osm_id="634426402" place_rank="30" boundingbox="50.0020887756,50.0220925903,8.57511543274,8.59511638641" lat="50.0120924" lon="8.5851157" display_name="cafe, Aschaffenburger Straße, Walldorf, Mörfelden-Walldorf, Groß-Gerau, Regierungsbezirk Darmstadt, Hessen, 64546, Bundesrepublik Deutschland (Landmasse)" class="amenity" type="cafe" icon="http://open.mapquestapi.com/nominatim/v1/images/mapicons/food_cafe.p.20.png">
		<cafe>cafe</cafe>
		<road>Aschaffenburger Straße</road>
		<suburb>Walldorf</suburb>
		<city>Mörfelden-Walldorf</city>
		<county>Groß-Gerau</county>
		<state_district>Regierungsbezirk Darmstadt</state_district>
		<state>Hessen</state>
		<boundary>64546</boundary>
		<country>Bundesrepublik Deutschland (Landmasse)</country>
		<country_code>de</country_code>
	</place>
	<place place_id="1531978" osm_type="node" osm_id="307367574" place_rank="30" boundingbox="49.8644659424,49.8844697571,8.65217708588,8.67217803955" lat="49.8744697" lon="8.6621778" display_name="Pueblo, 5-7, Erbacher Straße, Mathildenhöhe, Darmstadt, Darmstadt, Stadt, Regierungsbezirk Darmstadt, Hessen, 64283, Bundesrepublik Deutschland (Landmasse)" class="amenity" type="pub" icon="http://open.mapquestapi.com/nominatim/v1/images/mapicons/food_pub.p.20.png">
		<pub>Pueblo</pub>
		<house_number>5-7</house_number>
		<road>Erbacher Straße</road>
		<suburb>Mathildenhöhe</suburb>
		<city>Darmstadt</city>
		<county>Darmstadt, Stadt</county>
		<state_district>Regierungsbezirk Darmstadt</state_district>
		<state>Hessen</state>
		<postcode>64283</postcode>
		<boundary>64287</boundary>
		<country>Bundesrepublik Deutschland (Landmasse)</country>
		<country_code>de</country_code>
	</place>
	...
</searchresults>

Auf der Wiki-Seite zu Nominatim finden sich alle Parameter.

Noch ein Beispiel: Wir suchen alle Cafes und Pubs im Bereich 8.62 , 49.85 , 8.68 , 49.89 (Parameter viewbox = left,top,right,bottom)

http://nominatim.openstreetmap.org/search?viewbox=8.62,49.85,8.68,49.89&bounded=1&format=xml&polygon=0&addressdetails=1&q=[cafe][,pub]
<searchresults timestamp="Mon, 17 Oct 11 12:28:03 -0400" attribution="Data Copyright OpenStreetMap Contributors, Some Rights Reserved. CC-BY-SA 2.0." querystring=" [,pub]" polygon="false" exclude_place_ids="8064325,1531978,1542766,7020825,1562941,5484206,8296635,3710437,4985586,1545901" more_url="http://open.mapquestapi.com/nominatim/v1/search?format=xml&exclude_place_ids=8064325,1531978,1542766,7020825,1562941,5484206,8296635,3710437,4985586,1545901&accept-language=de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4&addressdetails=1&viewbox=8.62%2C49.85%2C8.68%2C49.89&q=+%5B%2Cpub%5D">
	<place place_id="8064325" osm_type="node" osm_id="769080882" place_rank="30" boundingbox="49.8722135925,49.8922174072,8.64747070313,8.6674716568" lat="49.8822173" lon="8.6574715" display_name="Weinstube Osttangente, Arheilger Straße, Martinsviertel-West, Darmstadt, Stadt, Regierungsbezirk Darmstadt, Hessen, 64289, Bundesrepublik Deutschland (Landmasse)" class="amenity" type="pub" icon="http://open.mapquestapi.com/nominatim/v1/images/mapicons/food_pub.p.20.png">
		<pub>Weinstube Osttangente</pub>
		<road>Arheilger Straße</road>
		<suburb>Martinsviertel-West</suburb>
		<place>Martinsviertel-West</place>
		<county>Darmstadt, Stadt</county>
		<state_district>Regierungsbezirk Darmstadt</state_district>
		<state>Hessen</state>
		<boundary>64289</boundary>
		<country>Bundesrepublik Deutschland (Landmasse)</country>
		<country_code>de</country_code>
	</place>
	<place place_id="1542766" osm_type="node" osm_id="310264485" place_rank="30" boundingbox="49.864874115,49.8848779297,8.64108585358,8.66108680725" lat="49.8748742" lon="8.6510865" display_name="Cafe Espenschied, Mathildenplatz, Stadtzentrum, Darmstadt, Darmstadt, Stadt, Regierungsbezirk Darmstadt, Hessen, 64283, Bundesrepublik Deutschland (Landmasse)" class="amenity" type="cafe" icon="http://open.mapquestapi.com/nominatim/v1/images/mapicons/food_cafe.p.20.png">
		<cafe>Cafe Espenschied</cafe>
		<road>Mathildenplatz</road>
		<suburb>Stadtzentrum</suburb>
		<city>Darmstadt</city>
		<county>Darmstadt, Stadt</county>
		<state_district>Regierungsbezirk Darmstadt</state_district>
		<state>Hessen</state>
		<boundary>64283</boundary>
		<country>Bundesrepublik Deutschland (Landmasse)</country>
		<country_code>de</country_code>
	</place>
	...
</searchresults>

Diese Anfrage hat den Vorteil, dass wir nicht den Ortsnamen kennen müssen, sondern einfach die Koordinaten reinstecken können.

Ähnlich zur hier vorgestellten Yahoo Placefinder API lassen sich mit Nominatim auch noch Geo-Lookups betreiben:

http://nominatim.openstreetmap.org/reverse?format=xml&lat=49.869074&lon=8.645331&zoom=18&addressdetails=1
<reversegeocode timestamp="Mon, 17 Oct 11 12:32:36 -0400" attribution="Data Copyright OpenStreetMap Contributors, Some Rights Reserved. CC-BY-SA 2.0." querystring="format=xml&lat=49.869074&lon=8.645331&zoom=18&addressdetails=1">
	<result place_id="53116836" osm_type="way" osm_id="54818914" lat="49.8689123945855" lon="8.64516022575963">
	Studentenwohnheim Neckarstraße, Elisabethenstraße, Rheintor/Grafenstraße, Darmstadt, Darmstadt, Stadt, Regierungsbezirk Darmstadt, Hessen, 64283, Bundesrepublik Deutschland (Landmasse)
	</result>
	<addressparts>
		<building>Studentenwohnheim Neckarstraße</building>
		<road>Elisabethenstraße</road>
		<suburb>Rheintor/Grafenstraße</suburb>
		<city>Darmstadt</city>
		<county>Darmstadt, Stadt</county>
		<state_district>Regierungsbezirk Darmstadt</state_district>
		<state>Hessen</state>
		<boundary>64283</boundary>
		<country>Bundesrepublik Deutschland (Landmasse)</country>
		<country_code>de</country_code>
	</addressparts>
</reversegeocode>

Overpass (X)API

Noch etwas feingranular können wir unsere Anfrage mit der Overpass (X)API gestalten, die ebenfalls per REST zu befeuern ist (siehe ergänzend auch die Doku zur XAPI).

Wir wollen alle Pubs und Fast-Food-Lokale in der Box 8.62 , 49.85 , 8.68 , 49.89 haben? Kein Problem!

http://www.overpass-api.de/api/xapi?node[bbox=8.62,49.85,8.68,49.89][amenity=fast_food|pub][@meta]
<osm version="0.6" generator="Overpass API">
<note>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 </note>
<meta osm_base="2011-10-17T16\:36\:02Z"/>
  <node id="24924135" lat="49.8800621" lon="8.6453454" version="11" timestamp="2011-06-13T19:02:36Z" changeset="8424331" uid="290680" user="wheelmap_visitor">
    <tag k="addr:city" v="Darmstadt"/>
    <tag k="addr:housenumber" v="41"/>
    <tag k="addr:postcode" v="64293"/>
    <tag k="addr:street" v="Kahlertstraße"/>
    <tag k="amenity" v="pub"/>
    <tag k="name" v="Kneipe 41"/>
    <tag k="note" v="DaLUG Meeting (4st Friday of month 19:30)"/>
    <tag k="smoking" v="no"/>
    <tag k="website" v="http://www.kneipe41.de/"/>
    <tag k="wheelchair" v="limited"/>
  </node>
  <node id="203582455" lat="49.8716253" lon="8.6393520" version="5" timestamp="2011-06-13T19:04:38Z" changeset="8424331" uid="290680" user="wheelmap_visitor">
    <tag k="addr:city" v="Darmstadt"/>
    <tag k="addr:country" v="DE"/>
    <tag k="addr:housenumber" v="69"/>
    <tag k="addr:postcode" v="64295"/>
    <tag k="addr:street" v="Rheinstraße"/>
    <tag k="amenity" v="fast_food"/>
    <tag k="cuisine" v="burger"/>
    <tag k="name" v="McDonald's"/>
    <tag k="website" v="http://www.mcdonalds.com/"/>
    <tag k="wheelchair" v="yes"/>
  </node>
  ...
</osm>

Dabei gibt es offensichtlich noch sehr informative Nebenangaben über die Rollstuhltauglichkeit und allerlei anderer Sachen. Für eine vollständige Angabe aller suchbaren Einrichtungen („Amenity“) sei hierauf verwiesen: Vom Kino über den Mülleimer gibts alles, was das Herz begehrt. Auch auf die Spezialphrasen sei noch verwiesen.

Die native API

Da wir keine Plätze anlegen möchten, sondern nur Daten von OSM beziehen wollen, bietet die native OSM API nur ein nützliches Feature für uns: Die Location-Suche nach ID. Wenn wir also zu einer oder mehreren Platz-IDs (wie sie bspw. von der Overpass API bzw. Nominatim in der Antwort geliefert werden) nähere Informationen erhalten möchten, kann folgende Query hilfreich sein:

http://api.openstreetmap.org/api/0.6/nodes?nodes=307367745,24924135
<osm version="0.6" generator="OpenStreetMap server">
	<node id="24924135" lat="49.8800621" lon="8.6453454" version="11" changeset="8424331" user="wheelmap_visitor" uid="290680" visible="true" timestamp="2011-06-13T19:02:36Z">
		<tag k="name" v="Kneipe 41"/>
		<tag k="wheelchair" v="limited"/>
		<tag k="addr:postcode" v="64293"/>
		<tag k="addr:housenumber" v="41"/>
		<tag k="addr:city" v="Darmstadt"/>
		<tag k="smoking" v="no"/>
		<tag k="addr:street" v="Kahlertstraße"/>
		<tag k="amenity" v="pub"/>
		<tag k="website" v="http://www.kneipe41.de/"/>
		<tag k="note" v="DaLUG Meeting (4st Friday of month 19:30)"/>
	</node>
	<node id="307367745" lat="49.8702344" lon="8.6507902" version="7" changeset="6121669" user="wheelmap_visitor" uid="290680" visible="true" timestamp="2010-10-21T07:33:35Z">
		<tag k="name" v="Subway"/>
		<tag k="wheelchair" v="yes"/>
		<tag k="addr:postcode" v="64283"/>
		<tag k="addr:housenumber" v="21"/>
		<tag k="addr:city" v="Darmstadt"/>
		<tag k="addr:street" v="Elisabethenstraße"/>
		<tag k="amenity" v="fast_food"/>
		<tag k="addr:country" v="DE"/>
		<tag k="website" v="http://www.subway.com/"/>
		<tag k="cuisine" v="sandwich"/>
	</node>
</osm>

Das war’s vorerst

Wenn ich im Verlaufe des Projekts noch bahnbrechende, neue Erkenntnisse über die OSM API erlangen sollte, gibt es einen Follow-Up Post. So far.

Update: Artikel zur Transformierung von Längenangaben in Geo-Koordinaten ist fertig – Umkreissuche: Lat/Long und der Radius.

Weitere Posts:

Dieser Beitrag wurde unter php, webdev veröffentlicht. Setze ein Lesezeichen auf den Permalink.

2 Antworten auf Open Streetmap API Tutorial: Umkreissuche

  1. Sehr spannend! Da gehts ja vorwärts in Sachen Geo!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert