2011-07-28 20 views
7

Acabo de instalar GeoDjango en mi máquina de desarrollo. El problema es que no puedo obtener una consulta de distancia para que funcione correctamente. No importa qué SRID utilizo, los resultados de la distancia son totalmente off. Aquí hay un ejemplo.Consultas de distancia de GeoDjango que devuelven resultados incorrectos

>>> 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>] 

El problema es que estos lugares son mucho más de 1 m de distancia de point.

He intentado jugar con él, pero no he tenido mucha suerte. Aquí hay un ejemplo con otro 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>] 

Tengo la sensación de que simplemente estoy eligiendo los SRID equivocadas, pero ni uno solo que me he encontrado en línea se ha trabajado, o dado ninguna respuesta que es incluso moderadamente útil.

¡Cualquier ayuda es muy apreciada!

+1

es posible que desee intentar preguntar aquí http://gis.stackexchange.com/ – pleasedontbelong

+0

Gracias por el aviso ... no se dio cuenta de que StackExchange tenía un sitio para preguntas relacionadas con SIG. Me pregunto si debería guardarlo aquí, o esperar a que un mod lo mueva. –

Respuesta

8

Odio estar respondiendo mi propia pregunta, pero nadie más se acercó al plato y descubrí la solución.

Profundicé en PostGIS para aislar el problema ya sea en la base de datos de ubicación o en Django. Así que convertí la consulta ORM de Django que había estado utilizando anteriormente en la consulta ideal que esperaba que el back-end de PostGIS recibiera. Para mi sorpresa, la consulta que se estaba produciendo era equivalente a:

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

Ese era el problema allí mismo. La consulta que necesitaba era:

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

leí a través de la fuente de Django para averiguar lo que estaba pasando aquí, y me di cuenta de que me había propuesto geography=True en mi campo coordinates. Aparentemente, esto cambia las funciones de PostGIS que Django genera al crear la consulta SQL. No está documentado, pero aquí está el relevant section.

En resumen, si tiene este problema, elimine geography=True de su modelo y debería estar listo para empezar.

+1

Hola, tengo un problema similar: http://gis.stackexchange.com/questions/14232/using-a-geodjango-pointfield-with-geograph-true-my-distance-calculations-are-6- o En teoría, los cálculos de distancia deberían ser más precisos en geografía = Verdadero y usar ST_Distance_Spheroid. Cualquier sugerencia (que no sea simplemente eliminar geografía = Verdadero, lo que me llevará de vuelta al punto de partida ...) sería de gran ayuda. Gracias –

Cuestiones relacionadas