17

geoDjangoを使用すると、次の違いは何ですか

myObj.objects.filter(point__dwithin(...etc.))   

myObj.objects.filter(point__distance_lt(...etc.))  

?
それらは同じことですか、それとも微妙に異なることをしていますか?

4

1 に答える 1

31

わかりました、私はいくつかの調査をしました、しかし私は結果が何か役に立つかどうかわかりません;)

私はすでに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

ところで、両方のクエリで異なる結果が得られますが、これは主に、使用する「次数」の値がわからないためだと思います。

于 2010-02-10T12:33:16.980 に答える