我正在尝试在具有大的无数据值(1e6)的2D网格中找到所有整体的边界多边形。我已经找到了使用scipy标签工作的孔列表。没有浸入gdal的多边形,是否有一种简单的方法来生成边界多边形?我看到有matplotlib.pylab.contour,但这会尝试绘制一个我真的不想要的情节。关于如何为每个标签获取边界多边形的任何建议(如果可能的话,最好采用一种简化多边形的方法)?我确信我可以写出一些可以在每个标记孔的范围内行走的东西,但是有什么东西已经存在吗?
from osgeo import gdal
from scipy import ndimage
dem_file = gdal.Open('dem.tif')
dem = dem.file.GetRasterBand(1).ReadAsArray()
# Get a binary image of the no-data regions. The no-data value is large
bin = dem > 9e5
# Find all the wholes. Anything with a label > 0.
labels, num_labels = ndimage.measurements.label(bin)
num_labels
1063
# The hole's label and size. Skip 0 as that label has all the valid data.
holes = [(label, sum(labels==label)) for label in range(1, num_labels)]
holes[:3]
[(1, 7520492),
(2, 1),
(3, 1),]
e.g。而不是计数,我正在寻找所有这些白色区域的边界,如qgis所示,这是用gdal_polygonalize.py完成的。
答案 0 :(得分:4)
感谢Joe Kington将我指向Scikit Image。
from skimage import measure
contours = measure.find_contours(labels, 1)
contours[-1]
array([[ 2686.99905927, 1054. ],
[ 2686. , 1053.00094073],
[ 2685.00094073, 1054. ],
[ 2686. , 1054.99905927],
[ 2686.99905927, 1054. ]])
imshow(labels)
for n, contour in enumerate(contours):
plt.plot(contour[:,1], contour[:, 0], linewidth=2)
放大左下角后: