2012-04-13 57 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