2011-07-28 35 views
7

Właśnie uruchomiłem GeoDjango na mojej maszynie programistycznej. Problem polega na tym, że nie mogę uzyskać zapytania odległości, aby działało poprawnie. Bez względu na to, z jakiego SRID korzystam, wyniki odległości są całkowicie wyłączone. Oto przykład.Zapytania odległości geograficznej zwracające nieprawidłowe wyniki

>>> from django.contrib.gis.measure import D 
>>> from app.models import Place 
>>> from django.contrib.gis.geos import Point 
>>> qs = Place.objects.all() 
>>> point = Point(-118, 34) 
>>> qs.filter(coordinates__distance_lte=(point, D(m=1))) 
[<Place: 7-Eleven>, <Place: Arthur Murray Dance Studio>, <Place: Costco>, <Place: AMC Century City 15>, <Place: 24 Hour Fitness>, <Place: Ralphs>, <Place: Houston's Restaurant>, <Place: CVS/pharmacy>, <Place: Shaky Alibi>, <Place: Sephora>, <Place: Trader Joe's>] 

Problemem jest to, że te miejsca są znacznie dalej niż 1m od point.

Próbowałem z nim grać, ale nie miałem szczęścia. Oto przykład z innym SRID.

>>> qs = Place.objects.all().transform(3786) 
>>> point = Point(-118, 34, srid=3786) 
>>> qs.filter(coordinates__distance_lte=(point, D(m=1))) 
[<Place: 7-Eleven>, <Place: Arthur Murray Dance Studio>, <Place: Costco>, <Place: AMC Century City 15>, <Place: 24 Hour Fitness>, <Place: Ralphs>, <Place: Houston's Restaurant>, <Place: CVS/pharmacy>, <Place: Shaky Alibi>, <Place: Sephora>, <Place: Trader Joe's>] 

mam wrażenie, że jestem po prostu wybranie złego SRIDs, ale ani jeden, że mam napotkasz Online pracował, albo podano żadnej odpowiedzi, która jest nawet umiarkowanie przydatne.

Każda pomoc jest bardzo doceniana!

+1

możesz spróbować zapytać tutaj http://gis.stackexchange.com/ – pleasedontbelong

+0

Dzięki za heads-up ... nie zdawałem sobie sprawy, że StackExchange miał stronę z pytaniami związanymi z GIS. Zastanawiam się, czy powinienem zatrzymać to tutaj, czy też poczekać, aż mod go przeniesie. –

Odpowiedz

8

Nienawidzę odpowiadać na moje własne pytanie, ale nikt inny nie podszedł do talerza i wymyśliłem rozwiązanie.

Wpadłem do PostGIS, aby wyizolować problem z samą bazą danych lokalizacji lub z Django. Więc skonwertowałem zapytanie ORM Django, którego użyłem powyżej, do idealnego zapytania, którego oczekiwałbym od serwera PostGIS. Ku mojemu zaskoczeniu, zapytanie, które było produkowane, było równoważne:

SELECT id 
FROM app_place 
WHERE ST_DWithin(coordinates, ST_SetSRID(ST_Point(-118, 34), 3768), 1); 

To był problem właśnie tam. Zapytanie Potrzebowałam:

SELECT id 
FROM app_place 
WHERE ST_Distance_Sphere(ST_SetSRID(ST_Point(-118, 34), 3768), coordinates) < 1; 

czytam przez źródło Django, aby dowiedzieć się, co się tu dzieje, a ja zrozumiałem, że zaszło geography=True na moim coordinates dziedzinie. Wydaje się, że zmienia to funkcje PostGIS generowane przez Django podczas tworzenia zapytania SQL. Jest to nieudokumentowane, ale tutaj jest relevant section.

Krótko mówiąc, jeśli masz ten problem, usuń geography=True ze swojego modelu i powinieneś być gotowy.

+1

Witam Dan, mam podobny problem: http://gis.stackexchange.com/questions/14232/using-a-geodjango-pointfield-with-geograph-true-my-distance-calculations-are-6- o. Teoretycznie obliczenia odległości powinny być dokładniejsze pod geography = True i użyć ST_Distance_Spheroid. Wszelkie sugestie (poza usunięciem geografii = prawda, która zabierze mnie z powrotem do kwadratu ...) byłyby najbardziej pomocne. Dzięki –

Powiązane problemy