Hallo,
besteht die Möglichkeit Daten aus openstreetmap, wie zB alle Einträge mit “museum” aufzulisten und die Koordinaten mitzuliefern? Wenn ja, kann das territorial begrenzt werden?
Schau mal … ob das deine Bedürftnisse erfüllt.
http://overpass-turbo.eu/s/BlF
Nach dem “Ausführen” oben links, siehst du die Auflistung inkl. Koordinaten steht unter “Daten” oben rechts.
Hey, danke firstAid, das sieht vielversprechend aus!
Jetzt würde ich gerne noch wissen wie ich den code anpassen kann, denn natürlich suche ich nicht nach “museum”, sondern verschiedenen anderen Dingen, wie Straßenbezeichnungen, Straßennamen, Bushaltestellen, Gebäudemarkierungen und dergleichen.
node["tourism"="museum"]({{bbox}});
way["tourism"="museum"]({{bbox}});
relation["tourism"="museum"]({{bbox}});
Zudem würde ich gerne wissen, was es noch außer node, way und relation gibt.
Bei openstreetmap.org gibt es ja das Suchfeld, oder die Objektabfrage. Wenn ich einen Suchbegriff eingebe, kommen viele Ergebnisse. Wenn ich auf ein Suchergebnis klicke kommt u.a. ein Title "“Knoten: blabla (39489493824)”, oder “Linie: …” und eine Attribute-Tabelle mit u.a. “name” “blabla”. Ist “Linie” gleich “way”?
Ich habe nun ein wenig herumprobiert (“tourism” durch “name” ausgetauscht) und festgestellt, dass das ersten case-sensitive ist und zweitens nur exakte Beschreibungen findet. Also mit der Suche nach “blabla” wird “Blabla” oder “bla blabla” nicht gefunden. Wie kann man da was machen?
In OSM gibt es nur die 3 genannten Strukturen node, way und relation.
Overpass ist sehr mächtig, schau Dir mal die Beschreibung hier an: http://overpass-api.de/index.html
Bei der Abfrage kann man auch “regular expressions” verwenden, was Abfragen wie “blabla” wird “Blabla” oder “bla blabla” abdeckt.
Sehr hilfreich ist auch der Wizard in der GUI.
Örtliche Begrenzungen sind entweder wie oben über die aktualle Bounding Box möglich oder aber geographische Eingrenzung wie
Ortschaften, (Bundes-)länder etc.
Beispiel im Wizard: tourism=hotel in Esslingen
Danke fx99.
Territorial eingrenzen geht besser mit “geocodeArea”.
Mehr Infos:
https://wiki.openstreetmap.org/wiki/Overpass_API/Overpass_QL
https://wiki.openstreetmap.org/wiki/Overpass_API/Language_Guide
http://documentation.developer.here.com/pdf/geocoding_hlp/6.2.163/Geocoder%20API%20v6.2.163%20Developer%27s%20Guide.pdf
Beispiel:
[out:json][timeout:25];
{{geocodeArea:Germany:Bayern}}->.searchArea;
(
node[~"name"~"blabla",i](area.searchArea);
way[~"name"~"blabla",i](area.searchArea);
relation[~"name"~"blabla",i](area.searchArea);
);
out body;
>;
out skel qt;
Infos zu den letzten drei Zeilen:
https://gis.stackexchange.com/questions/187447/understanding-overpassturbo-query
Bundesland-Namen: “Baden-Wuerttemberg”, “Thueringen”, …
Kann man so nicht sagen … da kann auch schon mal was falsches bei rauskommen!
Wenn man ein eindeutiges Ergebnis haben möchte, dann bitte direkt die areaId nutzen!
Was ist denn jetzt schon wieder die “areaId”? Wo krieg ich die her? Gibt es da eine Liste für alle Bundesländer?
Ungefähr damit:
[out:csv(::id,"name","note",land_area,type,boundary_type;true;":")][timeout:125];
// fetch area “Deutschland” to search in
{{geocodeArea:Deutschland}}->.searchArea;
// gather results
relation["admin_level"="4"][name!="Groningen"](area.searchArea);
// print results
out meta;
Die Küstenländer sind doppelt!
und was das “Problem” hinter geocodeArea ist:
https://wiki.openstreetmap.org/wiki/Overpass_API/Language_Guide#Selecting_areas_by_name
Richtig? Hannover?
62422 Berlin boundary
28322 Mecklenburg-Vorpommern boundary
62504 Brandenburg boundary
62607 Sachsen-Anhalt boundary
62467 Sachsen boundary
62366 Thüringen boundary
51529 Schleswig-Holstein boundary
62782 Hamburg boundary
62718 Bremen boundary
3600062764 Hannover boundary
62771 Niedersachsen boundary
62761 Nordrhein-Westfalen boundary
62341 Rheinland-Pfalz boundary
62372 Saarland boundary
62650 Hessen boundary
62611 Baden-Württemberg boundary
2145268 Bayern boundary
Keine Ergebnisse:
[out:json][timeout:25];
area(2145268)->.searchArea;
(
node["tourism"="museum"](area.searchArea);
way["tourism"="museum"](area.searchArea);
relation["tourism"="museum"](area.searchArea);
);
out body;
>;
out skel qt;
Warum Hannover auftaucht, ist mir unklar, weil ich Deine Abfrage nicht kenne.
Hannover gibt aber den Hinweis zur Lösung:
Um von der Relation-Nr., wie hier für die BL aufgelistet, zur areaId zu kommen,
musst Du 3600000000 addieren, um damit eine Zahl wie bei Hannover zu erhalten.
Hier das korrekte Hannover-Beispiel:
[out:json][timeout:25];
area(3600062764)->.searchArea;
(
node["tourism"="museum"](area.searchArea);
way["tourism"="museum"](area.searchArea);
relation["tourism"="museum"](area.searchArea);
);
out body;
>;
out skel qt;
hier eine noch genauere Erkärung der area id:
https://wiki.openstreetmap.org/wiki/Overpass_API/Overpass_QL#By_area_.28area.29
Wie kommt Hannover da rein? Frag mich nicht, ich weiß es nicht mehr. Bayern springt auch aus der Reihe, wenn auch nicht “Bayern first!”. Eine bessere Frage ist: Wieso funktioniert der Abfrage-Code mit Hannover, aber mit den anderen wirklichen BL-areaid nicht? Das war ja meine letzte Frage.
[out:json][timeout:250];
area(62611)->.searchArea;
(
node["tourism"="museum"](area.searchArea);
way["tourism"="museum"](area.searchArea);
relation["tourism"="museum"](area.searchArea);
);
out body;
>;
out skel qt;
Ergebnis: Karte ist leer. Keine Daten.
area(62611)
Das klappt so nicht, weil diese riesige Konstante 3600000000 als Offset fehlt.
ich würde mich darum aber nicht kümmern, es gibt einen einfacheren Weg. “map_to_area” addiert die notwendigen Konstanten automatisch.
[out:json][timeout:250];
rel(62611);map_to_area->.searchArea;
(
node["tourism"="museum"](area.searchArea);
way["tourism"="museum"](area.searchArea);
relation["tourism"="museum"](area.searchArea);
);
out body;
>;
out skel qt;
Aber auch das Raussuchen der Relation ist lästig, das geht nochmal einfacher:
[out:json][timeout:250];
area[boundary=administrative]
[admin_level=4]
["ISO3166-2"="DE-BY"] // <<<< hier Bundesland eintragen!
->.searchArea;
(
node["tourism"="museum"](area.searchArea);
way["tourism"="museum"](area.searchArea);
relation["tourism"="museum"](area.searchArea);
);
out body;
>;
out skel qt;
Dann zu den node, way, relation: diese Objekttypen einzeln abfragen macht auch unnötig Arbeit, das geht per “nwr” nochmals kürzer:
[out:json][timeout:250];
area[boundary=administrative]
[admin_level=4]
["ISO3166-2"="DE-BY"] // <<<< hier Bundesland eintragen!
->.searchArea;
nwr["tourism"="museum"](area.searchArea);
out body;
>;
out skel qt;
Ja wer lesen kann ist klar im Vorteil und wer englisch kann noch mehr. Harald Hartmann hatte es eh verlinkt:
“By convention the area id can be calculated from an existing OSM way by adding 2400000000 to its OSM id, or in case of a relation by adding 3600000000 respectively.”
Danke für die Info!
Hm, wie meinst du das? Denkst du, die von mir gepostete Liste (exklusive Hannover) hat die falschen areaid-s?
EDIT: Achso, ohne Angabe der areaid und nur Angabe des BL-Kürzels. OK.
Liste: https://de.wikipedia.org/wiki/ISO_3166-2:DE
Vielen Dank auch dafür!
Also die Liste sieht eher so aus, als ob es Relations-Ids wären, also z.B. osm.org/relation/62422 - diese müsstest du dann wieder per map_to_area anpassen oder gleich selbst 3600000000 addieren (=lästige fleissarbeit).
Die Area-Ids gibt es wirklich nur auf der Overpass API, sie fangen mit 24000xxxx oder 36000xxxxx an, je nachdem, ob das ursprünglich mal ein Way oder eine Relation war.
Objekt-ids haben den Nachteil, dass sie nicht unbedingt stabil sein müssen. Da geht jemand hin und löscht sie, oder erstellt eine Kopie mit einer neuen Objekt-Id und schon ist deine Liste kaputt. Daher benutze ich die Geschichte mit dem ISO-Code, was hoffentlich stabiler ist.
Als Übersicht die Liste für alles was mit “DE-” im ISO3166-2-Code beginnt:
[out:csv(::id, name, "ISO3166-2")];
area[boundary=administrative]
[admin_level=4]
["ISO3166-2"~"^DE-"];
out;
Ergibt:
@id name ISO3166-2
3600028322 Mecklenburg-Vorpommern DE-MV
3600051529 Schleswig-Holstein DE-SH
3600062341 Rheinland-Pfalz DE-RP
3600062366 Thüringen DE-TH
3600062372 Saarland DE-SL
3600062422 Berlin DE-BE
3600062467 Sachsen DE-SN
3600062504 Brandenburg DE-BB
3600062607 Sachsen-Anhalt DE-ST
3600062611 Baden-Württemberg DE-BW
3600062650 Hessen DE-HE
3600062718 Bremen DE-HB
3600062761 Nordrhein-Westfalen DE-NW
3600062771 Niedersachsen DE-NI
3600062782 Hamburg DE-HH
3602145268 Bayern DE-BY
OK, verstehe. Das mit den admin_levels und so weiter, darüber habe ich mich schon informiert. Overpass API hab ich in dem Bezug auch schon benutzt. Feine Sache! Danke nochmal!