如何在谷歌地图叠加的邮编分区图上添加县轮廓线?
解决叠加谷歌地图时添加县轮廓线的错位问题
当你在叠加谷歌地图的邮编密度图上添加县轮廓线时出现异常,核心原因是投影不匹配:
zip_choropleth开启reference_map = TRUE后,谷歌地图采用Web Mercator(EPSG:3857)投影map_data("county")返回的是WGS84(EPSG:4326)经纬度坐标,直接叠加会导致位置错位
下面提供两种可行的解决方法:
方法1:转换县轮廓数据的投影(推荐)
使用sf包将WGS84坐标转换为Web Mercator投影,确保和谷歌地图投影一致:
# 先安装sf包(如果未安装) # install.packages("sf") library(sf) # 重新获取并转换县轮廓数据 ohiocounty_map <- map_data("county") %>% subset(region == "ohio" & subregion == "butler") %>% # 转换为sf对象,指定原投影为WGS84 st_as_sf(coords = c("long", "lat"), crs = 4326) %>% # 转换为Web Mercator投影(和谷歌地图一致) st_transform(crs = 3857) %>% # 转回data.frame格式供ggplot使用 st_coordinates() %>% as.data.frame() %>% rename(long = X, lat = Y) %>% # 重新添加group列(保持多边形完整性) mutate(group = rep(1, nrow(.))) # 现在可以正常叠加到谷歌地图上 google_map + geom_polygon(data=ohiocounty_map, aes(x=long, y=lat, group=group), alpha=0, color="black", size=0.2)
方法2:使用choroplethr内置的县边界数据
直接调用choroplethr的县边界数据,它会自动匹配投影:
# 获取Butler县的边界数据(FIP码39017) county_data <- get_county_map() %>% filter(region == "39017") # 叠加到谷歌地图上 google_map + geom_polygon(data=county_data, aes(x=long, y=lat, group=group), alpha=0, color="black", size=0.2)
完整整合代码片段
将上述方法替换原有轮廓线代码即可:
# ...(保留原有所有代码,直到google_map生成部分) # 方法1完整实现 library(sf) ohiocounty_map <- map_data("county") %>% subset(region == "ohio" & subregion == "butler") %>% st_as_sf(coords = c("long", "lat"), crs = 4326) %>% st_transform(crs = 3857) %>% st_coordinates() %>% as.data.frame() %>% rename(long = X, lat = Y) %>% mutate(group = rep(1, nrow(.))) # 正常叠加轮廓线 google_map + geom_polygon(data=ohiocounty_map, aes(x=long, y=lat, group=group), alpha=0, color="black", size=0.2)
内容的提问来源于stack exchange,提问作者mkelley
相关产品推荐
相关产品推荐

