2012-04-13 5 views
1

Ich habe gerade PostGIS mit GeoDjango installiert. Alles hat gut funktioniert, aber jetzt habe ich ein Problem und kann den Grund dafür nicht finden.GeoDjango + PostGIS berechnet falsche Entfernungen

Ich habe Modell wie folgt aus:

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() 

Und ich brachte seinen Punkt auf dieser Position (49.794254,9.927489). Dann erstelle ich einen Punkt wie folgt aus:

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

Der Abstand zwischen diesen Punkten sollte etwa ~ 125 km sein, aber wenn ich dies tun:

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

Ich erhalte immer über 60 km zu viel in meinem Ergebnis, so ist es 190 km zurück! Meine SRIDs beider Punkte sind 4326 ... ist wahrscheinlich damit etwas nicht in Ordnung?

Und vielleicht noch eine interessante Tatsache, wenn ich dies tun:

pnt.distance(shop.point) 

kehrt 1,713790 ... als Ergebnis.

Was mache ich falsch? Irgendwelche Alternativen für mich mit Python + Django zu verwenden? Wenn es eine bessere Lösung gibt, müsste ich PostGIS nicht verwenden.

Hoffe, du kannst mir helfen!

Chris

Antwort

3

Ich lief diese Abfrage in 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 

das Ergebnis ist in der Tat 190.50, so scheint es, es ist nichts falsch mit 190 km führen

gleiche Ergebnis mit diesem awesome page, gibt es eine kurze Erklärung, wie diese Abstände berechnet werden.

die 1.713790 ... Ergebnis scheint in den gleichen Einheiten des Srid zu sein, oder mit anderen Worten, die Zahl ist nicht in Metern.

EDIT Ooohh Ich sah nur Ihr Problem fehl am Platze Sie lat und lon, im WKT-Format, Länge kommt zuerst so die wirkliche Abfrage sein sollte:

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 

so sollten die Punkte wie angelegt werden diese

+0

Danke für Sie antworten, ich habe versucht, die Punkte zu tauschen, aber ich habe dies bereits vor der Post versucht, wie ich irgendwo gelesen habe. Wenn ich sie tausche, bekomme ich einen Wert um 5000, seltsames Zeug! Irgendwelche Ideen? Die Queries, die Sie geschrieben haben, funktionieren gut, wenn ich keine Lösung in Geodjango finde, werde ich die Querys manuell tun ... – Chris

+0

wenn ich nur eine von ihnen vertausche, bekomme ich 5925,95 KMs, um genau zu sein, so scheint es, dass diejenigen Sie haben gespeichert, sind falsch. –

+0

ok, habe einen Fehler gemacht, funktioniert jetzt, danke :)! – Chris