ich bin komplett neu im Umgang mit OSM. Ich möchte das ein Nutzer beispielsweise eine Ortschaft auswählen kann und dann alle Postleitzahlen in einem Defeniertem Umkreis ermittelt werden. Natürlich soll auch auf der Karte eine Markierung angezeigt werden, beispielsweise ein trensperent-rotes Viereck.
Habt ihr vllt ein paar Links oder Tutorials die mir bei der Umsetzung helfen könnten?
Leaflet für die Karte
Aus dem Klick in die Karte ein Rechteck berechnen.
Overpass-API per Ajax ansprechen[1], Abfrage nach “addr:postcode” und “postal_code” [0]
Die Antwort als Liste ausgeben.
Die Query schaufelt ziemlich viele Daten zurück an den Browser. Ich würde mal schauen, ob es nicht ausreicht, ein paar PLZ-Polygone in der aktuellen BBOX zurückzuliefern. Jedes einzelne Haus mit PLZ zu laden erscheint mir als ziemlicher Overkill. Hängt natürlich extrem vom Einsatzgebiet ab. Soll das weltweit sein, oder nur DE, oder wo?
Ich habe die PLZ in der DB als [Land]-[PLZ] abgelegt. Beispiel für Garbsen “DE-30823”.
Jetzt würde ich gerne jeweils eine Funktion schreiben um die PLZ aus meiner DB zu laden, eine um diese bei OSM aufzurufen und eine die aus den zurückgegeben Daten die Längen und Breitengrade per Update in die DB einträgt. Um dies dann in einer while/for - scheife durchlaufen zu lassen.
Hoffe mir kann da jemand nen Tipp geben. Denn irgendwie verstehe ich das mit Overpass nicht so ganz^^
Bitte näher spezifieren: meinst du damit nur einen Punkt, und wenn ja welchen (es gibt da nämlich verschiedene Mittel-/Schwerpunkt-Algorithmen), oder möchtest du den kompletten Umriss?
Also wenn du rechts auf den Tab “Daten” gehst, siehst du ja das Ergebnis als GeoJSON (sofern in der Abfrage out json verwendet wurde). Dort siehst du dann
"center": {
"lat": 52.4313564,
"lon": 9.3894715
}
Naja, das ist jetzt die Frage, wie dein Workaround bzw. dein Workflow ist/sein wird. Willst du vorher selbst ein Reversegeocoding machen? Sprich du lässt dir von der Ortseingabe des Benutzers erst von Nominatim einen Längen-/Breitengrad zurückgeben und bestimmst dann eben selbst die bbox, welche du dann overpass mitgeben kannst. Oder du benutzt wie oben von gormo schon mal angesprochen leaflet mit einem entsprechenden geocoding plugin in leaflet und holst dir von dieser map dann die bbox und machst die Anfrage gegen overpass.
Was mir noch nicht klar ist, ist z.B. dein Weg über PHP, weil das (meiner Meinung nach) eigentlich alles direkt über/im Browser des Benutzers, also JavaScript-seitig, machbar ist.
Nachtrag: Oder willst du einmalig deine PLZ DB “updaten” und das via PHP Scripts machen?
Ich habe schon eine Datenbank die Postleitzahlen enthält, doch dort sind die Längen und Breitengrade nicht korrekt.
Nun möchte ich diese aktualliesieren, was bei über 10k einträgen manuell ewig dauern würde.
Ich hole mir also aus der Datenbank die PLZ, gebe diese weiter an das script um so die L- und B-grade zu erhalten, und schreibe die erhaltenen werte per update in die Datenbank.
Nur wie kann ich bei deinem Codeschnippsel die PLZ festlegen?
Indem man auch noch die PLZ in der Abfrage mit einbaut. Wenn das die Abfrage ist, dann kannst du die über den Button “Export” > “Abfrage” > “Nach OverpassQL (kompakt)” umwandeln und erhälst einen Link, den du dann direkt verwenden kannst (zur not auch mit wget curl usw.)
Achtung: deine Abfragen NACHEINANDER ausführen, da man bei overpass nur max. 2 Slots pro IP Adresse hat!
Also das er mir anhand der PLZ sucht hab ich, nur gibt es bei den Ländern Schweitz und Österreich ja identische PLZ, deshalb die frage ob man das land noch mit einbauen kann^^
Genau das hab ich vor^^
Doch, noch steht die Frage im Raum ob ich auch das Land mit übernehmen kann!