如何从dataframe中提取线剖面范围内数据?geopandas/shapely有无对应方法
实现方案
geopandas和shapely完全支持该需求,核心逻辑是将剖面线生成指定宽度的缓冲带,再通过空间相交判断筛选符合条件的点数据,具体实现步骤如下:
步骤1:导入依赖库
import geopandas as gpd from shapely.geometry import LineString
步骤2:将普通DataFrame转为空间GeoDataFrame
注意缓冲宽度为米制单位,需要将原始经纬度地理坐标系转为投影坐标系(单位为米),避免缓冲范围计算错误:
# 基于经纬度生成空间几何列,默认原始坐标为WGS84经纬度,对应EPSG:4326 gdf = gpd.GeoDataFrame( df, geometry=gpd.points_from_xy(df.longitude, df.latitude), crs="EPSG:4326" ) # 自动匹配当前区域的UTM米制投影坐标系,也可手动替换为你所在区域对应的投影EPSG编码 gdf_proj = gdf.to_crs(gdf.estimate_utm_crs())
步骤3:生成5km宽度的剖面缓冲带
# 将剖面两点转为线几何对象 profile_line = LineString(profile) # 剖面线转成和点数据一致的投影坐标系 profile_proj = gpd.GeoSeries([profile_line], crs="EPSG:4326").to_crs(gdf_proj.crs) # 生成5km宽度的缓冲带,投影单位为米所以传5000 buffer_zone = profile_proj.buffer(5000).iloc[0]
步骤4:筛选落在缓冲带内的所有数据
# 空间相交判断筛选符合条件的行 result_gdf = gdf_proj[gdf_proj.intersects(buffer_zone)] # 可选操作:转回到WGS84经纬度坐标系 # result_gdf = result_gdf.to_crs("EPSG:4326") # 可选操作:转为普通DataFrame,去除空间几何列 # result_df = result_gdf.drop(columns="geometry")
注意事项
- 如果你的原始数据已经是米制投影坐标系,可以省略转投影的步骤,直接生成缓冲带即可
- 国内区域优先使用对应带号的CGCS2000高斯投影,精度会比通用UTM投影更高
- 如果需要严格的正交矩形剖面范围(而不是两端带圆弧的缓冲带),可以额外计算线的法向偏移量构建多边形,普通场景下默认缓冲带完全满足需求
内容的提问来源于stack exchange,提问作者vgb_backup
相关产品推荐
相关产品推荐

