Around-Filter: Einsatz multipler Parameter bei der nearby-Abfrage

hallo community, :slight_smile:

vorweg - frohe Weihnachten. : D.

mein aktuelles Thema ist es - eine nearby-Suche mit mehreren Tags durchtzuführen. Es geht also um die Suche nach mehreren Standorten in der Nähe nach Koordinaten - wie kann ich mehrere POIs in der Nähe vom aktuellen Standort in OpenStreetMap finden?

anders ausgedrückt - es ist die Frage;: wie setze ich den “Around-Filter” denn in einer Abfrage ein - mit zwei Parametern -
wie die Nearby-Abfrage ausführen mit z.B. zwei Tags - Schulen und Krankenhäuser - (shools & hospitals).

die Frage ist - wie setze ich diesen Arond-Filter denn in einer Abfrage ein - mit zwei Parametern - wie die Nearby-Abfrage ausführen mit z.B. zwei Tags - shools & hospitals. Wir können die Overpass-API verwenden, um nach POIs in der Nähe zu suchen. Wir können Abfragen für die Überführungs-API durchführen und diese als Überlagerungen auf einer OSM-Karte anzeigen: Die Frage ist: Gibt es eine API für OpenStreetMap, mit der ich eine Liste von (mehreren) POIs innerhalb einer bestimmten Entfernung (z. B. 50 Kilometer) von a, also einem Referenzort erhalten kann?: Wir nehmen zum Beispiel Schulen und Krankenhäuser.

** Folgender Fall:** Ich möchte die openstreetmaps-api nach bestimmten Tags (POIs) in der Umgebung einer bestimmten Stadt - einem Referenzort, abfragen - sagen wir München: Ich möchte alle Krankenhäuser und Schulen in der Nähe von München in einem Umkreis von 50 km (um diesen Refernzort) finden. Anm.: es ist hierbei ausgesprochen praktisch, diesen Referenzort human readable zu verwenden - und eben nicht als Geokoordinate auszudrücken - vgl. die Fußnote unten…

Einige Grundlagen: Die Openstreetmaps-API-Dokumentation enthält keine Informationen, die hier hilfreich sein könnten - ein basaler Ansatz, der allerdings so nicht funktioniert.

[out:csv(::id,::type,::lon, ::lat, "name","addr:postcode","addr:city","addr:street","addr:housenumber","contact:website"," contact:email=*")][timeout:600];
    area[name="Müncchen"];
    nwr(around:10000)["amenity"="hospital"];
    nwr(around:10000)["amenity"="school"];
    
    out center;

Anm; die hier enthaltenen Bestandeteile - Klarname des Referenzortes, nwr als Zusammenfassung für node, way und relation - all das ist schon sehr sehr praktisch und auch extrem kurz in der Abfrage formuliert. allerdings läuft es so noch nicht.

…ich muss also (leider) anders ansetzen - obwohl es mit dieser Form schon sehr sehr gut und vor allen Dingen sehr benutzerfreundlich aussieht - Anm.: ich setze bei dieser Aufgabe sehr viel lieber einen realen Städtenamen ein - als Geokoordinaten. Das hilft und kommt einer Anwendung -z.B. in einem Webfrontend schon sehr entgegen.

Für diese Art von Anfrage arbeiten wir im Allgemeinen mit der Overpass-API(https://wiki.openstreetmap.org/wiki/Overpass_API), die ja für solche Abfragen entwickelt wurde. Overpass-Turbo.eu unterstützt einen großartigen und sehr sehr hilfreichen Filter (https://wiki.openstreetmap.org/wiki/Overpass_API/Overpass_QL#Relative_to_other_elements_.28around.29).

** Beispiel:** - Krankenhäuser in einem Umkreis von 50 km um München - könnte so aussehen:…für unser ** Beispiel nehmen wir München: **


 (
      node["amenity"="hospital"](around:50000,{{geocodeCoords:München}});
      way["amenity"="hospital"](around:50000,{{geocodeCoords:München}});
      relation["amenity"="hospital"](around:50000,{{geocodeCoords:München}});
    );
    out;
    >;
    out;

aber warum funktioniert das nicht:



    [out:csv(::id,::type,::lon, ::lat, "name","addr:postcode","addr:city","addr:street","addr:housenumber","contact:website"," contact:email=*")][timeout:600];
    area[name="Münschen"];
    nwr(around:10000)["amenity"="hospital"];
    nwr(around:10000)["amenity"="school"];
    
    out center;


Mehr zu diesem Ausgangstext: Nun, wie man die Daten abruft: Wie man die Daten aus einer nahe gelegenen Suche abruft - mit zwei Entitäten - Schulen und Krankenhäusern. Um eine Abfrage zu erstellen, müssen wir wissen, welche OpenStreetMap-Tags den Feature-Typen entsprechen, an denen sie tatsächlich interessiert waren. Das OpenStreetMap-Wiki bietet Dokumentation für die am häufigsten verwendeten Tags, z. Annehmlichkeit = Krankenhaus in diesem Beispiel. Und ja: Neben dem Krankenhaus verwenden wir Schulen als zweiten Tag. Wir können die Überführungs-API verwenden, um nach POIs in der Nähe zu suchen. Und ja - raten Sie mal, dass wir Abfragen für die Überführungs-API durchführen und diese als Überlagerungen auf einer OSM-Karte anzeigen müssen.

**Overpass API unterstützt einen ** around filter( https://wiki.openstreetmap.org/wiki/Overpass_API/Overpass_QL#Relative_to_other_elements_.28around.29 )

The around filter selects all elements within a certain radius around the elements in the input set. If you provide coordinates, then these coordinates are used instead of the input set. The input set can be changed with an adapted prefix notation. As for all filters, the result set is specified by the whole statement, not the individual filter. A radius of 0 can be used for a way intersection test on outer/inner points. Syntax: It consists of an opening parenthesis. Then follows the keyword around. Then follows optionally an input set declaration. Then follows a single floating point number that denotes the radius in meters. The filter either ends with a closing parenthesis or is followed by two comma separated floating point numbers indicating latitude and longitude and then finally a closing parenthesis.

amenity=hospital is used for hospitals :
https://wiki.openstreetmap.org/wiki/Tag:amenity%3Dhospital: amenity=hospital is used for hospitals, i.e. institutions for health care providing treatment by specialised staff and equipment, and typically providing nursing care for longer-term patient stays. In contrast, a medical centre with doctors for outpatient care only should be tagged amenity=clinic, and an individual doctor’s office as amenity=doctors.

die Frage ist: wie setze ich diesen Around-Filter denn in einer Abfrage ein - mit zwei Parametern - wie die Nearby-Abfrage ausführen mit z.B. zwei Tags - shools & hospitals.

Euch noch schöne Weihnachten.

Freue mich auf einen Tipp - wie ich die o.g. Abfrage umsetzen kann?
Viele Grüße tag the world,

Anm.: Es ist zugegebnermaßen durchaus problematisch …
In einer Distanz vom x km um den Mittelpunkt der Area herum oder x km um die Umrisslinie von einer Area herum?
Sprich Beispiel Krankenhäuser in 10km Umkreis von Berlin, Abstand nun vom Mittelpunkt oder von den Stadtgrenze Berlin aus? Macht ja ein gewaltigen Unterschied teilweise aus. vgl. https://forum.openstreetmap.org/viewtopic.php?id=71441

  • Dabei st die Frage auch interessant, zu unterscheiden zwischen einer Abfrage mit “real-world-names” vs. lon-lat-Werten: etwa München, Rosenheim etc. Bei dieser Problem-(Frage-)Stellung geht es darum OpenStreetMap-Area-Abfrage mit real-world-names statt mit lon-lat-Werten durchzuführen. hab mir schon mal genauer die man-pages hier angesehen:https://wiki.openstreetmap.org/wiki/Ove … by_Example
    was mir hier wichtig ist: ich bevorzuge eine Area-search-Methode, die mit real-world-names arbeitet und nicht mit den lon-lat-Daten der jeweiligen Position: https://forum.openstreetmap.org/viewtopic.php?id=71441

vg
:slight_smile:

Was gefällt Dir an dieser Abfrage aus https://forum.openstreetmap.org/viewtopic.php?id=71441 #4 nicht?

[out:json][timeout:25];
// administrative relation laden
// admin_level = 6 (statt 8) 
// weil Rosenheim kreisfreie Stadt  
rel[admin_level=6][name=Rosenheim] ;
// out body; 
// >; out skel;
nwr[amenity=hospital](around[]:10000);
out body;
>; out skel;

Wenn man sich nicht mit dem admin_level rumschlagen will, kann man auch

[out:json][timeout:25];
rel[boundary=administrative][admin_level=6][name=Rosenheim]->.city;
// out body; 
// >; out skel;
(nwr[amenity=hospital](around.city:10000);
nwr[amenity=school](around.city:10000););
out body;
>; out skel;

gleich mit Doppelabfrage, nutzen.
Dann erhält man aber 2 Rosenheim: eines in Bayern und eines im Sauerland.

Edit: Abfrage korrigiert, die erste Version lieferte alle Schulen um die bereits gefundenen Krankenhäuser.

Ergänzung:

[out:json][timeout:125];
rel[boundary=administrative][admin_level=6][name="München"] -> .city;
(nwr[amenity=hospital](around.city:2000);
nwr[amenity=school](around.city:2000););
out center;

liefert Elemente um den Labelpunkt und um alle Grenzpunkte.

[out:json][timeout:125];
rel[boundary=administrative][admin_level=6][name="München"] -> .city;
node(r.city) -> .cityn;
(nwr[amenity=hospital](around.cityn:2000);
nwr[amenity=school](around.cityn:2000););
out center;

Dagegen nur Elemente um den Labelpunkt (näherungsweise Mittelpunkt)

Hallo und guten Abend FX99, :slight_smile:

vorweg: vielen Dank für deine schnelle Antwort.

Das hilft hier sehr sehr weiter!

Freue mich über diese tollen Möglichkeiten. Finde die Ausgabe als Map auch sehr sehr praktisch. Danke noch für die diversen Abfrage- bzw. Ausgabemetoden u. Modelle.

Eine Idee noch - wie würdest Du ansetzen wenn du noch zusätzlich die Daten als CSV ausgeben willst?

habe mal hier folgendes versucht:

[out:csv(::id,::type,::lon, ::lat, "name","addr:postcode","addr:city","addr:street","addr:housenumber","contact:website"," contact:email=*")][timeout:600];
rel[boundary=administrative][name=Rosenheim];
way[boundary=administrative][name=Rosenheim];
node[boundary=administrative][name=Rosenheim];

// out body; 
// >; out skel;
(nwr[amenity=hospital](around:1000);
nwr[amenity=school](around:1000););
out body;
>; out skel;


das gibt folgendes aus:


@id	@type	@lon	@lat	name	addr:postcode	addr:city	addr:street	addr:housenumber	contact:website	 contact:email=*
7994893	way			RoMed Klinikum Rosenheim	83022	Rosenheim	Pettenkoferstraße	10		
30424270	way			Prinzregentenschule						
60144249	way			Sebastian-Finsterwalder-Gymnasium	83022	Rosenheim	Königstraße	25		
82608209	way			Karolinen-Gymnasium						
82746719	way			Mädchenrealschule						
98426045	way			Johann-Rieder-Realschule						
98632610	way			Wirtschaftsschule	83022	Rosenheim	Königstraße	1		
99368065	way			Klara von Assisi Tagesstätte	83022	Rosenheim	Ebersberger Straße	32c		
107341023	way			Berufsschule II						
107341024	way			Mittelschule am Luitpoldpark						
116852488	way			Schule an der Heckscher-Klinik						
119496196	way			Landwirtschaftsschule	83022	Rosenheim	Prinzregentenstraße	35		
124901901	way			Caritas Tagesstätte						
137231022	way			Berufsfachschule	83022	Rosenheim	Lilienweg	10		
137327799	way			Tagesklinik Rosenheim des Inn-Salzach-Klinikums	83022	Rosenheim	Freiherr-vom-Stein-Straße	2		
137564646	way			Sonderpädagogisches Förderzentrum Rosenheim						
137564654	way			Philipp Neri Schule						
137564659	way			Grundschule Erlenau						
150960802	way			Astrid-Lindgren-Grundschule						
368804405	way			Ignaz-Günther-Gymnasium			Prinzregentenstraße	32-34		
59836778	node	12.1302929	47.8604896							
59836779	node	12.1304103	47.8592409							
59836782	node	12.1347193	47.8602043							
59836783	node	12.1335118	47.8613022							
333731836	node	12.1314642	47.8610213							
333731838	node	12.1311429	47.8606128							
335751725	node	12.1133916	47.8607840							
335751726	node	12.1124518	47.8611939							
335751727	node	12.1128168	47.8616214							
335751728	node	12.1137355	47.8612707							
497015707	node	12.1229067	47.8618751							
747160594	node	12.1314386	47.8533954							
747160595	node	12.1303061	47.8525199		


Intreressant hierbei: die Liste mit den Geo-Daten ist noch viel viel länger:

Es sind hier auch lediglich die Schulen, die in der Abfrage berücksichtigt werden. Interessant wäre noch wenn ich die Daten

a. als CSV
b. als Map

…bekommen würde. Das wäre natürlich das allerbeste.:slight_smile:

Ich probiere noch einiges aus und meld mich wieder. Werde als erstes noch deine von dir gezeigten Möglichkeiten ausprobieren.

Deine hier gezeigten Lösungen gefallen mir schon jetzt sehr sehr gut. :):):slight_smile:

Dir & allen anderen hier noch ein schönes Weihnachtsfest.

viele Grüße
TagTheWorld :slight_smile:

Hallo Fx99 Dank für deine tipps und Angregungen :slight_smile:

Deine Ideen und Ansätze die haben mir weiter geholfen. Die Abfragen die du ins Spiel bringst - sind sehr vielseitig.

ich hab damit einige Sachen ausprobiert.

das liefert dann folgendes Ergebnis - sehr gut!

Das tolle daran - ich bekomme Daten in ganz vielen Ausgabeformaten;

  • JSON (siehe oben)
  • CSV (siehe unten)

diese Möglichkeiten sie sind sehr vielseitig - und helfen mir (wie gesagt) sehr weiter. :slight_smile: Sehr sehr schön - unten hab ich Daten der POI in konkreten Daten wie Adresse, sowie auch die geostationären Daten.

Dir nochmals vielen vielen Dank!

viele Grüße
tagtheworld

Schön, dass Du weitergekommen bist.
Hier noch ein paar Anregungen:

[out:csv(::id,::type,::lon,::lat,amenity,name,"addr:postcode","addr:city","addr:street","addr:housenumber","contact:website",website,"contact:email")]
[timeout:600];
rel[boundary=administrative][admin_level=6][name="München"] -> .city;
(nwr[amenity=hospital][name](around.city:2000);
nwr[amenity=school][name](around.city:2000););
out center;

Wenn [timeout:600]; in einer eigenen Zeile steht, lässt sich mit “//” vor **[out:csv(…[/b] einfach in den Grafik-Modus umschalten.
Das tag **website **ist (noch) wesentlich gebräuchlicher als contact:website, gilt wohl auch für email.
Die zusätzliche Ausgabe von **amenity vereinfacht ein späteres Sortieren.
In Deiner Liste gab es einige Zeilen ohne irgendwelch Info nach lan/lot. Ich hab mal eines angeschaut: es ist ein way mit amenity=school um mehrere Schulen herum. Die Abfrage auf [name] eliminiert diese.

Hallo FX99.:slight_smile:

vielen Dank - das sind wieder neue /mehr Möglichkeiten.

Vielen Dank für so viel Details - ich werde mir das am Wochenende alles genauer ansehen.

Und ja; ich stelle immer wieder fest, wie toll dieses Forum hier ist: Die Overpass API mit ihren vielfältigen Abfragemethoden, Ideen und Suchmöglichkeiten wird hier im Forum nochmals erweitert. So erfährt man nochmals an konkreten Beispielen noch viel viel mehr und viel Neues.

Um all die neuen von dir gezeigten Details zu erkunden u. ihre Features und Möglichkeiten zu verstehen werde ich mir das am Wochenende alles genauer ansehen.

Vielen dank nochmals für alles!

Viele Grüße
Tag The World:)