You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何旋转Multipolygon且不改变其内部空间关系

解决Multipolygon旋转后多边形重叠问题

问题说明

有一个Multipolygon类型的Shapefile,执行旋转操作后,内部顶点变化导致子多边形出现重叠,需要避免这种情况。

已尝试的代码:

import geopandas as gpd
input_poly_path = "poly3.shp"
gdf = gpd.read_file(input_poly_path)
explode = gdf.explode(ignore_index=True)
ex = explode.rotate(-90, origin="centroid")
g = gpd.GeoDataFrame(columns=['geometry'], geometry='geometry')
g["geometry"] = ex

图形对比

  • 原始多边形:由多个互不重叠的子多边形组成,整体布局规整。
  • 旋转后多边形:子多边形相互交叉、重叠,原有拓扑结构被破坏。

解决方案

问题核心是拆分后单独旋转子多边形时,每个子多边形使用自身质心作为原点,导致相对位置偏移引发重叠。以下是两种解决思路:

思路1:直接旋转整个Multipolygon(不拆分)

保持原Multipolygon的整体结构,以整个复合图形的质心为原点旋转,确保子多边形相对位置不变:

import geopandas as gpd
from shapely.validation import make_valid

input_poly_path = "poly3.shp"
gdf = gpd.read_file(input_poly_path)

# 以整个Multipolygon的质心为原点旋转
gdf["geometry"] = gdf.geometry.rotate(-90, origin="centroid")

# 修复旋转可能产生的拓扑错误
gdf["geometry"] = gdf.geometry.apply(make_valid)

# 保存结果
gdf.to_file("rotated_poly.shp")

思路2:拆分后统一使用全局质心旋转

若必须拆分处理,需确保所有子多边形使用同一个旋转原点(比如原Multipolygon的质心),旋转后再合并:

import geopandas as gpd
from shapely.validation import make_valid

input_poly_path = "poly3.shp"
gdf = gpd.read_file(input_poly_path)

# 获取原Multipolygon的质心作为统一旋转原点
global_centroid = gdf.geometry.iloc[0].centroid

# 拆分子多边形并统一旋转
exploded_gdf = gdf.explode(ignore_index=True)
exploded_gdf["geometry"] = exploded_gdf.geometry.rotate(-90, origin=global_centroid)

# 重新合并为Multipolygon
merged_gdf = exploded_gdf.dissolve(by=None, as_index=False).set_geometry("geometry")

# 修复拓扑错误
merged_gdf["geometry"] = merged_gdf.geometry.apply(make_valid)

merged_gdf.to_file("rotated_merged_poly.shp")

内容的提问来源于stack exchange,提问作者Purple_Ad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 03:16:12