U kunt een raw()
sql-query om postgis order_by
te gebruiken operators:
-
<->
waarmee de dichtstbijzijnde buur de middelpunten van de begrenzingsvakken gebruikt om de afstanden tussen objecten te berekenen. -
<#>
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]