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

R语言如何用ggplot和sf在全球地图绘制两城市间大圆短弧

R绘制全球城市间民航风格大圆短弧方案

CRS参数选择说明

不需要记忆大量专业投影编码,全球尺度可视化直接使用通用WGS84坐标系即可,对应EPSG编码为4326,是GPS、主流在线地图服务默认采用的经纬度坐标系,完全满足全球航线展示需求。如果偏好谷歌地图默认的Web墨卡托投影视觉效果,把CRS替换为3857即可,航线几何会自动适配投影,不需要重新计算。

实现逻辑

两点间的民航航线短弧本质是地球球面上的大圆最短路径,不需要手动编写三角函数计算弧段坐标,sf包内置的几何处理函数可以直接生成符合要求的平滑弧段,和谷歌地图展示的航线效果一致。
注意原有代码中调用的ne_countries函数来自rnaturalearth包,需要额外加载该包否则会运行报错。

完整可运行代码

# 加载依赖包
library(ggplot2)
library(sf)
library(rnaturalearth)

# 加载全球国界底图
world <- ne_countries(scale = "medium", returnclass = "sf")

# 1. 定义两个城市的经纬度:格式为 经度,纬度
# 示例为北京到纽约
city_coords <- matrix(
  c(116.4074, 39.9042,   # 北京经纬度
    -74.0060, 40.7128),  # 纽约经纬度
  ncol = 2, byrow = TRUE
)

# 2. 转换为sf矢量对象,指定坐标系为WGS84(EPSG:4326)
city_points <- st_multipoint(city_coords) %>% 
  st_sfc(crs = 4326) %>% 
  st_cast("POINT")

# 3. 生成两点间大圆短弧:设置段密度保证弧线平滑
gcir_line <- st_combine(city_points) %>%
  st_cast("LINESTRING") %>%
  # 沿大圆每10公里生成一个节点,保证弧线平滑无折角
  st_segmentize(dfMaxLength = units::set_units(10, km))

# 4. 绘图
ggplot() +
  geom_sf(data = world, fill = "gray90", color = "gray50") +
  # 绘制红色航线
  geom_sf(data = gcir_line, color = "red", linewidth = 1.2) +
  # 绘制城市点位
  geom_sf(data = city_points, size = 2, color = "darkred") +
  # 设置坐标系,替换为3857即可切换为Web墨卡托投影
  coord_sf(crs = 4326) +
  theme_minimal()

自定义调整说明

  • 更换城市只需修改city_coords矩阵中的经纬度数值即可,注意保持经度在前、纬度在后的顺序,西经、南纬用负值表示
  • 跨180度经线的航线(比如北京到洛杉矶)sf会自动处理路径方向,不会出现绕地图一整圈的错误连线
  • 调整航线颜色、粗细直接修改对应geom_sf层的color和linewidth参数即可
  • 如果需要批量绘制多条航线,循环处理每一组城市对的坐标生成线对象,再用rbind合并为一个sf图层即可一次性绘制

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 12:01:12