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

如何用QGIS或Python为数据集A点生成1km半径并统计B点数量?

当然可以!两种方法都能轻松实现需求

不管你偏好可视化操作还是代码自动化,用QGIS或者Python都能完美解决这个统计需求。下面分别给你详细拆解步骤:

方法一:用QGIS可视化操作实现

首先要注意:因为要计算1公里的距离,两个数据集必须使用投影坐标系(比如UTM这类以米为单位的坐标系),如果当前是经纬度的地理坐标系,先转投影(右键图层→导出→保存要素为,选择对应区域的投影坐标系即可)。

具体步骤:

  1. 把数据集A和B都加载到QGIS中。
  2. 打开「处理工具箱」(快捷键Ctrl+Alt+T),搜索「连接属性(按位置)」工具:
    • 输入图层:选择数据集A
    • 连接图层:选择数据集B
    • 几何谓词:勾选「在...的距离内」,输入1000(单位是米,对应1公里)
    • 连接设置:选择「统计连接图层中的匹配要素数量」,这个选项会自动给A的每个点新增一个count字段,就是你要的缓冲区内B点数量
    • 输出选择保存为新图层(建议不要直接修改原数据,避免误操作)
  3. 完成后,新图层里的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:48:32