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

如何在谷歌地图叠加的邮编分区图上添加县轮廓线?

解决叠加谷歌地图时添加县轮廓线的错位问题

当你在叠加谷歌地图的邮编密度图上添加县轮廓线时出现异常,核心原因是投影不匹配:

  • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:45:30