2012-04-13 128 views
1

我剛剛安裝了PostGIS和GeoDjango。一切正常,但現在我有一個問題,無法找出原因。GeoDjango + PostGIS計算錯誤距離

我有模式是這樣的:

from django.contrib.gis.db import models 

class Shop(models.Model): 
    name = models.CharField(max_length=80) 
    point = models.PointField(null=True, blank=True) 
    objects = models.GeoManager() 

我設置了點這個位置(49.794254,9.927489)。然後我創建這樣一個觀點:

pnt = fromstr('POINT(50.084068 8.238381)') 

這點之間的距離應爲約〜125公里,但如果我這樣做:

results = Shop.objects.distance(pnt) 
print results[0].distance.km 

我越來越總是60公里太多在我的結果,所以它返回190公里!我的兩個點的SRID都是4326 ......可能有些不對嗎?

也許另一個有趣的事實,當我這樣做:

pnt.distance(shop.point) 

它返回1.713790 ......結果。

我在做什麼錯?任何替代品,我用python + django?如果有更好的解決方案,我不需要使用PostGIS。

希望你能幫助我!

克里斯

回答

3

我只是在postgis運行此查詢:

select round(CAST(ST_Distance_Sphere(ST_GeomFromText('POINT(49.794254 9.927489)',4326), ST_GeomFromText('POINT(50.084068 8.238381)',4326)) As numeric)/1000.0,2) as distance_km; 
distance_km 
------------- 
     190.50 

的結果,其實是190.50,因此它似乎沒有什麼不對您190公里導致

與此相同的結果真棒page,有一個簡要的解釋如何計算這個距離。

1.713790 ...結果似乎是在相同的單位,或換句話說,這個數字不是以米爲單位。

編輯 Ooohh喔我剛纔看到你的問題,你放錯位置的緯度和經度,在WKT格式,經度是第一位的,因此真正的查詢應該是:

select round(CAST(ST_Distance_Sphere(ST_GeomFromText('POINT(9.927489 49.794254)',4326), ST_GeomFromText('POINT(8.238381 50.084068)',4326)) As numeric)/1000.0,2) as distance_km; 
distance_km 
------------- 
     125.10 

所以點應等創建這

POINT(9.927489 49.794254) 
POINT(8.238381 50.084068) 
+0

感謝您的答覆,我試圖交換點,但我已經試過這個帖子之前,因爲我在某處讀。當我交換它們時,我得到一個5000左右的值,奇怪的東西!有任何想法嗎? 你張貼的查詢工作正常,如果我沒有找到geodjango的解決方案我會手動查詢... – Chris 2012-04-13 22:23:21

+0

如果我只交換其中一個我得到5925.95公里是確切的,所以看起來那些你存儲的是錯誤的。 – 2012-04-13 22:33:02

+0

好的,做錯了,現在工作,謝謝:)! – Chris 2012-04-15 12:29:14