首页 > 解决方案 > 如何将复杂几何划分为 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 。

在此处输入图像描述

标签: pythongisshapesgeopandasshapely

解决方案


最简单和最有效的解决方案之一是采用几何的minimum_rotated_rectangle

  1. 首先,将 Polygon 或 MultiPolygon 转换为 LineString 并获得minimum_rotated_rectangle包含此线的内容。

  2. 然后将之前的代码应用到这个矩形。

  3. 最后,您必须在多边形的 LineString 和子几何之间进行第二次拆分。


一个伟大的交钥匙解决方案:https ://stackoverflow.com/a/68778560/14864907


推荐阅读