GeoDjango查询:包含在多边形中的所有点

时间:2016-05-11 15:17:44

标签: python django django-orm geodjango

我有两种模式:

Model_A that contains a GeoDjango Point;

Model_B that contains a GeoDjnago MultiPololygon;

对于Model_A中的每个元素,我必须检查该点是否包含在Model_B元素的某个m_polygon中;

我能够进行这个简单的查询。

但我也想过: 我在Model_A中有很多元素,Model_B中有很少的元素。 因此,迭代Model_B中的所有元素并检查Model_A中是否存在包含在当前Model_B元素中的某个元素可能更有效。

那么,有没有办法制作这个GeoDjango查询?

这样的事情:

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

------------------编辑-----------------

我试着用这个:

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

这对我有用。 在我的情况下是否有使用此类查询的禁忌症?

1 个答案:

答案 0 :(得分:0)

从Django 1.11版开始,您有一个优化的选项来解决此查询。

<强>假设:

  1. Model_A有一个名为model_a_point的几何字段。
  2. Model_B有一个名为model_b_poly的几何字段。
  3. 使用的方法:

    1. Subquery(),Django 1.11中的新方法,允许使用子查询部分定义查询。

    2. OuterRef(),Django 1.11中使用的新方法:

        

      当子查询中的查询集需要从外部引用字段时   查询。

    3. within(),其中:

        

      测试几何字段是否在查找几何体中空间上。

    4. annotate(),它将为查询集中的每个项生成一个新字段(在我们的示例中,它将包含多边形包含的点。)

    5. <强>查询:

      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_B,其中包含此多边形所包含的Model_A中的每个点。

      如果您只想保留这些点的几何字段(lon, lan),请在Subquery调用(参考:1)的末尾使用values()方法。