You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 00:27:03