2010-02-10 8 views

Respuesta

25

Ok, he hecho un poco de investigación, pero no sé si los resultados son de alguna utilidad;)

  • Miré el unit tests que utilizan para probar las consultas de base de datos pero no lo hacen dar pistas reales (para mí).

  • Me trataron de comparar el SQL generado:

Ya tengo una aplicación de geo utilizando un PostgreSQL DATABSE. Al realizar esta consulta con __distance_lt:

Place.objects.filter(location__distance_lt=(p.location, D(km=1))).query.as_sql() 

consigo este SQL generado:

SELECT (some_fields_here) 
FROM "places_place" 
WHERE ST_distance_sphere("places_place"."location", %s) < 1000.0 

Cuando intento usar hacerlo a la misma con __dwithin, me sale un error:

Place.objects.filter(location__dwithin=(p.location, D(km=1))).query.as_sql() 

TypeError: Only numeric values of degree units are allowed on geographic DWithin queries. 

Así que tuve que cambiar la consulta para no usar un D objeto:

Place.objects.filter(location__dwithin=(p.location, 1)).query.as_sql() 

que resulta en

SELECT (some fields here) 
FROM "places_place" 
WHERE ST_DWithin("places_place"."location", %s, 1) 

Resumen:

__dwithin
- toma valores de grado como distanc e parámetro.
- usa ST_DWithin función de SQL.

__distance_lt
- puede tomar otras valores de distancia;).
- usa ST_distance_sphere función de SQL.

Por cierto, obtengo resultados diferentes con ambas consultas, pero creo que esto se debe principalmente al hecho de que no sé qué valor de "grado" usar.

+0

hola! :) esta es una respuesta extremadamente útil – djq

+2

Nota ** dwithin ** es el más rápido ya que hace el mejor uso del índice espacial [ver discusión aquí] (http://stackoverflow.com/questions/7845133/how-can-i- query-all-my-data-within-a-distance-of-5-meters). – s29

+1

@FelixKling el valor de dwithin está en ** metros **, según [documentos de postgis] (http://postgis.org/docs/ST_DWithin.html) – s29