python - 从 numpy bool 网格获取多边形的外部坐标

标签 python numpy shapely

我正在尝试从 numpy bool 网格获取多边形的外部坐标。例如,来自 (16, 16) ndarray,如下所示

[
    [False False False False False False  True  True  True  True False False False False False False],
    [False False False False False  True  True  True  True  True  True False False False False False],
    [False False False False False False False False False False  True  True False False False False],
    [False False False False False False False False False False  False True False False False False],
    [False False False False False False False False False False False False False False False False],
    [False False False False False False False False False False False False False False False False],
    [False False False False False False False False False False False False False False False False],
    [False False False False False False False False False False False False False False False False],
    [False False False False False False False False False False False False False False False False],
    [False False False False False False False False False False False False False False False False],
    [False False False False False False False False False False False False False False False False],
    [False False False False False False False False False False False False False False False False],
    [False False False False False False False False False False False False False False False False],
    [False False False False False False False False False False False False False False False False],
    [False False False False False False False False False False False False False False False False],
    [False False False False False False False False False False False False False False False False]
]

如果我们绘制ndarray,它将如下所示:

Boolean grid as image

我想按顺序获得以下坐标,以便我们可以绘制该多边形的外环,例如,[(5 1), (6 0), (7 0), (8 0), (9 0), (10 1), (11 2), (11 3), (10 2), (9 1), (8 1), (7 1), (6 1)].到目前为止我所拥有的内容如下:

# Consider that the boolean ndarray above is called 'prediction'

import numpy as np
from shapely.geometry import Polygon, Point
import matplotlib.pyplot as plt

# Get the coordinates that match the boolean polygon
(y, x) = np.where(prediction == True)

# Iterate on each of the coordinates, however my problem is that it is not aware of the contour order as it should be :/
coordinates = [Point(x_coordinate, y_coordinate) for x_coordinate, y_coordinate in itertools.izip(x, y)]
# Build the polygon out of the points
polygon = Polygon([[coordinate.x, coordinate.y] for coordinate in coordinates])

exterior_x, exterior_y = polygon.exterior.xy

# Plotting

fig = plt.figure(1, figsize=(5, 5))
ax = fig.add_subplot(1, 2, 1)
ax.plot(exterior_x, exterior_y, color='#6699cc')
ax.invert_yaxis()

plt.subplot(1, 2, 2)
plt.imshow(prediction)
plt.show()

问题是我构建多边形时没有考虑顺序,因此 polygon.exterior.xy 的结果将创建外环。我的方法将创建错误的多边形轮廓,例如:

enter image description here

但是,我无法提出解决此问题的通用方法。我欢迎任何关于如何解决这个问题的建议。提前致谢。

最佳答案

或许您可以将问题移至GIS stack exchange site 。在那里您可能会获得更多这方面的帮助。

无论如何,快速搜索显示 this anwer ,其中建议使用 rasterio 库,我理解这是您所需要的。

根据您的情况进行调整,它可以是:

import numpy as np
import rasterio.features

# Convert your array to 0-1 integers
myarray = [[1 if t else 0 for t in row] for row in myarray]
# Build a numpy array
myarray = np.array(myarray)
# Convert the type (don't even know why this was needed in my computer, but raised exception if not converted.
myarray = myarray.astype(np.int32)

# Let the library do the magic. You should take a look at the rasterio.features.shapes output
mypols = [p[0]['coordinates'] 
                   for p in  rasterio.features.shapes(myarray)]

mypols 现在是一个坐标数组,您可以轻松地将其转换为 shapely 多边形。

注意正确测试陌生人案例。我尝试构建一个多重多边形,并且该库将每个连接的组件作为多边形返回。幸运的是,它为每个多边形返回关联的值,因此您可以根据需要进行后期处理。 不过,带有内环的多边形似乎处理得很好。 我不知道在这些情况下您期望的行为是什么。

关于python - 从 numpy bool 网格获取多边形的外部坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49618782/

相关文章:

python - 由于精度问题,形状无法在点上分割线

python - 将浮点四舍五入到一位小数(具体问题)

运行 Excel 宏的 Python

python - coverity构建工具没有分析选项。 "cov-analyze"丢失

Python Image Shuffle Failure - 我哪里出错了?

python - 使用Python+NumPy+Numba时如何加速数组访问

python - 从多边形列表中减去内环

python - 如何将项目添加到 collection.Counter?然后将它们分类为 ASC?

python - 使用 matplotlib 从 Python plot 获取数据然后保存到数组

python - 创建多边形的算法(无Thiesen/Voronoi)