【问题标题】:Go from map_data to SpatialPolygonsDataFrame从 map_data 转到 SpatialPolygonsDataFrame
【发布时间】:2017-05-23 01:10:56
【问题描述】:

我想使用 ggplot2 中 get_map 的输出创建一个SpatialPolygonsDataFrame。经过反复试验,我找到了一种方法,但对我来说似乎很复杂。有没有更清洁的方法?

library(ggplot2)
library(sp)
library(plyr)
pnw.df <- map_data("state",region=c("washington","oregon","idaho"))
# delete islands from subregions
pnw.df$subregion[is.na(pnw.df$subregion)] <- "main" 
pnw.df <- subset(pnw.df,subregion == "main") 

getPolygons <- function(x) {
  Polygons(list(Polygon(x[,c("long","lat")])),ID=unique(x$region))
}

pnw.sp <- SpatialPolygons(dlply(pnw.df, .(region), getPolygons))
pnw.sp <- as(pnw.sp,"SpatialPolygonsDataFrame")
proj4string(pnw.sp) <- "+proj=longlat +ellps=WGS84"
plot(pnw.sp)

【问题讨论】:

  • ggplot2::map_data("state") 在后台调用maps::map("state", ...)。请查看 Josh O'Brien 的回答 here,以非常方便地将其输出转换为“SpatialPolygons”。

标签: r ggplot2 sp


【解决方案1】:

查看maptools::map2SpatialPolygons,并尝试其示例。 map_datamaps 读取数据并将它们放入data.frame,这不是很有帮助。 maptools 函数从maps 获取相同的数据,并将它们转换为SpatialPolygons 对象。

【讨论】:

  • 不幸的是map2SpatialPolygons 是错误的@EdzerPebesma。 World2 &lt;- map(database = "mapdata::world2Hires"); World2sp &lt;- map2SpatialPolygons(World2, IDs = sub(":.*", "", World2$names), proj4string=CRS("+proj=longlat +datum=WGS84")) 给出错误:map and IDs differ in length。实际上,此代码返回的列表中只有 2284 个 ID 而不是 3905 个元素:xyList &lt;- .NAmat2xyList(cbind(map$x, map$y))
  • 我让你看例子:你需要添加参数fill=TRUEplot=FALSE
  • 谢谢@EdzerPebesma!我正在查看示例,但不知何故我完全错过了fill=TRUE。这一切都不同了!
猜你喜欢
  • 2017-12-10
  • 2020-01-05
  • 2020-12-12
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 2012-04-30
相关资源
最近更新 更多