基于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
相关产品推荐
相关产品推荐

