Ich arbeite in GeoDjango (mit einem Django 1.7 und PostGIS 2.1.4 Backend). Ich habe ein Modell mit einem PointField in meiner Datenbank und versuche, alle Elemente innerhalb eines Radius von 10 km um einen Punkt zu finden.
Hier ist mein Modellcode:
class Place(models.Model):
id = models.IntegerField(primary_key=True)
location = models.PointField(null=True, blank=True)
objects = models.GeoManager()
Hier ist mein Ansichtscode (zur besseren Lesbarkeit gekürzt):
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)))
Das gibt mir:
AttributeError: 'Point' object has no attribute 'location'
Ich sehe den Punkt in der Konsole : POINT (1.0000000000000000 52.5000000000000000)
.
Wie soll ich die Abfrage anders strukturieren?
Wenn ich versuche, nur point
anstatt point.location
(gemäß der Dokumentation ) zu verwenden, erhalte ich einen anderen Fehler : ValueError: Only numeric values of degree units are allowed on geographic DWithin queries
.
AKTUALISIEREN:
Das scheint zu funktionieren, aber ich weiß nicht, ob es richtig ist:
radius = int(radius)
degrees = radius / 111.325
point = Point(float(lng), float(lat))
places = Place.objects.filter(location__dwithin=(point, degrees))
Die Ergebnisse sehen in Ordnung aus, aber ich weiß nicht, ob meine Umrechnung in Grad angemessen ist.
Antworten:
quelle
Sie können dies ohne GeoDjango tun, wenn jemand interessiert ist. Sie benötigen nur 2 Erweiterungen für Postgres: Cube, Earthdistance
quelle