PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak zdobyć k najbliższych sąsiadów dla geodjango?

Możesz użyć raw() Zapytanie sql do wykorzystania postgis order_by operatorzy:

  1. <-> który pobiera najbliższego sąsiada za pomocą środków obwiedni do obliczenia odległości między obiektami.

  2. <#> który pobiera najbliższego sąsiada używając samych ramek ograniczających do obliczenia odległości między obiektami.

W twoim przypadku ten, który chcesz, wydaje się być <-> operator, czyli surowe zapytanie:

knn = Person.objects.raw(
    'SELECT * FROM myapp_person 
    ORDER BY location <-> ST_SetSRID(ST_MakePoint(%s, %s),4326)',
    [location.x, location.y]
)[:k]

EDYTUJ z powodu własnej głupoty: Możesz pominąć [:k] aby dodać LIMIT 1 w nieprzetworzonym zapytaniu SQL. (Nie używaj obu tak jak ja!)

W trakcie odpowiadania na Twoje inne pytanie:Jak efektywne jest zamawianie według odległości (cała tabela) w geodjango , możliwe jest inne rozwiązanie:

Włączając spatial indexing i zawężenie zapytania poprzez ograniczenia logiczne (jak wyjaśniono w mojej odpowiedzi powyższego pytania) możesz osiągnąć dość szybko KNN zapytanie w następujący sposób:

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. [Wideo] Integracja danych z PostgreSQL

  2. PostgreSQL - Jak przekonwertować sekundy w polu numerycznym na GG:MM:SS

  3. Jak mogę automatycznie wypełnić pola bazy danych SQLAlchemy? (Fask-SQLAlchemia)

  4. Nie znaleziono identyfikatora transakcji Postgresql

  5. Urządzenie Django nie działa, podając DatabaseError:wartość za długa dla typu znaku zmienna (50)