Ich habe eine Anwendung, auf der Benutzer Objekte mit einer Adresse reinstellen können, hier speichere ich die dazugehörigen LAT und LNG Werte.
Nun gibt ein suchender Nutzer ins Suchfeld eine Stadt ein und kommt auf eine Ergebnissseite.
Auf dieser Seite möchte ich zuerst die Stadt und alle anderen Städte um Umkreis von 60km zeigen. Das alles habe ich bereits geschafft mit folgender Berechnung:
Code: Alles auswählen
acos(sin(loc_latitude) * sin('zimmer_lat') + cos(loc_latitude) * cos('zimmer_lat') * cos('zimmer_lng' - (loc_longitude))) * 6371 <= 2000
Die 2000 sollen 60km sein, weil die Werte alles in allem viel zu hoch sind musste ich es anpassen, aber es funktioniert. Ich habe mehrere Tests gemacht und es werden immer Zimmer im 60~ km Radius geladen.
Wo ich mir jetzt Gedanken mache ist, ob man das nicht auf DB Ebene in der Query bereits lösen kann/sollte, denn was ich mache ist alle Zimmer querien und dann in der Jinja2 begrenze ich die Ergebnisse so:
Code: Alles auswählen
{% if the_acos(the_sin(loc_latitude) * the_sin(zimmer.zimmer_lat) + the_cos(loc_latitude) * the_cos(zimmer.zimmer_lat) * the_cos(zimmer.zimmer_lng - (loc_longitude))) * 6371 <= 2000 %} ... {% endif %}
So klappt es, hier wird zimmer_lat als ein float erkannt (zimmer_lat ist der column name):
Code: Alles auswählen
all_rooms_in_city = Zimmer.query.join(User).filter_by(bezahlt=True).order_by(asc('zimmer_lat'))
Code: Alles auswählen
all_rooms_in_city = Zimmer.query.join(User).filter_by(bezahlt=True).order_by(asc(acos(sin(loc_latitude) * sin('zimmer_lat') + cos(loc_latitude) * cos('zimmer_lat') * cos('zimmer_lng' - (loc_longitude))) * 6371))
Danke