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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 22:04:55