9

我使用 R 包栅格从www.GADM.org导入了世界地图数据集。我想将它剪辑到我创建的多边形以减小地图的大小。我可以检索数据并且可以毫无问题地创建多边形,但是当我使用“gIntersection”命令时,我收到一条模糊的错误消息。

关于如何剪辑我的世界地图数据集的任何建议?

library(raster)
library(rgeos)

## Download Map of the World ##
WorldMap <- getData('countries')

## Create the clipping polygon
clip.extent <- as(extent(-20, 40, 30, 72), "SpatialPolygons")
proj4string(clip.extent) <- CRS(proj4string(WorldMap))

## Clip the map
EuropeMap <- gIntersection(WorldMap, clip.extent, byid = TRUE)

错误信息:

RGEOSBinTopoFunc(spgeom1, spgeom2, byid, id, "rgeos_intersection") 出错:几何集合可能不包含其他几何集合此外:警告消息:在 RGEOSBinTopoFunc(spgeom1, spgeom2, byid, id, "rgeos_intersection") 中:spgeom1 和 spgeom2有不同的 proj4 字符串

4

2 回答 2

9

您不需要使用 PBS(我已经学会了这一点,因为@flowla 发布的r-sig-geo链接是我最初发布的问题!)。这段代码展示了如何在 rgeos 中完成这一切,这要归功于Roger Bivand 的各种不同帖子。这将是更规范的子集化方式,无需强制转换为 PolySet 对象。

错误消息的原因是您不能对 SpatialPolygons 集合进行 gIntersection,您需要单独执行它们。找出你想要使用的那些gIntersects。然后我使用gIntersection. 我在将 SpatialPolygons 对象列表传递回 SpatialPolygons 时遇到问题,这会将裁剪后的 shapefile 转换为 SpatialPolygons,这是因为并非所有裁剪后的对象都是class SpatialPolygons. 一旦我们排除了这些,一切正常。

# This very quick method keeps whole countries
gI <- gIntersects(WorldMap, clip.extent, byid = TRUE )
Europe <- WorldMap[which(gI), ]
plot(Europe)


#If you want to crop the country boundaries, it's slightly more involved:
# This crops countries to your bounding box
gI <- gIntersects(WorldMap, clip.extent, byid = TRUE)
out <- lapply(which(gI), function(x){ 
        gIntersection(WorldMap[x,], clip.extent)
   })

# But let's look at what is returned
table(sapply(out, class))
#   SpatialCollections    SpatialPolygons 
#                    2                 63 


# We want to keep only objects of class SpatialPolygons                 
keep <- sapply(out, class)
out <- out[keep == "SpatialPolygons"]


# Coerce list back to SpatialPolygons object
Europe <- SpatialPolygons(lapply(1:length(out), function(i) {
          Pol <- slot(out[[i]], "polygons")[[1]]
          slot(Pol, "ID") <- as.character(i)
          Pol
   }))

plot(Europe)

在此处输入图像描述

如果可以,我建议您查看naturalearthdata。他们拥有高质量的 shapefile,这些文件会保持最新状态,并且会不断检查错误(因为它们是开源的,如果您发现错误,请通过电子邮件发送给他们)。国家边界位于文化按钮下方。您会看到它们也更轻量级,您可以选择适合您需要的分辨率。

于 2013-04-16T22:48:17.287 回答
2

稍微中间步骤怎么样?我主要从R-sig-Geo采用了以下代码,我认为它应该可以解决问题。您将需要“maptools”和“PBSmapping”软件包,因此请确保已安装它们。这是我的代码:

# Required packages
library(raster)
library(maptools)
library(PBSmapping)

# Download world map
WorldMap <- getData('countries')
# Convert SpatialPolygons to class 'PolySet'
WorldMap.ps <- SpatialPolygons2PolySet(WorldMap)
# Clip 'PolySet' by given extent
WorldMap.ps.clipped <- clipPolys(WorldMap.ps, xlim = c(-20, 40), ylim = c(30, 72))
# Convert clipped 'PolySet' back to SpatialPolygons
EuropeMap <- PolySet2SpatialPolygons(WorldMap.ps.clipped, close_polys=TRUE)

我刚刚对其进行了测试,它可以正常工作。不过,将 SpatialPolygons 转换为 PolySet 需要一些计算时间。

干杯,弗洛里安

于 2013-04-08T16:24:42.700 回答