R空间分析:如何可视化st_distance计算的多站点空间距离
R语言站点间距离空间可视化实现方案
你的现有思路完全可行,不需要更换复杂方法,根据你的可视化目标选择对应方案即可:
场景1:展示单个核心站点到全量站点的距离分布
适用于需要呈现某一站点辐射范围、距离梯度的场景,实现步骤如下:
- 将
st_distance计算得到的距离值绑定回原站点sf数据框,若使用英国国家格网EPSG:27700坐标系,默认单位为米,可转换为千米提升可读性 - 直接用
ggplot2的geom_sf将距离值映射为点的颜色/大小即可完成可视化
示例代码:
library(sf) library(ggplot2) # 替换为你自己的站点sf对象、站点筛选条件 sites_sf <- st_read("你的站点数据路径", crs = 27700) target_site <- sites_sf[sites_sf$CODE == "SiteA", ] # 绑定距离列 sites_sf$dist_to_target <- as.numeric(st_distance(sites_sf, target_site)) / 1000 # 绘图 ggplot() + # 可直接复用你之前的英格兰全域底图逻辑 geom_sf(data = sites_sf, aes(color = dist_to_target), size = 0.7) + scale_color_viridis_c(name = "到目标站点距离(km)") + theme_minimal()
场景2:展示指定多对站点的连接与对应距离
适用于需要呈现少量站点间连通关系、具体距离数值的场景,实现步骤如下:
- 提取目标站点对的起点、终点坐标,生成连接线sf对象,将距离值映射为线段的颜色/粗细
- 可在线段中点添加文本标注展示具体距离值
示例代码:
# 示例:生成SiteA到SiteB的连接线 site_a <- sites_sf[sites_sf$CODE == "SiteA", ] site_b <- sites_sf[sites_sf$CODE == "SiteB", ] line_obj <- st_sfc(st_linestring(rbind(st_coordinates(site_a), st_coordinates(site_b))), crs = 27700) line_sf <- st_sf( data.frame(pair = "SiteA-SiteB", distance = as.numeric(st_distance(site_a, site_b))/1000), geometry = line_obj ) # 绘图 ggplot() + geom_sf(data = sites_sf, size = 0.5, color = "grey60") + geom_sf(data = line_sf, aes(color = distance), linewidth = 1.2) + # 调整nudge参数避免标注遮挡 geom_sf_text(data = line_sf, aes(label = paste0(round(distance,1),"km")), nudge_y = 5000) + scale_color_viridis_c(name = "站点间距离(km)") + theme_minimal()
注意事项
- 若你需要展示所有15000个站点两两之间的距离,会生成超量连线完全丧失可读性,这种场景建议先对距离做分箱处理,或用克里金/反距离权重插值生成连续的距离面再做可视化
- 你现有的X/Y格网坐标、经纬度字段完全满足需求,无需额外补充数据
内容的提问来源于stack exchange,提问作者Arron_2012
相关产品推荐
相关产品推荐

