如何通过GeoPandas拆分多边形解决WKT超Excel字符长度限制问题
Shapefile转WKT超长字符串拆分方案
问题
将Shapefile转换为WKT格式用于数据关联时,部分多边形的WKT字符串长度超过Excel的30000字符限制,GeoPandas的explode()仅能拆分多部分多边形,无法解决单一大多边形的超长问题,需要实现按长度阈值拆分多边形列。
已尝试代码:
import geopandas myshpfile = geopandas.read_file("cb_2018_us_county_500k/cb_2018_us_county_500k.shp") gd = geopandas.GeoDataFrame(myshpfile) exploded = gd.explode(index_parts=True) exploded.to_file('test_county_exploded.csv', driver='CSV', geometry= 'AS_WKT')
解决方案
1. 定位超长WKT记录
先计算每条记录的WKT长度,筛选出超过阈值的多边形:
import geopandas as gpd import pandas as pd # 读取Shapefile数据 gdf = gpd.read_file("cb_2018_us_county_500k/cb_2018_us_county_500k.shp") # 生成WKT字符串并计算长度 gdf['wkt'] = gdf.geometry.to_wkt() gdf['wkt_len'] = gdf['wkt'].str.len() # 设定长度阈值(对应Excel的30000字符限制) threshold = 30000 # 拆分正常长度和超长的数据集 normal_gdf = gdf[gdf['wkt_len'] <= threshold].copy() long_gdf = gdf[gdf['wkt_len'] > threshold].copy()
2. 处理超长多边形
针对单一大多边形的超长问题,提供两种可行方案:
方案A:几何简化(快速减少顶点)
通过simplify()方法减少多边形顶点数量,直接缩短WKT长度,tol参数控制简化程度(单位与数据坐标系一致):
# 简化超长多边形,示例用1000米容差(若为经纬度坐标系可设0.01度左右) long_gdf['geometry'] = long_gdf['geometry'].simplify(tol=1000) # 更新WKT字符串和长度 long_gdf['wkt'] = long_gdf['geometry'].to_wkt() long_gdf['wkt_len'] = long_gdf['wkt'].str.len()
方案B:分割多边形为小块
如果简化无法满足精度要求,可将大多边形分割为多个小多边形:
from shapely.geometry import LineString from shapely.ops import split def split_large_polygon(polygon, split_count=2): """将多边形分割为指定数量的子多边形""" min_x, min_y, max_x, max_y = polygon.bounds split_lines = [] # 生成垂直分割线 for i in range(1, split_count): split_x = min_x + (max_x - min_x) * i / split_count line = LineString([(split_x, min_y), (split_x, max_y)]) split_lines.append(line) # 逐步分割多边形 result_polys = [polygon] for line in split_lines: temp_list = [] for p in result_polys: if p.intersects(line): temp_list.extend(split(p, line)) else: temp_list.append(p) result_polys = temp_list return result_polys # 批量处理所有超长多边形 split_rows = [] for idx, row in long_gdf.iterrows(): split_polys = split_large_polygon(row['geometry'], split_count=2) for poly in split_polys: new_row = row.copy() new_row['geometry'] = poly new_row['wkt'] = poly.to_wkt() new_row['wkt_len'] = len(new_row['wkt']) split_rows.append(new_row) split_gdf = gpd.GeoDataFrame(split_rows, crs=long_gdf.crs)
3. 合并结果并导出
将处理后的所有数据合并,导出为带WKT的CSV文件:
# 合并正常数据与处理后的超长数据 final_gdf = gpd.GeoDataFrame(pd.concat([normal_gdf, split_gdf], ignore_index=True), crs=gdf.crs) # 导出CSV文件 final_gdf.to_file('county_wkt_processed.csv', driver='CSV', geometry='AS_WKT')
注意事项
- 几何简化的
tol参数需根据数据坐标系调整,平衡精度和WKT长度。 - 分割多边形时可调整
split_count值,确保拆分后的WKT长度低于阈值。 - 导出前可再次校验
wkt_len列,确保所有记录符合要求。
内容的提问来源于stack exchange,提问作者P201_eng
相关产品推荐
相关产品推荐

