Подтвердить что ты не робот

GeoDjango, разница между dwithin и distance_lt?

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

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

и

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

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

4b9b3361

Ответ 1

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

У меня уже есть геоприложение с использованием 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

Когда я пытаюсь использовать сделать то же самое с __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.

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