Je travaille dans GeoDjango (avec un backend Django 1.7 et PostGIS 2.1.4). J'ai un modèle avec un PointField dans ma base de données et j'essaie de trouver tous les éléments dans un rayon de 10 km d'un point.
Voici mon code modèle:
class Place(models.Model):
id = models.IntegerField(primary_key=True)
location = models.PointField(null=True, blank=True)
objects = models.GeoManager()
Voici mon code de vue (abrégé pour plus de lisibilité):
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)))
Cela me donne:
AttributeError: 'Point' object has no attribute 'location'
Je vois le point dans la console: POINT (1.0000000000000000 52.5000000000000000)
.
Comment dois-je structurer la requête différemment?
Si j'essaie simplement utiliser point
plutôt que point.location
(selon la documentation dwithin ) je reçois une autre erreur: ValueError: Only numeric values of degree units are allowed on geographic DWithin queries
.
MISE À JOUR:
Cela semble fonctionner, mais je ne sais pas si c'est correct:
radius = int(radius)
degrees = radius / 111.325
point = Point(float(lng), float(lat))
places = Place.objects.filter(location__dwithin=(point, degrees))
Les résultats semblent corrects, mais je ne sais pas si ma conversion en degrés est raisonnable.
Réponses:
la source
Vous pouvez le faire sans GeoDjango si quelqu'un est intéressé, il vous suffit de 2 extensions sur postgres: cube, earthdistance
la source