2015-10-06 261 views
1

我有一个地图上有很多标记。我有两个不相交的多边形(Box)。我想获得由这些多边形覆盖的所有标记。如何在MultiPolygon或多个多边形上进行空间查找“包含”?

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 

为什么多边形1 + 2多边形不等于的MultiPolygon?

回答

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)) 
+0

现在我明白了!谢谢!但是我怎样才能得到一个具有Polygon 1和Polygon 2覆盖点的查询集呢? – Anton

+1

更新回答这个 – e4c5

+0

嗯,它真的有用!我认为|它是OR并且我得到qb_1或qb_2,但它工作正确,因为我需要。谢谢! – Anton

相关问题