Ok, he hecho un poco de investigación, pero no sé si los resultados son de alguna utilidad;)
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.
hola! :) esta es una respuesta extremadamente útil – djq
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
@FelixKling el valor de dwithin está en ** metros **, según [documentos de postgis] (http://postgis.org/docs/ST_DWithin.html) – s29