如何修正ggmap上阿拉斯加sf对象与地形底图的叠加错位问题?
阿拉斯加地图叠加错位的解决方法
问题描述
我尝试将关联机构数据的sf地理对象叠加在谷歌地形地图上,该操作在美国其他州可成功实现,但阿拉斯加的边界数据出现明显错位。
错位效果如下:
当前使用的代码如下:
# 获取谷歌地形底图 AK.base <- get_map(location = c(lon=-152,lat=63.5), zoom = 4, scale = "auto", maptype = c("terrain"), messaging = FALSE, urlonly = FALSE, filename = "ggmapTemp", crop = FALSE, color = c("color"), source = c("google")) # 读取阿拉斯加边界数据 ak_region_download <- here("DataRaw/Alaska_Borough_and_Census_Area_Boundaries.shp") |> sf::st_read() ak_region_download$n <- 1:30 # 绘图 ak1<-ggmap(AK.base)+ geom_sf(data=ak_region_download,mapping=aes(geometry=geometry,fill=n,color=''),inherit.aes = F,alpha=.5)+ scale_fill_continuous(na.value=NA,low = "darkblue", high = "orange", name = 'number', breaks=c(1,5,10,20,30,40))+ scale_color_discrete('')+ theme_bw() ak1
核心原因
错位的本质是坐标系不匹配:谷歌地图默认使用Web墨卡托投影(EPSG:3857),而阿拉斯加官方提供的边界数据通常采用阿拉斯加阿尔伯斯等积投影(EPSG:3338)或WGS84地理坐标系(EPSG:4326),两种坐标系的空间定位规则不同,直接叠加就会出现偏移。
调整方案
1. 统一sf数据的坐标系
将阿拉斯加边界数据转换为与谷歌地图一致的Web墨卡托坐标系(EPSG:3857),修改读取数据的代码:
ak_region_download <- here("DataRaw/Alaska_Borough_and_Census_Area_Boundaries.shp") |> sf::st_read() |> sf::st_transform(crs = 3857) # 转换为Web墨卡托坐标系 ak_region_download$n <- 1:30
2. 使用ggmap的sf兼容接口(推荐)
旧版ggmap()对sf对象的支持存在兼容性问题,改用ggmap_sf()接口可以更好地处理坐标系匹配,修改底图获取和绘图代码:
# 获取底图并转为sf兼容格式 AK.base <- ggmap::get_map(location = c(lon=-152,lat=63.5), zoom = 4, maptype = "terrain", source = "google") |> ggmap::ggmap_sf() # 绘图 ak1 <- AK.base + geom_sf(data = ak_region_download, aes(fill = n, color = ''), inherit.aes = FALSE, alpha = 0.5) + scale_fill_continuous(na.value = NA, low = "darkblue", high = "orange", name = '数量', breaks = c(1,5,10,20,30,40)) + scale_color_discrete('') + theme_bw() ak1
3. 验证坐标系正确性
如果调整后仍有问题,可以先查看原始数据的坐标系,确认转换逻辑:
# 查看原始数据的坐标系 sf::st_crs(ak_region_download)
若输出为EPSG:3338或EPSG:4326,转换为EPSG:3857是正确的;若为其他坐标系,需对应调整st_transform的crs参数。
内容的提问来源于stack exchange,提问作者M3Lba
相关产品推荐
相关产品推荐

