examples django geospatial geodjango

examples - GeoDjango, diferencia entre dwithin y distance_lt?



geodjango examples (1)

Usando geoDjango, ¿cuál es la diferencia entre

myObj.objects.filter(point__dwithin(...etc.))

y

myObj.objects.filter(point__distance_lt(...etc.))

?
¿Son lo mismo, o están haciendo cosas sutilmente diferentes?


Ok, hice algunas investigaciones pero no sé si los resultados son de alguna utilidad;)

  • Miré las pruebas de unidad que usan para probar las consultas de base de datos, pero no me dan pistas reales (a mí).

  • Intenté comparar el SQL generado:

Ya tengo una aplicación geo usando una base de datos PostgreSQL . Cuando realizo esta consulta con __distance_lt :

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

Obtengo este SQL generado:

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

Cuando intento usar do a lo mismo con __dwithin , __dwithin 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 objeto D :

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

lo que resulta en

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

Resumen:

__dwithin
- Toma los valores de grado como parámetro de distancia.
- Utiliza la función ST_DWithin SQL.

__distance_lt
- Puede tomar otros valores de distancia;).
- Utiliza la función SQL ST_distance_sphere .

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