Bạn có thể sử dụng raw()
truy vấn sql để sử dụng postgis order_by
toán tử:
-
<->
lấy hàng xóm gần nhất bằng cách sử dụng tâm của các hộp giới hạn để tính toán khoảng cách giữa các đối tượng. -
<#>
lấy hàng xóm gần nhất bằng cách sử dụng chính các hộp giới hạn để tính toán khoảng cách giữa các đối tượng.
Trong trường hợp của bạn, cái bạn muốn có vẻ là <->
toán tử, do đó là truy vấn thô:
knn = Person.objects.raw(
'SELECT * FROM myapp_person
ORDER BY location <-> ST_SetSRID(ST_MakePoint(%s, %s),4326)',
[location.x, location.y]
)[:k]
CHỈNH SỬA do sở thích riêng: Bạn có thể bỏ qua [:k]
để thêm LIMIT 1
trên truy vấn SQL thô. (Không sử dụng cả hai như tôi đã làm!)
Trong quá trình trả lời câu hỏi khác của bạn: Mức độ hiệu quả khi đặt hàng theo khoảng cách (toàn bộ bảng) trong geodjango , một giải pháp khác có thể có:
Bằng cách bật spatial indexing
và thu hẹp truy vấn của bạn thông qua các ràng buộc logic (như đã giải thích trong câu trả lời của tôi
của câu hỏi được liên kết ở trên), bạn có thể đạt được KNN khá nhanh truy vấn như sau:
current_location = me.location
people = People.objects.filter(
location__dwithin=(current_location, D(km=50))
).annotate(
distance=Distance('location', current_location)
).order_by('distance')[:k]