GeoDjango, разница между dwithin и distance_lt? - PullRequest
17 голосов
/ 10 февраля 2010

Используя geoDjango, в чем разница между

myObj.objects.filter(point__dwithin(...etc.))   

и

myObj.objects.filter(point__distance_lt(...etc.))  


Это одно и то же, или они делают разные вещи?

1 Ответ

28 голосов
/ 10 февраля 2010

Хорошо, я провел некоторое исследование, но я не знаю, будут ли результаты полезны;)

  • Я посмотрел на модульные тесты , которые они используют для проверки запросов к БД, но они не дают реальных подсказок (мне).

  • Я пытался сравнить сгенерированный SQL:

У меня уже есть гео-приложение, использующее PostgreSQL база данных. Когда я выполняю этот запрос с __distance_lt:

Place.objects.filter(location__distance_lt=(p.location, D(km=1))).query.as_sql()

Я получаю этот сгенерированный SQL:

SELECT (some_fields_here)
FROM "places_place" 
WHERE ST_distance_sphere("places_place"."location", %s) < 1000.0

Когда я пытаюсь использовать do для того же с __dwithin, я получаю сообщение об ошибке:

Place.objects.filter(location__dwithin=(p.location, D(km=1))).query.as_sql()

TypeError: Only numeric values of degree units are allowed on geographic DWithin queries.

Поэтому мне пришлось изменить запрос, чтобы он не использовал D объект:

Place.objects.filter(location__dwithin=(p.location, 1)).query.as_sql()

, что приводит к

SELECT (some fields here) 
FROM "places_place" 
WHERE ST_DWithin("places_place"."location", %s, 1)

Резюме:

__dwithin
- принимает значения градусов в качестве параметра расстояния.
- использует ST_DWithin функцию SQL.

__distance_lt
- может принимать другие значения расстояния;).
- использует ST_distance_sphere функцию SQL.

Кстати, я получаю разные результаты с обоими запросами, но я думаю, что это в основном из-за того, что я не знаю, какое значение "степени" использовать.

...