Saya bekerja di GeoDjango (dengan backend Django 1.7 dan PostGIS 2.1.4). Saya memiliki model dengan PointField di database saya dan saya mencoba menemukan semua item dalam radius 10 km dari suatu titik.
Ini kode model saya:
class Place(models.Model):
id = models.IntegerField(primary_key=True)
location = models.PointField(null=True, blank=True)
objects = models.GeoManager()
Berikut ini adalah kode tampilan saya (disingkat agar mudah dibaca):
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)))
Ini memberi saya:
AttributeError: 'Point' object has no attribute 'location'
Saya melihat titik di konsol: POINT (1.0000000000000000 52.5000000000000000)
.
Bagaimana saya harus menyusun kueri secara berbeda?
Jika saya mencoba hanya menggunakan point
bukan point.location
(sesuai dokumentasi dwithin ) maka saya mendapatkan error yang berbeda: ValueError: Only numeric values of degree units are allowed on geographic DWithin queries
.
MEMPERBARUI:
Ini tampaknya berhasil, tetapi saya tidak tahu apakah itu benar:
radius = int(radius)
degrees = radius / 111.325
point = Point(float(lng), float(lat))
places = Place.objects.filter(location__dwithin=(point, degrees))
Hasilnya terlihat OK, tetapi saya tidak tahu apakah konversi saya ke derajat masuk akal.
Jawaban:
sumber
Anda dapat melakukan ini tanpa GeoDjango jika seseorang tertarik, Anda hanya perlu 2 ekstensi di postgres: cube, earthdistance
sumber