GeoDjango,dwithin和distance_lt之间的区别?

时间:2010-02-10 07:12:27

标签: django geospatial geodjango

使用geoDjango,

之间有什么区别
myObj.objects.filter(point__dwithin(...etc.))   

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


他们是同一件事,还是他们做了微妙不同的事情?

1 个答案:

答案 0 :(得分:28)

好的,我做了一些研究,但我不知道结果是否有用;)

  • 我查看了他们用来测试数据库查询的unit tests,但他们没有提供真正的提示(对我而言)。

  • 我尝试比较生成的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

当我尝试对 __dwithin 使用do时,我收到错误:

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函数。

顺便说一下,我对两个查询都得到了不同的结果,但我想这主要是因为我不知道要使用哪个“学位”值。