我的地图上有很多标记。我有两个不相交的多边形(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?
答案 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))