geoDjangoを使用すると、次の違いは何ですか
myObj.objects.filter(point__dwithin(...etc.))
と
myObj.objects.filter(point__distance_lt(...etc.))
?
それらは同じことですか、それとも微妙に異なることをしていますか?
geoDjangoを使用すると、次の違いは何ですか
myObj.objects.filter(point__dwithin(...etc.))
と
myObj.objects.filter(point__distance_lt(...etc.))
?
それらは同じことですか、それとも微妙に異なることをしていますか?
わかりました、私はいくつかの調査をしました、しかし私は結果が何か役に立つかどうかわかりません;)
私は彼らがDBクエリをテストするために使用する単体テストを見ましたが、彼らは(私に)本当のヒントを与えません。
生成されたSQLを比較しようとしました:
私はすでにPostgreSQLデータベースを使用するgeoアプリケーションを持っています。このクエリを__distance_lt
:で実行すると
Place.objects.filter(location__distance_lt=(p.location, D(km=1))).query.as_sql()
私はこの生成されたSQLを取得します:
SELECT (some_fields_here)
FROM "places_place"
WHERE ST_distance_sphere("places_place"."location", %s) < 1000.0
と同じようにdoを使用しようとすると__dwithin
、エラーが発生します。
Place.objects.filter(location__dwithin=(p.location, D(km=1))).query.as_sql()
TypeError: Only numeric values of degree units are allowed on geographic DWithin queries.
D
したがって、オブジェクトを使用しないようにクエリを変更する必要がありました。
Place.objects.filter(location__dwithin=(p.location, 1)).query.as_sql()
その結果、
SELECT (some fields here)
FROM "places_place"
WHERE ST_DWithin("places_place"."location", %s, 1)
概要:
__dwithin
-距離パラメータとして度の値を取ります。-SQL関数
を使用します。ST_DWithin
__distance_lt
-他の距離値を取ることができます;)。-SQL関数
を使用します。ST_distance_sphere
ところで、両方のクエリで異なる結果が得られますが、これは主に、使用する「次数」の値がわからないためだと思います。