如何用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
相关产品推荐
相关产品推荐

