如何用QGIS或Python为数据集A点生成1km半径并统计B点数量?
当然可以!两种方法都能轻松实现需求
不管你偏好可视化操作还是代码自动化,用QGIS或者Python都能完美解决这个统计需求。下面分别给你详细拆解步骤:
方法一:用QGIS可视化操作实现
首先要注意:因为要计算1公里的距离,两个数据集必须使用投影坐标系(比如UTM这类以米为单位的坐标系),如果当前是经纬度的地理坐标系,先转投影(右键图层→导出→保存要素为,选择对应区域的投影坐标系即可)。
具体步骤:
- 把数据集A和B都加载到QGIS中。
- 打开「处理工具箱」(快捷键Ctrl+Alt+T),搜索「连接属性(按位置)」工具:
- 输入图层:选择数据集A
- 连接图层:选择数据集B
- 几何谓词:勾选「在...的距离内」,输入
1000(单位是米,对应1公里) - 连接设置:选择「统计连接图层中的匹配要素数量」,这个选项会自动给A的每个点新增一个
count字段,就是你要的缓冲区内B点数量 - 输出选择保存为新图层(建议不要直接修改原数据,避免误操作)
- 完成后,新图层里的
count字段就是每个A点1公里范围内B点的统计值啦。
方法二:用Python(GeoPandas)代码实现
如果需要批量处理或者集成到工作流里,用GeoPandas写代码会更高效。先确保安装了依赖库:
pip install geopandas shapely
然后跟着下面的代码步骤来:
import geopandas as gpd # 加载你的两个数据集(支持shp、GeoJSON等常见格式) gdf_a = gpd.read_file("你的数据集A路径") gdf_b = gpd.read_file("你的数据集B路径") # 统一坐标系为投影坐标系(这里示例用EPSG:32633,根据你的数据所在区域选对应的UTM带) target_crs = "EPSG:32633" if gdf_a.crs != target_crs: gdf_a = gdf_a.to_crs(target_crs) if gdf_b.crs != target_crs: gdf_b = gdf_b.to_crs(target_crs) # 给A的每个点生成1000米(1公里)缓冲区 gdf_a["buffer_1km"] = gdf_a.geometry.buffer(1000) # 将缓冲区设为当前几何,方便空间连接 gdf_a_buffer = gdf_a.set_geometry("buffer_1km") # 空间连接,找到每个缓冲区内的B点 joined_data = gpd.sjoin(gdf_a_buffer, gdf_b, how="left", predicate="contains") # 按A的原始索引分组,统计每个缓冲区内B点的数量 counts = joined_data.groupby(joined_data.index).size().rename("b_point_count") # 把统计结果合并回原A数据集 gdf_a = gdf_a.join(counts) # 保存结果到文件(比如shp) gdf_a.to_file("带统计值的数据集A路径.shp")
代码里的注释已经写得很清楚了,你只需要替换对应的文件路径和合适的投影坐标系就行。统计结果会存在b_point_count字段里,直接关联到A的每个点上。
内容的提问来源于stack exchange,提问作者Enrico Bergamini
相关产品推荐
相关产品推荐

