如何用R语言sf包计算参考点与指定半径内邻点的平均距离?
实现自定义半径内邻近点平均距离计算
以下是修改后的代码,直接支持自定义半径(单位可选),并在dataframe中新增列存储每个点的邻近点平均距离:
1. 加载依赖包
library(sf) library(dplyr) library(leaflet)
2. 准备空间数据
# 北卡三个城市的经纬度数据,转换为sf空间对象 cities <- data.frame( name = c("Raleigh", "Greensboro", "Wilmington"), x = c(-78.633333, -79.819444, -77.912222), y = c(35.766667, 36.08, 34.223333) ) %>% st_as_sf(coords = c("x", "y"), crs = 4326) # 使用WGS84经纬度坐标系
3. 设置可调半径并编写计算函数
# 自定义半径(单位:英里,可直接修改这个值调整范围) radius_miles <- 100 # 定义计算单个点邻近点平均距离的函数 calc_avg_nearby_dist <- function(single_point, all_points, radius) { # 计算当前点到所有点的距离,直接指定单位为英里 all_distances <- st_distance(single_point, all_points, units = "mi") # 筛选半径内的非自身点(排除距离为0的自身) valid_distances <- all_distances[all_distances > 0 & all_distances <= radius] # 计算平均距离,无邻近点时返回NA if (length(valid_distances) > 0) { round(mean(valid_distances), 1) } else { NA } }
4. 计算并新增平均距离列
# 为每个城市计算指定半径内的邻近点平均距离,新增列到dataframe cities_with_avg_dist <- cities %>% rowwise() %>% mutate(avg_nearby_dist_miles = calc_avg_nearby_dist(geometry, cities, radius_miles)) %>% ungroup() # 查看结果 print(cities_with_avg_dist)
运行后会得到包含avg_nearby_dist_miles列的数据集,比如当半径设为100英里时,Greensboro的平均距离就是到Raleigh的距离(约80英里),Wilmington因为超出100英里范围,会返回NA。
5. 可视化验证(可选)
# 绘制带半径缓冲区和平均距离标签的地图 leaflet(cities_with_avg_dist) %>% addProviderTiles("OpenStreetMap") %>% # 添加自定义半径的缓冲区(转换为米适配leaflet的半径单位) addCircles( radius = radius_miles * 1609.34, color = "#2196F3", fillOpacity = 0.1 ) %>% addCircleMarkers( color = "#F44336", fillOpacity = 0.7, stroke = FALSE, popup = ~paste0( "<b>", name, "</b><br>", "半径内平均距离: ", avg_nearby_dist_miles, " 英里" ) )
关键说明
- 单位灵活切换:如果需要用米作为半径单位,只需修改
radius_miles为radius_m,并在st_distance中指定units = "m"即可。 - 排除自身点:通过
all_distances > 0过滤掉点到自身的0距离,避免影响平均计算。 - 空值处理:当半径内没有其他点时,函数返回
NA,避免报错。
内容的提问来源于stack exchange,提问作者user2813606
相关产品推荐
相关产品推荐

