PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm cách nào để tìm k láng giềng gần nhất cho geodjango?

Bạn có thể sử dụng raw() truy vấn sql để sử dụng postgis order_by toán tử:

  1. <-> 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.

  2. <#> 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]



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để nhập các khối dữ liệu * khổng lồ * vào PostgreSQL?

  2. Tính số sự kiện đồng thời trong SQL

  3. cách truy vấn inet / cidr tối thiểu hoặc tối đa với postgres

  4. Triển khai cơ sở dữ liệu Postgres trên Phiên bản container màu xanh?

  5. Chia mảng JSON khổng lồ (95Mb) thành nhiều phần nhỏ hơn?