PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да получа k най-близки съседи за geodjango?

Можете да използвате raw() sql заявка за използване на postgis order_by оператори:

  1. <-> който получава най-близкия съсед, използвайки центровете на ограничителните кутии, за да изчисли разстоянията между обектите.

  2. <#> който получава най-близкия съсед, използвайки самите ограничаващи полета, за да изчисли разстоянията между обектите.

Във вашия случай този, който искате, изглежда е <-> оператор, следователно необработената заявка:

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

РЕДАКТИРАНЕ поради собствена derpiness: Можете да пропуснете [:k] за да добавите LIMIT 1 на необработената SQL заявка. (Не използвайте и двете, както направих аз!)

В процеса на отговор на другия ви въпрос:Колко ефективно е да се подрежда по разстояние (цялата таблица) в geodjango , възможно е друго решение:

Чрез активиране на spatial indexing и стесняване на вашата заявка чрез логически ограничения (както е обяснено в моя отговор на въпроса, свързан по-горе) можете да постигнете доста бърз KNN заявка, както следва:

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. Избор по месец в PostgreSQL

  2. python + psycopg2 =неизвестни типове?

  3. Подобряване на производителността на ORDER BY при кръстосано свързване на jsonb с вътрешно свързване на група от

  4. Създайте база данни, като използвате съхранена функция

  5. Основи за управление на PostgreSQL схеми