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

如何计算地图指定半径范围内指标的平均值

空间数据分析:计算每个点位半径范围内的观测数与指标均值

需求说明

以数据集中每个点位为圆心,统计15公里半径内的观测数量,以及这些观测的metric指标平均值,最终输出包含原数据、count和avg_metric的数据集。

修正原始数据集注意点

你的原始代码用cbind创建数据框会把数值型的lat、lon、metric转成字符型,建议直接用data.frame()创建,避免后续计算出错:

set.seed(123) # 设置种子确保结果可复现
name = c('A', 'B', 'C', 'D', 'E','F','G','H','I','J')
lat = runif(10,min=37,max=39)
lon = runif(10,min=-91,max=-89)
metric = runif(10,min=0,250)

# 正确创建数据框,保留数值类型
df = data.frame(name, lat, lon, metric)

方案一:基于spatialrisk包扩展实现

你找到的points_in_circle函数仅支持单个圆心,我们可以封装成函数,对每个点位批量计算:

  1. 加载包并定义计算函数
library(spatialrisk)

# 定义函数:输入圆心经纬度、半径,返回该圆内的统计量
calc_circle_stats <- function(lon_center, lat_center, radius_km) {
  # 获取半径内的所有观测(包含圆心自身)
  in_circle <- points_in_circle(df, lon_center, lat_center, radius = radius_km, lon = lon)
  # 计算数量和均值
  count <- nrow(in_circle)
  avg_metric <- mean(in_circle$metric, na.rm = TRUE)
  return(data.frame(count, avg_metric))
}
  1. 批量计算并合并结果
# 对所有点位应用函数
result_list <- mapply(calc_circle_stats, df$lon, df$lat, MoreArgs = list(radius_km = 15), SIMPLIFY = FALSE)
# 将统计结果合并到原数据集
df_result <- cbind(df, do.call(rbind, result_list))

方案二:用sf包实现(更灵活的空间处理)

sf是空间数据分析的主流工具,适合处理复杂空间操作,步骤如下:

  1. 加载包并转换空间数据格式
library(sf)

# 将普通数据框转为sf空间对象,坐标系设为WGS84(EPSG:4326)
sf_df <- st_as_sf(df, coords = c("lon", "lat"), crs = 4326)
# 转换为等距坐标系(这里选美国中部适用的UTM投影EPSG:32615,距离单位为米)
sf_df_utm <- st_transform(sf_df, crs = 32615)
  1. 计算距离矩阵并统计结果
radius_km <- 15
# 计算所有点之间的距离矩阵(单位:米)
dist_matrix <- st_distance(sf_df_utm)
# 转换为公里并筛选半径内的点
dist_km <- dist_matrix / 1000

# 计算每个点位的count和avg_metric
df$count <- apply(dist_km, 1, function(x) sum(x <= radius_km))
df$avg_metric <- apply(dist_km, 1, function(x) mean(df$metric[x <= radius_km], na.rm = TRUE))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:55:16