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

Hvordan får jeg de k nærmeste naboer til geodjango?

Du kan bruge en raw () sql-forespørgsel for at bruge postgis order_by operatører:

  1. <-> som får den nærmeste nabo ved at bruge midten af ​​afgrænsningsfelterne til at beregne afstanden mellem objekter.

  2. <#> som får den nærmeste nabo ved at bruge selve afgrænsningsboksene til at beregne afstanden mellem objekter.

I dit tilfælde ser det ud til, at den du ønsker er <-> operatør, således den rå forespørgsel:

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

REDIGERING på grund af egen derpines: Du kan udelade [:k] for at tilføje LIMIT 1 på den rå SQL-forespørgsel. (Brug ikke begge dele, som jeg gjorde!)

I færd med at besvare dit andet spørgsmål:Hvor effektivt er det at bestille efter afstand (hele tabellen) i geodjango ,en anden løsning er måske mulig:

Ved at aktivere rumlig indeksering og indsnævre din forespørgsel gennem logiske begrænsninger (som forklaret i mit svar af ovenstående -linkede spørgsmål) kan du opnå en ret hurtig KNN forespørgsel som følger:

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. Ændring af MySQL-forespørgselsafgrænseren gennem C API

  2. Karakterdata overføres ikke fra php til jquery

  3. SQLAlchemy ingen adgangskode angivet fejl

  4. Hvad er det maksimale antal rækker, en enkelt SQL Server-tabel kan gemme?