如何在R中通过OpenStreetMap获取城市坐标并绘制带计数点的地图
解决方案:基于OpenStreetMap和ggplot绘制城市频次地图
核心问题解决思路
针对你提出的两个核心问题,给出具体实现方案:
1. 自动获取城市经纬度
使用tidygeocoder包调用OpenStreetMap的Nominatim地理编码服务,无需手动输入坐标。该包支持批量解析城市名称,并可通过限定国家参数避免重名城市的混淆。
2. 根据城市出现次数设置点大小
先对原始城市向量做频次统计,将统计结果作为点大小的映射变量,直接在ggplot的geom_point()中绑定即可。
完整可运行代码
# 加载所需包 library(OpenStreetMap) library(ggplot2) library(dplyr) library(tidygeocoder) # 原始城市向量 cities <- c("Munich", "Hamburg", "Gelsenkirchen", "Berlin", "Berlin", "Berlin", "Hamburg") # 步骤1:统计城市出现频次 city_data <- tibble(city_name = cities) %>% count(city_name, name = "occurrence_count") # 步骤2:调用OpenStreetMap服务获取经纬度(限定德国区域) city_data <- city_data %>% geocode(address = city_name, method = "osm", country = "Germany") # 步骤3:计算地图边界(添加0.5的边距,适配德国城市跨度) lat_range <- c(min(city_data$lat) - 0.5, max(city_data$lat) + 0.5) lon_range <- c(min(city_data$long) - 0.5, max(city_data$long) + 0.5) # 获取OpenStreetMap地图(使用stamen-watercolor风格) mymap <- openmap( upperLeft = c(lat_range[1], lon_range[1]), lowerRight = c(lat_range[2], lon_range[2]), type = "stamen-watercolor", mergeTiles = TRUE ) # 转换地图坐标系适配ggplot mymap_proj <- openproj(mymap) # 步骤4:绘制地图+城市点 autoplot.OpenStreetMap(mymap_proj) + geom_point( data = city_data, aes(x = long, y = lat, size = occurrence_count), color = "red", alpha = 0.8 ) + # 自定义点大小范围,避免过大或过小 scale_size_continuous(range = c(3, 10)) + labs(title = "德国城市出现频次地图", size = "出现次数") + theme_minimal()
关键细节说明
- 地理编码时指定
country = "Germany":避免全球范围内重名城市(比如叫Berlin的城市不止德国有)导致的坐标错误。 - 地图边距设置为0.5:德国城市南北/东西跨度较大,0.015的边距会导致地图显示不全,调整为0.5能更好容纳所有城市。
alpha = 0.8:给点添加半透明效果,避免重叠时完全遮挡。
内容的提问来源于stack exchange,提问作者Produnis
相关产品推荐
相关产品推荐

