如何在MultiPolygon或多个多边形上“包含”空间查找?

时间:2015-10-06 13:34:31

标签: django geospatial geodjango

我的地图上有很多标记。我有两个不相交的多边形(Box)。我希望得到这些多边形覆盖的所有标记。

qb_1 = Polygon.from_bbox((-35.19153, -5.84512, -35.24054, -5.78552))
qb_2 = Polygon.from_bbox((64.16016, 50.26125, 61.80359, 52.04911))
q_box = MultiPolygon(qb_1, qb_2)

test1 = Marker.objects.filter(point__contained=qb_1)
test2 = Marker.objects.filter(point__contained=qb_2)

test = Marker.objects.filter(point__contained=q_box)

print "Count of Polygon 1 = %s" % test1.count()
print "Count of Polygon 2 = %s" % test2.count()
print "Count of MultiPolygon = %s" % test.count()

但结果是:

Count of Polygon 1 = 4
Count of Polygon 2 = 12
Count of MultiPolygon = 237

为什么Polygon 1 + Polygon 2不等于MultiPolygon?

1 个答案:

答案 0 :(得分:2)

秘密在于我突出显示的词语(来自geoqueryset documentation

  

     

可用性:PostGIS,MySQL,SpatiaLite

     

测试几何体字段的边界框是否完全包含在查找几何体的边界框中

你创建的两个多边形碰巧有很小的区域,你创建的多边形区域也有一个小的区域,但是关于它的边界框也是如此。

qb_1.envelope.area   # 0.0029209960000001417
qb_2.envelope.area   # 4.213217240200014
qbox.envelope.area   # 5754.726987961

正如您将看到的那样,最后一个是巨大的,它比自己拍摄的两个多边形要多得多。因此,整体大于它的部分之和。

您应该能够获得两个多边形所涵盖的实际点数,如下所示:

来自django.db.models导入Q.    Marker.objects.filter(Q(point__contained = qb_1)| Q(point__contained = qb_1))

但也许contains_properly是你真正想要的?但是只有在postgresql中才可以使用,这是一个很好的替代品。

  

包含

     

可用性:PostGIS,Oracle,MySQL,SpatiaLite

     

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

然后您的查询变为

Marker.objects.filter(Q(point__contains=qb_1) | Q(point__contains=qb_1))