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

如何用R语言tmap包绘制圣地亚哥县地址的10英里半径范围地图

解决方法:用tmap绘制指定英里半径的地址范围

问题背景

手里有一份圣地亚哥县的地址列表,需要用R语言在地图上标注这些地址,同时为每个地址添加精准10英里的半径范围。之前用tmap和tmaptools能轻松画出地址点,但用tm_dots的size参数只能画固定视觉尺寸的圆点,无法保证是精准的10英里地理半径。

核心思路

tmap的tm_dots是按视觉比例缩放,不对应真实地理距离。要实现精准半径,必须用**地理缓冲区(buffer)**实现:

  • 先将经纬度数据转换为适合计算距离的投影坐标系(UTM)
  • 基于该坐标系创建对应10英里的缓冲区
  • 转换回经纬度坐标系适配tmap的交互视图模式

修改后的完整代码

# 安装并加载所需包
install.packages(c("tmap", "tmaptools", "readr", "sf"))
library(tmap)
library(tmaptools)
library(readr)
library(sf) # 用于地理空间操作

# 导入地址数据
network_locations <- read_csv("clean_network_locations.csv")

# 地理编码(保持原逻辑)
coords3 <- geocode_OSM(q = network_locations$fullAddress, projection = 4326, as.sf = TRUE)

# 步骤1:转换为UTM投影(圣地亚哥属于UTM 11N,EPSG:32611,单位为米)
coords_utm <- st_transform(coords3, crs = 32611)

# 步骤2:创建10英里半径的缓冲区(1英里≈1609.34米)
buffer_10mi <- st_buffer(coords_utm, dist = 10 * 1609.34)

# 步骤3:转换回WGS84经纬度,适配tmap的view模式
buffer_wgs84 <- st_transform(buffer_10mi, crs = 4326)

# 绘制地图:先画缓冲区(底层),再画地址点(顶层)
tmap_mode("view")
tm_shape(buffer_wgs84) +
  tm_fill(col = "lightblue", alpha = 0.3, legend.show = FALSE) +
  tm_borders(col = "blue", lwd = 1) +
tm_shape(coords3) +
  tm_dots(col = "red", size = 0.1, alpha = 0.8, legend.show = FALSE)

关键步骤解释

  • 投影转换:WGS84(EPSG:4326)是经纬度坐标系,不适合距离计算;转换为UTM 11N(EPSG:32611)后,单位为米,能精准定义缓冲区范围。
  • 缓冲区创建:st_buffer的dist参数直接使用米为单位,通过10 * 1609.34将英里转换为米,确保半径精准对应10英里。
  • 图层顺序:先绘制缓冲区作为底层,再叠加地址点,避免点被缓冲区遮挡。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 12:22:56