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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:25:20