2011-07-28 138 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。任何建議(除了刪除地理=真,這將使我回到原點......)將是最有幫助的。謝謝 –