无法将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
相关产品推荐
相关产品推荐

