在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
相关产品推荐
相关产品推荐

