如何计算地图指定半径范围内指标的平均值
空间数据分析:计算每个点位半径范围内的观测数与指标均值
需求说明
以数据集中每个点位为圆心,统计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函数仅支持单个圆心,我们可以封装成函数,对每个点位批量计算:
- 加载包并定义计算函数
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)) }
- 批量计算并合并结果
# 对所有点位应用函数 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是空间数据分析的主流工具,适合处理复杂空间操作,步骤如下:
- 加载包并转换空间数据格式
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)
- 计算距离矩阵并统计结果
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
相关产品推荐
相关产品推荐

