2011-07-28 141 views
7

我刚刚在我的开发机器上启动并运行了GeoDjango。问题是我无法使距离查询正常工作。无论使用什么SRID,距离结果都是完全关闭的。这是一个例子。GeoDjango距离查询返回不正确的结果

>>> from django.contrib.gis.measure import D 
>>> from app.models import Place 
>>> from django.contrib.gis.geos import Point 
>>> qs = Place.objects.all() 
>>> point = Point(-118, 34) 
>>> qs.filter(coordinates__distance_lte=(point, D(m=1))) 
[<Place: 7-Eleven>, <Place: Arthur Murray Dance Studio>, <Place: Costco>, <Place: AMC Century City 15>, <Place: 24 Hour Fitness>, <Place: Ralphs>, <Place: Houston's Restaurant>, <Place: CVS/pharmacy>, <Place: Shaky Alibi>, <Place: Sephora>, <Place: Trader Joe's>] 

问题是这些地方距离point 1米多远。

我试着玩过它,但没有太多的运气。这是另一个SRID的例子。

>>> qs = Place.objects.all().transform(3786) 
>>> point = Point(-118, 34, srid=3786) 
>>> qs.filter(coordinates__distance_lte=(point, D(m=1))) 
[<Place: 7-Eleven>, <Place: Arthur Murray Dance Studio>, <Place: Costco>, <Place: AMC Century City 15>, <Place: 24 Hour Fitness>, <Place: Ralphs>, <Place: Houston's Restaurant>, <Place: CVS/pharmacy>, <Place: Shaky Alibi>, <Place: Sephora>, <Place: Trader Joe's>] 

我有一种感觉,我只是选择了错误的SRIDs,但不是说我碰到的在线工作过,或因为即使是适度有用的任何反应的一个。

任何帮助,非常感谢!

+1

你可能想试试这里http://gis.stackexchange.com/ – pleasedontbelong

+0

感谢您的领导......没有意识到StackExchange有一个GIS相关问题的网站。想知道是否应该将它保存在这里,或者等待一个mod来移动它。 –

回答

8

我不喜欢回答我自己的问题,但没有人加强对板块,我想出了解决方案。

我深入研究了PostGIS以将问题隔离到位置数据库本身或Django。因此,我将上面使用的Django ORM查询转换为我期望PostGIS后端接收的理想查询。令我惊讶的是,正在生成的查询等同于:

SELECT id 
FROM app_place 
WHERE ST_DWithin(coordinates, ST_SetSRID(ST_Point(-118, 34), 3768), 1); 

这就是问题了。我需要的查询是:

SELECT id 
FROM app_place 
WHERE ST_Distance_Sphere(ST_SetSRID(ST_Point(-118, 34), 3768), coordinates) < 1; 

我通过Django的源读取弄清楚发生了什么事在这里,我意识到,我已经在我的coordinates字段设置geography=True。显然,这改变了Django在创建SQL查询时生成的PostGIS函数。这是无证的,但这里是relevant section

总之,如果您遇到此问题,请从您的模型中删除geography=True,并且您应该很好。

+1

嗨丹,我有类似的问题:http://gis.stackexchange.com/questions/14232/using-a-geodjango-pointfield-with-geograph-true-my-distance-calculations-are-6- O操作。理论上讲,在geography = True下,距离计算应该更精确,并使用ST_Distance_Spheroid。任何建议(除了删除地理=真,这将使我回到原点......)将是最有帮助的。谢谢 –