Umgebungs-Suche: Lösungen in DB-Abfrage oder durch Overpass-API

Tach Community, :slight_smile:

vorweg - euch allen noch ein gutes neues Jahr!:slight_smile:

…hier eine Frage die man auf zwei Weisen bearbeiten kann - entweder auf einer Datenbankebene - oder auch auf einer Abfrageebene (vgl. Around-Filter: Einsatz multipler Parameter bei der nearby-Abfrage (vgl. hier: https://forum.openstreetmap.org/viewtopic.php?id=71531 )

Zunächst ein Themenaufriss: Diese Umgebungssuche lässt sich auf verschiedenen Wegen erreichen. Das Ziel über ein Webfrontend einen Ort einzugeben und dann aus 3 oder vier Kategorien ( Hospital, School, x, y ) die jeweils nähsten Einträge noch zu finden und aufzulisten - diese Aufgabenstellung - sie lässt sich mittels mehrer Ansätze verfolgen:

a das ganze als MySQL-Frage (oder PostgreSQL, wenn man so will) oder
b. mittels** Overpass-API**

Ich versuche, eine einfache, aber effektive Lösung für eine Nearby-Suche, gelöst über eine Datenbank zu finden - wie man sie durchführt;

Anm zum Ziel.: Es sollen die Daten / Abfragen dann auch online in einem Webfrontend verwendet werden.

vgl. etwa dies Angaben etwa:

etc. etx.

Also - Ich habe einige Datenbank-Dinge zu lösen: Gesucht ist eine - sagen wir “Geosorting-Lösung” in einem Datensatz durch (z. B. MySQL, Postgresql oder andere), um nach Nähe zu ordnen und die Suche auf einen definierten Bereich zu beschränken. Mit anderen Worten: Wie geht man diese Aufgabenstellung an - unter Vermeidung eines vollständig skalierten Scans der DB für solche Abfragen unter Verwendung (traditioneller) Indizes für die Breiten- und Längengradspalten? Um mal mit dem Anfang beginnen; Wir können solche Suchvorgänge in der Nähe durchführen, die auf solchen Openstreetmap-Suchvorgängen basieren - und auf der Overpass-API-Ebene arbeiten und sich etwa auch via overpass-turbo.eu-Anfrage ausführen lassen:

Einschub: Betrachten wir mal eien Ansatz auf einer Datenbankebene: Es ginge ja theoretisch auch eine Suchfunktion über mehrere Tabellen - und dann Filter für die Spalten - also eine Tabelle in der man noch die Kategorien

a. type
b. lon lat /(gps-daten eben) einfügt

man kann in der gps-daten-spalte nach den Eingaben filtern. Ist ggf. halt am einfachsten und funktioniert. Also ich denke, dass dann die Tabelle ja so aussehen koennte:

by the way: Also es ist so: ich habe die Daten gewonnen über openstreetmap und gespeichert in einer Tabelle - kann dazu aber natürlich auch MySQL oder sqlite verwenden By the way: das soll für eine Webanwendung verwendet werden. Also: wenn man einen Punkt hat - also nehmen wir zum Beispiel den Berliner Aleanderplatz:

die o.g. Daten die die Tabellen betreffen die könnte ich auch über die Overpass API jeweils direkt abfragen: https://wiki.openstreetmap.org/wiki/Overpass_API Vorerst dachte ich, ohne OSM Kartendarstellung zu arbeiten und lediglich eine Tabellarische Suche zu ermoeglichen. Die Abfrage via Overpass-Api liesse sich m.E. ja auch direkt im Webfrontent einrichten und umsetzen lassen.

also - sagen wir es sind die Tabellen wie folgt:

Vorerst jedoch will ich die Daten also lokal speichern (jeder Datensatz hat eine eindeutige ID) und nebenbei bemerkt auch noch den Timestamp mitführen, an dem der Datensatz zum letzten mal aktualisiert wurde.

Zu der Umsetzung via Abfrage am OSM-Endpoint: hier kann man auch Overpass verwenden - für die Abfrage von POI; Da hierbei aufgrund der Unterschiede zwischen den POIs keine Homogenisierung möglich ist speichere ich den POI mit seinen Koordinaten in einen Table (poiID, lat, lng). Die Attribute speichere ich in einen extra Table (poiID, attr_name, attr_val). damit habe ich die Daten relational abgebildet, kann sie aber nach Bedarf auch nonrelational abfragen und aus dem Backend als JSON ins Frontend übergeben. Ich kann auch die Attribut-Werte (attr_val) unabhängig vom Feldnamen durchsuchen. Mit den passenden Indizes funktioniert das performant und problemlos.

…also wenn ich 2 Datensätze habe…- hier zum Beispiel bezogen auf “Schulen”

…einmal die** Schule mit lon, lat**

bzw. - man kann das auch so umsetzen, wenn man das nearby - thema komplett in einer OSM-Streetmap-Lsg. abbilden wollte:

wie oben aber beschrieben wollte ich zunächst mit Tabellen bzw. einer Datenbank arbeiten - und eine tabellarische Lsg ergo zunächst mal ins Auge fassen…

Ende des Einschubs: Abgesehen vom Datenbank-Ansatz kann ich mir noch vorstellen, das mit Overpass-Api und einem Around-Filter zu lösen:vgl etwa: Einsatz multipler Parameter bei der nearby-Abfrage (vgl. hier: https://forum.openstreetmap.org/viewtopic.php?id=71531 )

Man kann also die folgenen Prozesse verwenden:

a.** Overpass API** ( https://wiki.openstreetmap.org/wiki/Overpass_API ) um die naheliegenden POIs zu suchen.

b. **Nominatim API **( https://wiki.openstreetmap.org/wiki/Nominatim )

c. und ja; auf Android koennten wir auch **osmdroid **einsetzen um Abragen via Overpass API durchzuführen und die Ergebnisse overlays auf einer OSM map darzustellen.

d. aber was tun wenn wir - sagen wir 5000 Einträge eines openstreetmap-Datensatzes. Wenn es so ist, dann kann man ja auch so ansetzen, in der MySQL-DB eine Abfrage abzusetzen.

bezogen auf a und b: hier der Link: https://wiki.openstreetmap.org/wiki/Overpass_API

by the way: Das overpass-turbo interface ist ziemlich nett und auch leistungsfähig. Man kann da ja auch sehr einfach
eine Distanzsuche anstellen - etwa über eine Suche wie…

Was ist beabsichtigt: So etwas wie eine Nearby-Suche, also die Suche nach Plätzen (orten) die in der Nähe einer bestimmten Postion sich befinden:

Wir haben ein Datensatz:

a location (location=‘location’).

Also um mal ein Beispiel zu geben - aus der Google-Map-Welt:

…wenn man das auf der Google places API mal ansieht und die Web Service Google Maps Geocoding API nähme: vgl. https://github.com/slimkrazy/python-google-places

…nach den man-pages haben wir das Folgende: https://github.com/slimkrazy/python-google-places

das würde den folgenden Code ergeben für eine Tabelle bezogen von Nearby-Hotspots:

Bezogen auf ein konkretes Beispiel: Das Ergebnis ist die Abfrage von “College” und “School”, Dann kommt
man zu der Abfrage:

also mittels einer DB-Lösung könnte das formalisiert so aussehen - die Tabelle “town-hotspot”
Wir können hier ordnen und strukturieren bzg. latitude/longitude (unter Einsatz von z.B. MySQL+PHP)

Das könnte dann etwa so aussehen:

hier ließe sich eine Ordnung herstellen - in Bezug auf Distanzen z.B. zu einem Referenzdatensatz: (41.834527,-108.140625).
wenn man hiervon ausgeht, kann man etwa so auch in der Town-hotspot-Tabelle ansetzen:

Aber ich denke, dass man das Geosorting auch direkt in der Datenbank ausgeführt werden kann.
Das sollte m.E. möglich sein, mittels eines effektiven Ansatzes einer Geo Spatial-Suche in einer Datenbank.

Also worauf es ankommt; nearby places zu finden: gut wäre es in einer “aufsteigenden” Reihenfolge bezogen auf die Distanz zu bekommen.
Die Datenbank könnte ungefähr so aussehen.

Anm.; ich habe ca. 5000 records in der Datenbank.

Daten wie latitude, longitude, Addresse, Stadt, Land etc. etx.

Wie finde ich “nearby-places” in der DB “town-hotspot”:

a. Ein Ansatz ist es mittels min, max range of lat, lng in einem Radius von x Km und das in
Relation zu Kategorie bzwe Category und category tag…

Es ist also die Frage wie ich das am besten umsetze - wenn man das nearby - thema komplett in einer OSM-Streetmap-Lsg. abbilden wollte.

Wie oben aber beschrieben wollte ich zunächst mit Tabellen arbeiten - und eine tabellarische Lsg ergo zunächst mal ins Auge fassen…
Es sollen die Daten / Abfragen dann auch online in einem Webfrontend verwendet werden.

Wie würdet ihr das angehen?

Viele Grüße Tag_the_World :slight_smile:

**Zusatz: **ich hab noch ein paar Aufsätze gefunden - die zum Thema passen: hier drei englische Aufsätze, die das Thema nochmals auf der DB-Ebene interessant beleuchten. Ich lese mich übers Wochenende mal ein.

a. Playing with Geometry/Spatial Data Types in MySQL https://medium.com/sysf/playing-with-geometry-spatial-data-type-in-mysql-645b83880331

** b. Working with PostgreSQL and PostGIS: How To Become A GIS Expert**
https://www.percona.com/blog/2020/04/15/working-with-postgresql-and-postgis-how-to-become-a-gis-expert/

c.** Geospatial Support in MongoDB ** https://www.baeldung.com/mongodb-geospatial-support

Wie würdet ihr vorgehen: Diese Umgebungssuche lässt sich auf verschiedenen Wegen erreichen. Das Ziel über ein Webfrontend einen Ort einzugeben und dann aus 3 oder vier Kategorien ( Hospital, School, x, y ) die jeweils nähsten Einträge noch zu finden und aufzulisten - diese Aufgabenstellung - sie lässt sich mittels mehrer Ansätze verfolgen:

a das ganze als MySQL-Frage (oder PostgreSQL, wenn man so will) oder
b. mittels** Overpass-API**

Ich versuche, eine einfache, aber effektive Lösung für eine Nearby-Suche, gelöst über eine Datenbank zu finden - wie man sie durchführt;
:slight_smile:

… und am WE lese ich mich mal in die engl. Aufsätze ein… - vg