9

開発マシンで GeoDjango を起動して実行しました。問題は、距離クエリが正しく機能しないことです。どの SRID を使用しても、距離の結果は完全にずれています。これが例です。

>>> from django.contrib.gis.measure import D
>>> from app.models import Place
>>> from django.contrib.gis.geos import Point
>>> qs = Place.objects.all()
>>> point = Point(-118, 34)
>>> qs.filter(coordinates__distance_lte=(point, D(m=1)))
[<Place: 7-Eleven>, <Place: Arthur Murray Dance Studio>, <Place: Costco>, <Place: AMC Century City 15>, <Place: 24 Hour Fitness>, <Place: Ralphs>, <Place: Houston's Restaurant>, <Place: CVS/pharmacy>, <Place: Shaky Alibi>, <Place: Sephora>, <Place: Trader Joe's>]

問題は、これらの場所が から 1 メートル以上離れていることですpoint

私はそれで遊んでみましたが、あまり運がありませんでした。別の SRID の例を次に示します。

>>> qs = Place.objects.all().transform(3786)
>>> point = Point(-118, 34, srid=3786)
>>> qs.filter(coordinates__distance_lte=(point, D(m=1)))
[<Place: 7-Eleven>, <Place: Arthur Murray Dance Studio>, <Place: Costco>, <Place: AMC Century City 15>, <Place: 24 Hour Fitness>, <Place: Ralphs>, <Place: Houston's Restaurant>, <Place: CVS/pharmacy>, <Place: Shaky Alibi>, <Place: Sephora>, <Place: Trader Joe's>]

間違った SRID を選択しているだけのような気がしますが、オンラインで実行した SRID で機能したものは 1 つもありませんでした。

どんな助けでも大歓迎です!

4

1 に答える 1

9

私は自分の質問に答えるのが嫌いですが、他の誰もプレートに足を踏み入れておらず、解決策を見つけました.

PostGIS を掘り下げて、問題をロケーション データベース自体または Django に切り分けました。そこで、上記で使用していた Django ORM クエリを、PostGIS バックエンドが受け取ると予想される理想的なクエリに変換しました。驚いたことに、生成されたクエリは次のようなものでした。

SELECT id
FROM app_place
WHERE ST_DWithin(coordinates, ST_SetSRID(ST_Point(-118, 34), 3768), 1);

そこが問題でした。必要なクエリは次のとおりです。

SELECT id
FROM app_place
WHERE ST_Distance_Sphere(ST_SetSRID(ST_Point(-118, 34), 3768), coordinates) < 1;

ここで何が起こっているのかを理解するために Django のソースを読み、geography=True自分のcoordinates分野に着手したことに気付きました。どうやら、これは SQL クエリの作成時に Django が生成する PostGIS 関数を変更するようです。文書化されていませんが、関連するセクションは次のとおりです。

つまり、この問題が発生している場合はgeography=True、モデルから削除すれば問題ありません。

于 2011-07-29T06:42:53.790 に答える