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

在ggplot2中叠加ggmap与geom_polygon(Shapefile)时出现异常线条问题

嘿,我帮你搞定这个问题!你遇到的那些无意义线条,大概率是坐标系统不匹配或者多边形分组错误导致的,结合IBGE这份市政Shapefile的特性,给你一套靠谱的解决方案:

步骤1:正确读取Shapefile并统一坐标系统

首先你之前的读取方式有点小问题——Shapefile是由多个关联文件组成的,直接用unz读单个shp文件会丢失关键信息,推荐用sf包来完整读取,它是现在R里处理空间数据的主流工具:

# 先安装并加载所需工具包
install.packages(c("sf", "ggmap", "ggplot2"))
library(sf)
library(ggmap)
library(ggplot2)

# 下载并解压Shapefile到临时目录
temp <- tempfile()
download.file("ftp://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2015/Brasil/BR/br_municipios.zip", temp)
unzip(temp, exdir = tempdir())

# 完整读取Shapefile(sf会自动识别所有关联的dbf、shx等文件)
br_municipios <- st_read(file.path(tempdir(), "BRMUE250GC_SIR.shp"))

接下来是核心问题:IBGE的这份Shapefile用的是SIRGAS 2000地理坐标系(EPSG:4674),而ggmap获取的谷歌地图默认用的是WGS84(EPSG:4326),两者坐标系统不匹配就会出现错位、乱线的情况,所以我们要把Shapefile转换成和ggmap一致的坐标:

# 将Shapefile转换为WGS84坐标系(和ggmap匹配)
br_municipios_wgs84 <- st_transform(br_municipios, crs = 4326)
步骤2:用正确的方式叠加到ggmap上

这里强烈建议你放弃geom_polygon,改用sf包的geom_sf——它专门为空间数据设计,能自动处理多边形分组和坐标匹配,完美避免无意义线条:

# 获取巴西区域的谷歌地图(可以调整zoom参数,zoom=4适合全国范围)
br_map <- get_googlemap(center = c(lon = -50, lat = -15), zoom = 4, maptype = "terrain")

# 叠加Shapefile到地图上
ggmap(br_map) +
  geom_sf(data = br_municipios_wgs84, inherit.aes = FALSE, fill = NA, color = "red", size = 0.3) +
  theme_void()
如果你非要用geom_polygon怎么办?

如果因为某些原因必须用geom_polygon,那你需要手动把空间数据转换成普通数据框,并且严格按每个市政区域分组:

# 将sf对象转换为带坐标的普通数据框,L1列是每个多边形的分组标识
br_municipios_df <- as.data.frame(st_coordinates(br_municipios_wgs84))

# 用geom_polygon绘制,必须指定group=L1
ggmap(br_map) +
  geom_polygon(data = br_municipios_df, aes(x = X, y = Y, group = L1), fill = NA, color = "red", size = 0.3) +
  theme_void()

不过这种方式风险较高,如果Shapefile里有多重多边形(比如带飞地的区域),L1分组可能不够,还是优先用geom_sf更稳妥。

额外排查:修复Shapefile拓扑错误

如果按上面的步骤做了还是有乱线,那可能是Shapefile本身存在拓扑问题(比如自相交的多边形),可以用sf包快速修复:

# 修复拓扑错误
br_municipios_fixed <- st_make_valid(br_municipios_wgs84)

# 再用修复后的数据叠加
ggmap(br_map) +
  geom_sf(data = br_municipios_fixed, inherit.aes = FALSE, fill = NA, color = "red", size = 0.3) +
  theme_void()

内容的提问来源于stack exchange,提问作者João Machado

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:10:22