Python生成Voronoi区域遇RuntimeError错误求助
解决geovoronoi生成Voronoi区域时的RuntimeError问题
针对你遇到的ridge line must intersect with surrounding geometry错误,按以下步骤排查修复:
1. 严格验证点与包围几何的CRS一致性及包含关系
你提到点在Mapinfo中正常,但Python环境下可能存在CRS不匹配问题——巴基斯坦几何已转成epsg:3395(平面坐标系,单位米),但你的经纬度点可能还是WGS84(epsg:4326,经纬度),直接传入会导致坐标逻辑混乱。
先把点转换为与包围几何一致的CRS,再逐一验证是否在范围内:
import geopandas as gpd import numpy as np from shapely.geometry import Point # 假设你的点数据存储为lat_list(纬度)、lon_list(经度)、id_list、code_list points_geo = [Point(lon, lat) for lat, lon in zip(lat_list, lon_list)] gdf_points = gpd.GeoDataFrame( data={'id': id_list, 'code': code_list}, geometry=points_geo, crs='EPSG:4326' # 经纬度默认采用WGS84坐标系 ) # 加载并转换巴基斯坦几何(示例代码,根据你的实际文件路径调整) pak_geo = gpd.read_file('pakistan_shapefile.shp').to_crs('EPSG:3395') pak_boundary = pak_geo.unary_union # 合并为单一边界几何 # 转换点的CRS到epsg:3395 gdf_points_proj = gdf_points.to_crs('EPSG:3395') # 检查每个点是否在巴基斯坦边界内 gdf_points_proj['is_inside'] = gdf_points_proj.geometry.within(pak_boundary) # 输出不在范围内的点 print(gdf_points_proj[~gdf_points_proj['is_inside']])
如果输出非空,说明确实有点在边界外,需修正这些点的坐标,或调整边界范围。
2. 给包围几何添加微小缓冲解决边界点精度问题
如果所有点理论上都在范围内,但因浮点精度问题被判定为在边界外,可以给巴基斯坦边界做一个微小缓冲:
# 缓冲10米(epsg:3395单位是米,可根据需求调整缓冲距离) pak_boundary_buffered = pak_boundary.buffer(10)
之后用pak_boundary_buffered作为voronoi_regions_from_coords的geom参数。
3. 确认Voronoi输入坐标的格式正确性
voronoi_regions_from_coords需要的是平面坐标系的(x,y)数组,注意不要直接传入经纬度,也不要搞反lat和lon的顺序。转换后的点提取坐标的正确方式:
# 从转换后的GeoDataFrame提取坐标数组 coords = gdf_points_proj.geometry.apply(lambda geom: (geom.x, geom.y)).tolist() coords = np.array(coords) # 转换为numpy数组
4. 清理重复或异常点
如果存在完全重合的点,也可能导致Voronoi计算出错,先去重:
# 基于几何特征去重 gdf_points_proj = gdf_points_proj.drop_duplicates(subset='geometry')
额外建议:替代方案(针对相同编码的邻近点区域展示)
如果你的需求是相同编码的邻近点聚合为区域,不一定非要用Voronoi,可以尝试:
- 对相同编码的点用DBSCAN聚类,再生成凸包/凹包
- 用
geopandas.GeoDataFrame.groupby('code').agg()结合unary_union生成聚合区域,再用Folium展示
内容的提问来源于stack exchange,提问作者Umama
相关产品推荐
相关产品推荐

