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)