2011-07-28 6 views
7

開発マシンでGeoDjangoを起動して実行しました。問題は、私は距離のクエリを正しく動作させることができないということです。私が使用しているSRIDに関係なく、距離の結果は完全にオフです。ここに例があります。間違った結果を返すGeoDjango距離クエリ

>>> 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>] 

問題は、これらの場所がpointから1m以上離れていることです。

私はそれで遊んでみましたが、多くの幸運を持っていませんでした。ここに別の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を選択するが、いないよ感じています。

ご協力いただきありがとうございます。

+1

あなたはStackExchangeは、GIS関連の質問のためのサイトを持っていたことを認識していなかった...ヘッドアップのためにここにhttp://gis.stackexchange.com/ – pleasedontbelong

+0

感謝を尋ねるしようとする場合があります。私はそれをここに保持する必要があるか、またはモッドがそれを動かすのを待つかどうか思います。 –

答えて

8

私は自分の質問に答えることを憎むが、誰もプレートにステップアップしていないと私は解決策を考え出しました。

Iは、ロケーションデータベース自体のいずれかまたはジャンゴに問題を分離するためにPostGISの掘り下げ。そこで私は上記で使用した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のソースを読んで、私は私が私のcoordinatesフィールド上geography=True設定していたことに気づきました。どうやら、これはDjangoがSQLクエリを作成するときに生成するPostGIS関数を変更します。文書化されていませんが、ここにはrelevant sectionがあります。要するに

、あなたがこの問題を抱えている、あなたのモデルからgeography=Trueを削除し、あなたが行くように良いことがあります。

+1

こんにちは、私は同様の問題があります:http://gis.stackexchange.com/questions/14232/using-a-geodjango-pointfield-with-geograph-true-my-distance-calculations-are-6- o。理論的には、距離計算はgeography = Trueでより正確で、ST_Distance_Spheroidを使用する必要があります。任意の提案(地理学=真を取り除く以外に、私を正方形に戻す...以外)は、最も役に立ちます。ありがとう –

関連する問題