1

我刚刚用 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。

希望你能帮我!

克里斯

4

1 回答 1

4

我刚刚在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 公里结果似乎没有问题

这个很棒的页面的结果相同,简要说明了如何计算这个距离。

1.713790... 结果似乎与 srid 的单位相同,或者换句话说,该数字不是以米为单位的。

编辑 哦,我刚刚看到你的问题,你放错了纬度和经度,在 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)
于 2012-04-13T20:59:29.580 回答