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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:50:32