2010-09-03 4 views
1

Я храню поле PointField с именем «координаты» в модели.Расстояния географии в GeoDjango - PostGIS 1.5

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

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

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

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

Thanks

ответ

0

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

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

Однако в Джанго 1.9 они moved the goal posts, в то время как добавление .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