如何在 MultiPolygon 或多个多边形上进行空间查找 "contained"?
How to do spatial lookup "contained" on MultiPolygon or several Polygons?
我有一张地图,上面有很多标记。我有两个不相交的多边形(框)。我想得到所有被这些多边形覆盖的标记。
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 不等于多边形?
秘诀就在我标出的字里(来自geoqueryset documentation)
contained
Availability: PostGIS, MySQL, SpatiaLite
Tests if the geometry field’s bounding box is completely contained by the lookup geometry’s bounding box
你创建的两个多边形刚好面积小,你创建的多边形面积也小,但它的边界框就不一样了。
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 中可用,因此 contains 是一个很好的替代品。
contains
Availability: PostGIS, Oracle, MySQL, SpatiaLite
Tests if the geometry field spatially contains the lookup geometry.
那么你的查询就变成了
Marker.objects.filter(Q(point__contains=qb_1) | Q(point__contains=qb_1))
我有一张地图,上面有很多标记。我有两个不相交的多边形(框)。我想得到所有被这些多边形覆盖的标记。
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 不等于多边形?
秘诀就在我标出的字里(来自geoqueryset documentation)
contained
Availability: PostGIS, MySQL, SpatiaLite
Tests if the geometry field’s bounding box is completely contained by the lookup geometry’s bounding box
你创建的两个多边形刚好面积小,你创建的多边形面积也小,但它的边界框就不一样了。
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 中可用,因此 contains 是一个很好的替代品。
contains
Availability: PostGIS, Oracle, MySQL, SpatiaLite
Tests if the geometry field spatially contains the lookup geometry.
那么你的查询就变成了
Marker.objects.filter(Q(point__contains=qb_1) | Q(point__contains=qb_1))