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

使用Geopandas筛选指定ID点并查询指定距离范围内邻近点

代码错误原因

原代码无法得到正确结果,核心问题有3个:

  • 未提前筛选指定ID的目标点,直接对全量点生成缓冲区,每个点都会与自身的缓冲区相交,因此返回全部15个点
  • 错误选择EPSG:3857(Web墨卡托)作为距离计算投影,该投影存在固有距离形变,不适合做精确米级运算;你的研究区对应EPSG:2157为爱尔兰官方投影坐标系,本身以米为单位,距离计算无偏差
  • 未单独提取目标点几何做空间匹配,缓冲区运算对象错误
可直接运行的正确实现
import geopandas as gpd

# --------------- 按需修改以下参数 ---------------
input_file = 'C:/test/points.geojson'
target_point_id = "1"   # 要搜索的目标点ID
search_radius_m = 100   # 搜索半径,单位米
exclude_target = True   # 是否在结果中排除目标点本身
# -----------------------------------------------

# 读入数据,统一转换为EPSG:2157(单位:米,适合研究区精确距离计算)
gdf = gpd.read_file(input_file).to_crs("EPSG:2157")

# 提取目标点几何
target_geom = gdf.loc[gdf["id"] == target_point_id, "geometry"].iloc[0]

# 计算所有点到目标点的实际距离(单位:米)
gdf["distance_to_target_m"] = gdf.geometry.distance(target_geom).round(2)

# 筛选半径范围内的点
result = gdf[gdf["distance_to_target_m"] <= search_radius_m]
if exclude_target:
    result = result[result["id"] != target_point_id]

# 输出结果:ID + 到目标点的距离
print("半径{}米范围内的点:".format(search_radius_m))
print(result[["id", "distance_to_target_m"]].to_string(index=False))
输出示例

假设搜索ID为1的点周边150米范围,输出格式如下:

半径150米范围内的点:
id  distance_to_target_m
2                42.35
11              128.71
7                96.22
注意事项
  • 无需手动提取经纬度重建GeoDataFrame,geopandas读入空间文件后会自动识别geometry字段,手动重建反而容易引入CRS赋值错误
  • 废弃旧版本{"init":"EPSG:xxxx"}的CRS写法,直接传入EPSG编码字符串即可,兼容所有新版geopandas
  • 如果你的研究区不在爱尔兰,替换为对应区域的等距投影/本地UTM投影即可保证距离计算精度,不要用EPSG:3857做近距离米级分析

内容的提问来源于stack exchange,提问作者userhelp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 04:57:19