Tôi đang làm việc trong GeoDjango (với phụ trợ Django 1.7 và PostGIS 2.1.4). Tôi có một mô hình với PointField trong cơ sở dữ liệu của mình và tôi đang cố gắng tìm tất cả các mục trong bán kính 10km của một điểm.
Đây là mã mô hình của tôi:
class Place(models.Model):
id = models.IntegerField(primary_key=True)
location = models.PointField(null=True, blank=True)
objects = models.GeoManager()
Đây là mã xem của tôi (được rút ngắn để dễ đọc):
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)))
Điều này mang lại cho tôi:
AttributeError: 'Point' object has no attribute 'location'
Tôi thấy điểm trong giao diện điều khiển : POINT (1.0000000000000000 52.5000000000000000)
.
Làm thế nào tôi nên cấu trúc truy vấn khác nhau?
Nếu tôi cố gắng chỉ sử dụng point
chứ không phải point.location
(theo tài liệu dwithin ) thì tôi gặp một lỗi khác : ValueError: Only numeric values of degree units are allowed on geographic DWithin queries
.
CẬP NHẬT:
Điều này có vẻ hiệu quả, nhưng tôi không biết liệu nó có đúng không:
radius = int(radius)
degrees = radius / 111.325
point = Point(float(lng), float(lat))
places = Place.objects.filter(location__dwithin=(point, degrees))
Kết quả có vẻ ổn, nhưng tôi không biết liệu chuyển đổi sang độ của mình có hợp lý không.