Estou trabalhando no GeoDjango (com um back-end do Django 1.7 e PostGIS 2.1.4). Eu tenho um modelo com um PointField no meu banco de dados e estou tentando encontrar todos os itens no raio de 10 km de um ponto.
Aqui está o código do meu modelo:
class Place(models.Model):
id = models.IntegerField(primary_key=True)
location = models.PointField(null=True, blank=True)
objects = models.GeoManager()
Aqui está o meu código de exibição (abreviado para facilitar a leitura):
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)))
Isso me dá:
AttributeError: 'Point' object has no attribute 'location'
Eu vejo o ponto no console: POINT (1.0000000000000000 52.5000000000000000)
.
Como devo estruturar a consulta de maneira diferente?
Se eu tentar usar apenas point
em vez de point.location
(como pela documentação dwithin ), então eu recebo um erro diferente: ValueError: Only numeric values of degree units are allowed on geographic DWithin queries
.
ATUALIZAR:
Isso parece funcionar, mas não sei se está correto:
radius = int(radius)
degrees = radius / 111.325
point = Point(float(lng), float(lat))
places = Place.objects.filter(location__dwithin=(point, degrees))
Os resultados parecem bons, mas não sei se minha conversão para graus é razoável.
Respostas:
fonte
Você pode fazer isso sem o GeoDjango se alguém estiver interessado, você só precisa de 2 extensões no postgres: cubo, distância da terra
fonte