python - 如何将复杂几何划分为 n 等于子几何?
问题描述
我想将复杂的几何体划分n
为同一区域的子几何体。
例如,如果我有一个矩形,我可以做这样的事情
from shapely.geometry import LineString, MultiPolygon, Polygon
from shapely.ops import split
def splitPolygon(polygon, nx, ny):
minx, miny, maxx, maxy = polygon.bounds
dx = (maxx - minx) / nx
dy = (maxy - miny) / ny
minx, miny, maxx, maxy = polygon.bounds
dx = (maxx - minx) / nx # width of a small part
dy = (maxy - miny) / ny # height of a small part
horizontal_splitters = [LineString([(minx, miny + i*dy), (maxx, miny + i*dy)]) for i in range(ny)]
vertical_splitters = [LineString([(minx + i*dx, miny), (minx + i*dx, maxy)]) for i in range(nx)]
splitters = horizontal_splitters + vertical_splitters
result = polygon
for splitter in splitters:
result = MultiPolygon(split(result, splitter))
return result
myPolygons = splitPolygon(polygon, 5, 5)
import geopandas as gpd
gdfR = gpd.GeoDataFrame(columns=['geometry'], data=myPolygons.geoms)
f,ax=plt.subplots()
gdfR.boundary.plot(ax=ax, color='red')
polygon.boundary.plot(ax=ax)
我想将复杂的几何图形拆分为n
同一区域的最小几何图形。可以在此处将几何图形下载为 shapefile 。
解决方案
最简单和最有效的解决方案之一是采用几何的minimum_rotated_rectangle。
首先,将 Polygon 或 MultiPolygon 转换为 LineString 并获得
minimum_rotated_rectangle
包含此线的内容。然后将之前的代码应用到这个矩形。
最后,您必须在多边形的 LineString 和子几何之间进行第二次拆分。
一个伟大的交钥匙解决方案:https ://stackoverflow.com/a/68778560/14864907
推荐阅读
- android-studio - 如何在 android studio 应用程序中添加可以运行 3rd 方软件的模拟器?
- laravel - Laravel Valet 504 Gateway Time-out nginx/1.19.6 after 60 seconds
- flutter - 输入'未来
' 不是类型 '((GetXState ) => 无效)? - swift - Swift 泛型函数类型排序
- python - Groupby 的 Python 最小/最大日期
- javascript - 数组上的 useTransition 返回未定义的数组属性(React Spring)
- spring - 如何为 spring GatewayFilter 测试生成取消的请求?
- excel - 快速/高效的 VBA 代码,用于比较大型数据库(约 9000 行)的 excel 中的两列
- debugging - 我可以阻止 STMCubeIDE 在微控制器复位(调试)时打开启动 .s 文件吗?
- python - 使用 pymssql 连接数据库时遇到问题