如何使用sf包生成基于质心的距离地图?
实现区域到质心的距离渐变地图
核心思路
通过生成覆盖目标区域的栅格点集,计算每个点到质心的直线距离,再用颜色映射距离值,叠加区域边界和质心点,即可得到目标样式的距离地图。
完整代码
library(sf) library(tidyverse) # 读取并合并北卡罗来纳州 shp 数据 nc <- st_read(system.file("shape/nc.shp", package="sf")) %>% st_union() # 计算区域质心 centroid <- st_centroid(nc) # 生成覆盖区域的栅格点(cell_size越小,地图精度越高) grid <- st_make_grid(nc, cell_size = 0.05, what = "centers") %>% st_sf() %>% st_filter(nc) # 只保留区域内的点 # 转换投影计算准确距离(转UTM米单位投影,计算后转回原投影) grid <- grid %>% st_transform(32617) %>% mutate(distance = as.numeric(st_distance(geometry, st_transform(centroid, 32617))) / 1000) %>% st_transform(st_crs(nc)) # 绘制距离地图 ggplot() + geom_sf(data = grid, aes(fill = distance, color = distance), size = 1.2) + geom_sf(data = nc, fill = NA, color = "black", linewidth = 1) + geom_sf(data = centroid, color = "red", size = 3, shape = 18) + scale_fill_viridis_c(option = "plasma", name = "距离(km)") + scale_color_viridis_c(option = "plasma", name = "距离(km)") + theme_minimal() + labs(title = "区域到质心的距离分布", subtitle = "北卡罗来纳州")
关键细节说明
- 栅格精度控制:
st_make_grid的cell_size参数决定栅格点密度,值越小地图越精细,但计算耗时也会增加。 - 投影转换:原数据是经纬度(度),直接计算距离会有误差,转成UTM米单位投影后,计算的直线距离更准确,最后转回原投影保证地图显示正确。
- 颜色渐变:用
viridis的plasma配色方案实现类似目标图的冷暖渐变效果,也可替换为scale_fill_gradient(low = "blue", high = "red")自定义渐变。
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

