sql >> Databáze >  >> RDS >> PostgreSQL

Jak získám k nejbližších sousedů pro geodjango?

Můžete použít raw() sql dotaz k použití postgis order_by operátoři:

  1. <-> který získá nejbližšího souseda pomocí středů ohraničujících rámečků k výpočtu vzdáleností mezi objekty.

  2. <#> který získá nejbližšího souseda pomocí samotných ohraničujících rámečků k výpočtu vzdáleností mezi objekty.

Ve vašem případě se zdá, že ten, který chcete, je <-> operátor, tedy nezpracovaný dotaz:

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

UPRAVIT z důvodu vlastní derpity: Můžete vynechat [:k] přidat LIMIT 1 na nezpracovaný SQL dotaz. (Nepoužívejte oba jako já!)

V procesu odpovídání na vaši další otázku:Jak efektivní je objednávat podle vzdálenosti (celý stůl) v geodjango ,možná jiné řešení:

Povolením spatial indexing a zúžení vašeho dotazu pomocí logických omezení (jak je vysvětleno v mé odpovědi z výše propojené otázky) můžete dosáhnout docela rychlého KNN dotaz takto:

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. Postup Přetečení vyrovnávací paměti

  2. Proč to Zahrnout nefunguje?

  3. Automatizace barmana s loutkou:it2ndq/barman (část první)

  4. Jak určit, co je efektivnější:DISTINCT nebo WHERE EXISTS?