sql >> Database >  >> RDS >> PostgreSQL

Hoe krijg ik de k naaste buren voor geodjango?

U kunt een raw() sql-query om postgis order_by te gebruiken operators:

  1. <-> waarmee de dichtstbijzijnde buur de middelpunten van de begrenzingsvakken gebruikt om de afstanden tussen objecten te berekenen.

  2. <#> die ervoor zorgt dat de dichtstbijzijnde buur de begrenzingsvakken zelf gebruikt om de afstanden tussen objecten te berekenen.

In jouw geval lijkt degene die je wilt de <-> . te zijn operator, dus de onbewerkte vraag:

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

BEWERKEN vanwege eigen achterlijkheid: U kunt de [:k] . weglaten om LIMIT 1 toe te voegen op de onbewerkte SQL-query. (Gebruik niet beide zoals ik deed!)

Tijdens het beantwoorden van uw andere vraag:Hoe efficiënt is het om op afstand (hele tafel) te bestellen in geodjango ,een andere oplossing misschien mogelijk:

Door spatial indexing in te schakelen en het verfijnen van uw zoekopdracht door middel van logische beperkingen (zoals uitgelegd in mijn antwoord van de hierboven gekoppelde vraag) kunt u een vrij snelle KNN . behalen vraag als volgt op:

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. AWS Aurora:de MySQL-server wordt uitgevoerd met de optie --alleen-lezen, dus deze instructie kan niet worden uitgevoerd

  2. Procedure Bufferoverloop

  3. Fout in MySQL-query (fout in uw SQL-syntaxis)

  4. SQL Server:rij aanwezig in de ene query, ontbreekt in een andere