使用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
相关产品推荐
相关产品推荐

