如何旋转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
相关产品推荐
相关产品推荐

