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

基于R的GIS应用:邻近密度(proximal densities)计算方法请教

基于R计算不同半径范围内的邻近密度(以学校与操场为例)

核心前提:投影转换

你当前的数据是WGS84经纬度(EPSG:4326),这类地理坐标系的距离单位是角度,无法直接计算英里距离。必须先转换为平面投影坐标系,确保距离和面积计算的准确性。这里我们选择UTM 16N(适配阿拉巴马州区域),并将单位转换为英里。


完整实现步骤

1. 优化现有数据加载代码

直接用sf包创建空间对象,无需绕经sp包:

# 加载所需包
library(sf)

# 创建学校数据框
schools <- data.frame(
  Location = rep("Albertville, AL", 6),
  Place = c("Albertville Middle School", "Albertville High School", 
            "Albertville Intermediate School", "Albertville Elementary School", 
            "Albertville Kindergarten and PreK", "Albertville Primary School"),
  Lat = c(34.25996, 34.260509, 34.27279, 34.25182, 34.29161, 34.25321),
  Long = c(-86.2074, -86.205116, -86.220818, -86.22271, -86.19384, -86.22192)
)

# 创建操场数据框
playgrounds <- data.frame(
  Location = rep("Albertville, AL", 3),
  Place = c("Graham Park", "Sand Mountain Park", "Pecan Grove Playground"),
  Lat = c(34.26358, 34.275471, 34.27294),
  Long = c(-86.20289, -86.229111, -86.2264)
)

# 转换为sf空间对象(指定WGS84坐标系)
schools_sf <- st_as_sf(schools, coords = c("Long", "Lat"), crs = 4326)
playgrounds_sf <- st_as_sf(playgrounds, coords = c("Long", "Lat"), crs = 4326)

2. 转换为英里单位的投影坐标系

# 转换为UTM 16N并指定英里为单位
schools_mi <- st_transform(schools_sf, crs = "+proj=utm +zone=16 +datum=WGS84 +units=mi")
playgrounds_mi <- st_transform(playgrounds_sf, crs = "+proj=utm +zone=16 +datum=WGS84 +units=mi")

3. 定义目标半径范围

# 设定需要计算的半径(单位:英里)
radii <- c(0.25, 0.5, 0.75, 1)

4. 计算每个学校的操场邻近密度

邻近密度定义为:半径范围内的操场数量 / 对应圆的面积(单位:个/平方英里)

# 初始化结果数据框(保留学校名称,去除几何信息)
density_results <- schools_sf %>% 
  select(Place) %>% 
  st_drop_geometry()

# 循环计算各半径下的密度
for (r in radii) {
  # 为每个学校创建对应半径的缓冲区
  school_buffers <- st_buffer(schools_mi, dist = r)
  
  # 统计每个缓冲区内的操场数量
  playground_counts <- st_intersects(school_buffers, playgrounds_mi, sparse = FALSE) %>% 
    rowSums()
  
  # 计算缓冲区面积(平方英里)
  buffer_area <- pi * r^2
  
  # 计算密度并加入结果框
  density_results[[paste0("density_", r, "mi")]] <- playground_counts / buffer_area
}

# 查看最终结果
print(density_results)

5. 可选:反向计算操场的学校邻近密度

如果需要计算每个操场周边不同半径内的学校密度,逻辑完全一致:

# 初始化操场密度结果数据框
school_density_for_playgrounds <- playgrounds_sf %>% 
  select(Place) %>% 
  st_drop_geometry()

for (r in radii) {
  playground_buffers <- st_buffer(playgrounds_mi, dist = r)
  school_counts <- st_intersects(playground_buffers, schools_mi, sparse = FALSE) %>% 
    rowSums()
  buffer_area <- pi * r^2
  density <- school_counts / buffer_area
  school_density_for_playgrounds[[paste0("density_", r, "mi")]] <- density
}

print(school_density_for_playgrounds)

邻近密度概念说明

邻近密度(proximal densities):衡量指定空间范围内目标要素的局部聚集程度,核心是单位面积内的要素数量,是空间分析中衡量资源可达性、聚集度的常用指标。

注意事项

  • 投影必须使用平面坐标系,地理坐标系(经纬度)的距离计算会严重失真。
  • 确保所有空间操作的单位统一(这里全程使用英里)。
  • 小范围区域优先选择UTM或区域专属投影坐标系,保证计算精度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:13:12