【问题标题】:GeoDjango query: all point that are contained into a multi polygonGeoDjango查询:包含在多多边形中的所有点
【发布时间】:2016-09-07 02:32:32
【问题描述】:

我有两个模型:

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)

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

【问题讨论】:

    标签: python django django-orm geodjango


    【解决方案1】:

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

    假设:

    1. Model_A 有一个名为:model_a_point 的几何字段。
    2. Model_B 有一个名为:model_b_poly 的几何字段。

    使用的方法:

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

    2. OuterRef(),Django 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
        )
    )
    

    结果等等:

    上面的查询将为Model_B 中的每个多边形提供一个字段contained_points,其中包含该多边形包含的Model_A 中的每个点。

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

    【讨论】:

      猜你喜欢
      • 2015-03-07
      • 2018-10-21
      • 1970-01-01
      • 2015-10-13
      • 2023-02-18
      • 1970-01-01
      • 2017-04-23
      • 1970-01-01
      • 2016-09-06
      相关资源
      最近更新 更多