PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come ottengo i k vicini più vicini per geodjango?

Puoi utilizzare un raw() query sql per utilizzare Postgis order_by operatori:

  1. <-> che ottiene il vicino più vicino utilizzando i centri dei riquadri di delimitazione per calcolare le distanze tra gli oggetti.

  2. <#> che ottiene il vicino più vicino utilizzando i riquadri di delimitazione stessi per calcolare le distanze tra gli oggetti.

Nel tuo caso quello che vuoi sembra essere il <-> operatore, quindi la query grezza:

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

EDIT a causa della propria depiness: Puoi omettere il [:k] per aggiungere LIMIT 1 sulla query SQL grezza. (Non usare entrambi come ho fatto io!)

Nel processo di risposta alla tua altra domanda:Quanto è efficiente ordinare per distanza (intera tabella) in geodjango ,un'altra soluzione forse possibile:

Abilitando l'spatial indexing e restringendo la tua query attraverso vincoli logici (come spiegato nella mia risposta della domanda collegata sopra) puoi ottenere un KNN abbastanza veloce interrogare come segue:

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]