Estoy trabajando en GeoDjango (con un backend Django 1.7 y PostGIS 2.1.4). Tengo un modelo con un PointField en mi base de datos y estoy tratando de encontrar todos los artículos dentro de un radio de 10 km de un punto.
Aquí está mi código modelo:
class Place(models.Model):
id = models.IntegerField(primary_key=True)
location = models.PointField(null=True, blank=True)
objects = models.GeoManager()
Aquí está mi código de vista (abreviado para facilitar la lectura):
from django.contrib.gis.geos import Point
from django.contrib.gis.measure import Distance
lat = 52.5
lng = 1.0
radius = 10
point = Point(lng, lat)
print point
places = Place.objects.filter(location__dwithin=(point.location, Distance(km=radius)))
Esto me da:
AttributeError: 'Point' object has no attribute 'location'
Veo el momento de la consola: POINT (1.0000000000000000 52.5000000000000000)
.
¿Cómo debo estructurar la consulta de manera diferente?
Si lo intento simplemente usando point
en lugar de point.location
(según la documentación dwithin ) entonces consigo un error diferente: ValueError: Only numeric values of degree units are allowed on geographic DWithin queries
.
ACTUALIZAR:
Esto parece funcionar, pero no sé si es correcto:
radius = int(radius)
degrees = radius / 111.325
point = Point(float(lng), float(lat))
places = Place.objects.filter(location__dwithin=(point, degrees))
Los resultados se ven bien, pero no sé si mi conversión a grados es razonable.
Respuestas:
fuente
Puede hacer esto sin GeoDjango si alguien está interesado, solo necesita 2 extensiones en postgres: cubo, tierra
fuente