Я создаю карту мира и хочу, чтобы пользователи могли искать местоположения и сортировать их по расстоянию из любой точки мира. Я использую GeoDjango для расчета расстояний, однако возвращаемые расстояния казались неправильными, поэтому я сверил их с расчетами geopy
.
Расстояния значительно различаются до такой степени, что если результаты отсортированы по значениям расстояний БД в километрах и geopy
значениям в км, они не будут в том же порядке.
Я предполагаю, что значения geopy
верны, поэтому мне интересно, что-то не так с тем, как я реализовал GeoDjango?
Работает как надо?
Это как-то связано с попыткой рассчитать расстояние для всего мира, а не только для конкретной области, которая может иметь srid
?
views.py
pnt = GEOSGeometry('POINT({} {})'.format(latitude, longitude), srid=4326)
qs = Place.filter(point__distance_lte=(pnt, D(km=radius*2))).annotate(distance=Distance('point', pnt)).order_by('distance')
settings.py
DATABASES = {
'default': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'USER': '',
'NAME': 'places',
'HOST': '127.0.0.1',
'PORT': '5432',
}
}
models.py
:
from django.contrib.gis.db import models
from geopy.distance import vincenty
class Place(models.Model):
latitude = models.DecimalField(max_digits=10, decimal_places=6, null=True, blank=True)
longitude = models.DecimalField(max_digits=10, decimal_places=6, null=True, blank=True)
point = models.PointField(null=True, geography=True)
def distance_from_target(self, target_lat, target_lon):
if not target_lat or not target_lon:
return None
instance_point = (self.latitude, self.longitude)
target_point = (target_lat, target_lon)
return vincenty(instance_point, target_point).kilometers