如何将ESRI Shapefile转换为含指定字段及地理信息的CSV文件
解决Geopandas导出CSV时提取地理坐标的方法
根据你的需求,Geopandas可以通过直接操作几何对象的属性或方法,提取出点、线、面对象的地理坐标,再导出到CSV中,以下是几种常见场景的实现方式:
1. 提取点要素的经纬度坐标
如果你的Shapefile是点类型,直接从geometry列的x、y属性提取坐标:
import geopandas as gpd # 读取Shapefile gdf = gpd.read_file("your_shapefile.shp") # 转换为WGS84经纬度坐标系(如果原数据不是的话) gdf = gdf.to_crs(epsg=4326) # 添加经纬度字段 gdf['longitude'] = gdf.geometry.x gdf['latitude'] = gdf.geometry.y # 导出CSV,可指定要保留的字段 gdf.to_csv("point_data_with_coords.csv", columns=['longitude', 'latitude', '属性列1', '属性列2'], index=False)
2. 提取线/面要素的质心坐标
对于线或面对象,若需要获取地理对象的中心位置,使用centroid属性计算质心:
import geopandas as gpd gdf = gpd.read_file("your_polyline_or_polygon.shp").to_crs(epsg=4326) # 计算质心并提取坐标 gdf['centroid_lon'] = gdf.geometry.centroid.x gdf['centroid_lat'] = gdf.geometry.centroid.y # 导出CSV gdf.to_csv("centroid_data.csv", index=False)
3. 提取线要素的起点/终点坐标
如果需要线对象的首尾端点坐标,通过coords属性获取:
import geopandas as gpd gdf = gpd.read_file("your_line_shapefile.shp").to_crs(epsg=4326) # 提取起点坐标 gdf['start_lon'] = gdf.geometry.apply(lambda geom: geom.coords[0][0]) gdf['start_lat'] = gdf.geometry.apply(lambda geom: geom.coords[0][1]) # 提取终点坐标 gdf['end_lon'] = gdf.geometry.apply(lambda geom: geom.coords[-1][0]) gdf['end_lat'] = gdf.geometry.apply(lambda geom: geom.coords[-1][1]) gdf.to_csv("line_start_end_coords.csv", index=False)
4. 提取面要素的所有顶点坐标
若需要面的每个顶点坐标,可使用explode方法将面拆分为单个顶点,再提取坐标:
import geopandas as gpd gdf = gpd.read_file("your_polygon_shapefile.shp").to_crs(epsg=4326) # 拆分面为单个顶点 gdf_vertices = gdf.explode(index_parts=True) # 提取顶点坐标 gdf_vertices['vertex_lon'] = gdf_vertices.geometry.x gdf_vertices['vertex_lat'] = gdf_vertices.geometry.y # 导出包含所有顶点的CSV gdf_vertices.to_csv("polygon_vertices.csv", index=False)
注意事项
- 导出时若不需要原
geometry列,可在to_csv的columns参数中明确指定要保留的字段,排除geometry;若需保留几何信息的WKT文本格式,默认导出会包含该列,无需额外操作。 - 确保坐标参考系正确,若原数据是投影坐标系(如UTM),务必先转换为WGS84(EPSG:4326)再提取经纬度。
内容的提问来源于stack exchange,提问作者parzival
相关产品推荐
相关产品推荐

