GeoDjango + PostGIS вычисляет неверные расстояния

Я только что установил PostGIS с GeoDjango. Все работало нормально, но теперь у меня есть проблема, и я не могу выяснить причину этого.

У меня есть модель, как это:

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.

Надеюсь, вы можете помочь мне!

Крис

1 ответ

Решение

Я только что запустил этот запрос в 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... представляется в тех же единицах измерения, или, другими словами, это число не в метрах.

РЕДАКТИРОВАТЬ О-о-о-о! Я только что увидел вашу проблему: вы сместили символы широты и долготы, в формате WKT на первом месте стоит Longitude, поэтому реальный запрос должен быть следующим:

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)
Другие вопросы по тегам