Flask SQLalchemy order_by komplexe mathematische Berechnung für Radius basierend auf longitude und latitude
Verfasst: Mittwoch 25. Januar 2017, 16:39
Hallo zusammen.
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:
Wobei hier loc_latitude und loc_longitude die LAT und LNG Werte der eingegebenen Stadt sind und zimmer_lat und zimmer_lng die von jedem Zimmer.
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:
Außerdem sind die Zimmer unsortiert, d.h. ich muss eigentlich die query vorher noch mit order_by sortieren, dies klappt aber nicht:
So klappt es, hier wird zimmer_lat als ein float erkannt (zimmer_lat ist der column name):
Aber wenn ich die Berechnung reinnehme, wird 'zimmer_lat' als string angesehen, dann kriege ich float expected error und mit einem typecast zu float kriege ich cannot cast string to float error:
Ambesten wäre ist, wenn ich bereits eine query schaffen könnte die es mit dieser Berechnung begrenz und die Ergebnisse nach der Entferung sortiert. Ich bin ganz nah dran, aber dennoch klappt es immer wieder nicht. Vielleicht kennt jemand eine leichtere Lösung?
Danke
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