Географический режим расхождений в GeoDjango - PostGIS 1.5 - PullRequest
1 голос
/ 03 сентября 2010

Я храню поле PointField с именем «координаты» в модели.

Затем я проверяю ближайшие экземпляры из заданного в интерпретаторе команд и печатаю его имя и расстояние в км.

[(p.name, p.distance.m) for p in Model_Name.objects.filter(
  coordinates__distance_lte=(pnt, 1000000)).distance(pnt)]

Дело в том, что когда поле "координаты" имеет вид геометрии, оно работает хорошо. Но если я включу параметр "geography = True", чтобы получить более высокую точность, он возвращает намного меньшее значение, даже если я указываю, что его нужно печатать в км, как и раньше.

Как я могу получить правильные расчеты географии?

Спасибо

1 Ответ

0 голосов
/ 30 апреля 2016

Добавление. расстояние () до конца набора запросов приведет к тому, что каждый объект в наборе геоквартиры будет помечен объектом расстояния. И вы можете использовать этот объект расстояния, чтобы получить расстояния в разных единицах.

Поскольку атрибут расстояния является объектом расстояния, вы можете легко выразить значение в единицах по вашему выбору. Например, city.distance.mi - значение расстояния в милях и city.distance.km это значение расстояния в километрах

Однако в django 1.9 они переместили сообщения цели , хотя добавление .distance () все еще работает, теперь рекомендуемый способ - сделать

from django.contrib.gis.db.models.functions import Distance
[  (p.name, p.distance.m) for p in Model_Name.objects.filter(
   coordinates__distance_lte=(pnt, 1000000)
   ).annotate(distance=Distance('point', pnt))]

Наконец, вместо использования coordinates__distance_lte в postgis и mysql 5.7 доступен намного более быстрый метод: dwithin

...