Piszę aplikację, która zapewnia ciężkie wykorzystanie Geodjango (na POTGIS) i wyszukiwania przestrzenne. Odległość zapytania na działanie strony bazy danych Świetnie, ale teraz muszę obliczyć odległość między dwoma punktami na stronie Pythona (punkty te pochodzą z modeli uzyskanych przy użyciu oddzielnych zapytań).

Mogę pomyśleć o wielu sposobach, które obliczyłoby tę odległość, ale chcę wiedzieć, czyniąc to w sposób zgodny z wynikiem bazy danych.

Czy istnieje jakaś magiczna funkcja Pythona, która oblicza odległość między dwoma punktami podanymi, w których SRID są mierzone? Jeśli nie, jakie możesz zaproponować inne podejście.

2
jb. 28 lipiec 2012, 21:57

3 odpowiedzi

Najlepsza odpowiedź

Możesz użyć Funkcja Haversine z tego pytania:

>>> from math import radians, cos, sin, asin, sqrt
>>> 
>>> def haversine(lon1, lat1, lon2, lat2):
...     """
...     Calculate the great circle distance between two points 
...     on the earth (specified in decimal degrees)
...     """
...     # convert decimal degrees to radians 
...     lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
...     # haversine formula 
...     dlon = lon2 - lon1 
...     dlat = lat2 - lat1 
...     a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
...     c = 2 * asin(sqrt(a)) 
...     km = 6367 * c
...     return km 
... 
>>> haversine(-1.7297, 53.3205, -1.6997, 53.3186)
2.0025842109026413
3
Community 23 maj 2017, 12:14

Jeśli chcesz spójność ze sposobem, w jaki Postgis, prawdopodobnie chcesz użyć czegoś lepszego niż implementacja Henersine. Proponuję spojrzeć na wersję Pythona Geographiclib, który wykonuje obliczenia znacznie dokładniej.

Otrzymasz lepsze odpowiedzi na GIS.stackexchange

1
jwd630 5 czerwiec 2015, 17:15

Użyj odpowiedniego połączenia danych, aby wykonać funkcję SQL, której używasz, a następnie odzyskaj, co ... utrzymuje wszystko spójne.

0
Jon Clements 28 lipiec 2012, 19:25