2016-05-11 21 views
1

に含まれるすべてのポイントは、私は2つのモデルがあります:私はポイントがModel_B要素の一部m_polygonに含まれているかどうかを確認する必要がModel_A内のすべての要素についてGeoDjangoクエリ:マルチポリゴン

Model_A that contains a GeoDjango Point; 

Model_B that contains a GeoDjnago MultiPololygon; 

を。

私はこの簡単なクエリを行うことができます。

しかし、私も考えました: 私はModel_Aに多くの要素を持ち、Model_Bにはいくつかの要素があります。 Model_Bのすべての要素を繰り返し処理し、現在のModel_B要素に含まれるModel_Aの要素が存在するかどうかを確認する方が効率的です()。

このGeoDjangoクエリを作成する方法はありますか?このような

何か:

Model_A.objects.filter(*point_is_contained_into*=a_model_b_mpolygon); 

------------------ EDIT --------------- -

私はこれを使用してみました:

result = Model_A.objects.filter(position__intersects=a_model_b_mpolygon) 

をそして、これは私のために動作します。 私の場合、このタイプのクエリを使用するための禁忌はありますか?

答えて

0

Djangoバージョン1.11から、このクエリを解決する最適化されたオプションがあります。

仮定:model_a_point

  1. Model_Aと呼ばれるジオメトリフィールドを持っています。
  2. Model_Bには、model_b_polyというジオメトリフィールドがあります。使用

方法:

  1. Subquery()、サブクエリ部分とクエリの定義を可能にジャンゴ1.11で新しい方法。

  2. OuterRef()、使用されるジャンゴ1.11で新しい方法:

    サブクエリでクエリセットは、外側 クエリからフィールドを参照する必要がある場合。

  3. within()、どの:

    テストジオメトリフィールドが参照ジオメトリ内の空間的である場合。クエリセット内の各項目のために生成されます

  4. annotate()、新しいフィールド(我々の場合には、それは多角形で含まれる点が含まれます。)

問合せ:

Model_B.objects.annotate(
    contained_points=Subquery(
     Model_A.objects.filter(
      model_a_point__within=OuterRef('model_b_poly') 
     ) # Ref: 1, referenced below, keep reading 
    ) 
) 

結果ともっと何か:

上記のクエリは、のすべてのポリゴンにフィールドcontained_pointsがあり、このポリゴンに含まれる各ポイントはModel_Aです。

これらの点のジオメトリフィールド(lon, lan)のみを保持したい場合は、Subqueryコール(Ref:1)の最後にvalues()メソッドを使用します。

関連する問題