将“map”对象转换为“SpatialPolygon”对象

15

我猜我遇到的问题应该有一个简单的解决方案,但是我还遇到了一些困难。

我正在尝试转换以下的 map 对象:

require(maps)
usa <- map("state")

使用 map2SpatialPolygons 函数将其转换为 SpatialPolygon 对象:

require(maptools)
usa.sp <- map2SpatialPolygons(usa, IDs=usa$names,proj4string=CRS("+proj=longlat"))

我一直收到以下错误:

Error in map2SpatialPolygons(usa, IDs = usa$names, proj4string = CRS("+proj=longlat")) : 
  map and IDs differ in length
经过一些研究,看起来ID长度为63,应用函数.NAmat2xyList(cbind(map$x,map$y))map对象的长度为169(我找不到源代码)。有什么想法吗?这是usa地图对象的结构:
> str(usa)
List of 4
 $ x    : num [1:1705] -88.4 -88.1 -88 -87.9 -87.8 ...
 $ y    : num [1:1705] 30.4 30.4 30.8 30.6 30.3 ...
 $ range: num [1:4] -124.7 -67 25.1 49.4
 $ names: chr [1:63] "alabama" "arizona" "arkansas" "california" ...
 - attr(*, "class")= chr "map"
2个回答

16

刚在《应用R进行空间数据分析》一书中找到了一些代码,它运行得非常好!

require(maps)
usa <- map("state", fill = TRUE)

require(sp)
require(maptools)
IDs <- sapply(strsplit(usa$names, ":"), function(x) x[1])
usa <- map2SpatialPolygons(usa, IDs=IDs, proj4string=CRS("+proj=longlat +datum=WGS84"))

当使用地图指定世界数据库并通过区域名称访问国家时,我认为可以以更一般的方式访问区域:germany <- map("world",regions="Germany",fill=TRUE)据我所知,只有一组有限的数据库是按照您所说的方式定义的,例如德国并没有。尽管如此,您的答案仍然拯救了我的一天! - Exocom

7

多边形具有表面(面积),因此关键参数是 fill=TRUE

usa <- map('state', fill = TRUE)

将参数值更改为TRUE可以停止错误消息。

+1 很好的观点。如果“map”参考指定了“fill”参数具有这种下游效应,那将会很有帮助。目前(版本2.3-11)它的写法让人感觉它只影响地图在屏幕上的绘制方式。 - Arthur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接