raw()
postgis order_by
を利用するためのSQLクエリ 演算子:
-
<->
これは、バウンディングボックスの中心を使用して最近傍を取得し、オブジェクト間の距離を計算します。 -
<#>
これは、バウンディングボックス自体を使用してオブジェクト間の距離を計算する最近傍を取得します。
あなたの場合、あなたが望むのは<->
のようです 演算子、したがって生のクエリ:
knn = Person.objects.raw(
'SELECT * FROM myapp_person
ORDER BY location <-> ST_SetSRID(ST_MakePoint(%s, %s),4326)',
[location.x, location.y]
)[:k]
自分のダーピネスによる編集: [:k]
は省略できます LIMIT 1
を追加するには 生のSQLクエリで。 (私がしたように両方を使用しないでください!)
他の質問に答える過程で: geodjangoで距離(テーブル全体)で注文するのはどれくらい効率的ですか 、別の解決策が考えられるかもしれません:
spatial indexing
を有効にする 論理的な制約によってクエリを絞り込みます(私の答えでは
上記のリンクされた質問の)あなたはかなり速い KNNを達成することができます 次のようにクエリします:
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]