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

无法将maps包中未知类型的州地图加载为R对象的问题

解决maps包加载美国州地图为空间对象的问题

我懂你的困扰——maps::map()默认行为是直接绘图,而不是返回你需要的空间数据对象,这就是为什么你赋值后用str()反而会重绘地图的原因!下面一步步帮你搞定:

第一步:获取不绘图的map数据对象

map()函数默认plot=TRUE,会直接渲染地图。要得到背后的数据,只需要设置plot=FALSE,这样它就会返回一个包含坐标、区域名称的列表对象:

st_m <- maps::map(database = "state", plot = FALSE)
str(st_m) # 现在就能正常查看结构了,不会再绘图

这个列表里的x和y是所有区域的坐标点,names对应每个州的名称。

第二步:转换为SpatialPolygonsDataFrame

如果你需要传统的SpatialPolygonsDataFrame(sp包格式),可以用maptools包的map2SpatialPolygons()函数,记得先设置fill=TRUE来确保多边形是闭合的:

library(maptools)
# 获取带填充信息的map对象
st_m <- maps::map(database = "state", plot = FALSE, fill = TRUE)
# 转换为SpatialPolygonsDataFrame,指定投影(这里用WGS84)
state_spdf <- map2SpatialPolygons(
  st_m,
  IDs = st_m$names,
  proj4string = sp::CRS("+proj=longlat +datum=WGS84")
)
# 查看结果
str(state_spdf)

更现代的替代方案:用sf包

现在空间数据分析更推荐用sf包的sf对象(比sp包更易用),你可以直接把map数据转成sf对象,之后如果需要也能转成SpatialPolygonsDataFrame:

library(sf)
# 直接转为sf对象
state_sf <- st_as_sf(maps::map("state", plot = FALSE, fill = TRUE))
# 若需要转成SpatialPolygonsDataFrame
state_spdf <- as(state_sf, "SpatialPolygonsDataFrame")

额外建议:获取更精准的边界数据

maps包的地图数据比较老旧,如果你需要官方、最新的美国州边界,推荐用tigris包直接获取:

library(tigris)
# 获取简化版边界(更快加载),返回SpatialPolygonsDataFrame
state_spdf <- states(cb = TRUE)

内容的提问来源于stack exchange,提问作者andrewH

相关产品推荐
方舟 Agent Plan

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

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