裁剪SpatialPolygonsDataFrame

时间:2012-12-21 00:43:29

标签: r crop spatial

我有两个SpatialPolygonsDataFrame个文件:dat1,dat2

extent(dat1)
class       : Extent 
xmin        : -180 
xmax        : 180 
ymin        : -90 
ymax        : 90 


extent(dat2)
class       : Extent 
xmin        : -120.0014 
xmax        : -109.9997 
ymin        : 48.99944 
ymax        : 60 

我想使用dat2的范围裁剪文件dat1。我不知道怎么做。我之前只使用“裁剪”功能来处理光栅文件。

当我将此功能用于当前数据时,会发生以下错误:

> r1 <- crop(BiomassCarbon.shp,alberta.shp)
Error in function (classes, fdef, mtable)  : 

 unable to find an inherited method for function ‘crop’ for signature"SpatialPolygonsDataFrame"’

4 个答案:

答案 0 :(得分:54)

简化方法2014-10-9

raster::crop()可用于裁剪Spatial*(以及Raster*)个对象。

例如,以下是如何使用它来裁剪SpatialPolygons*对象:

## Load raster package and an example SpatialPolygonsDataFrame
library(raster) 
data("wrld_simpl", package="maptools")

## Crop to the desired extent, then plot
out <- crop(wrld_simpl, extent(130, 180, 40, 70))
plot(out, col="khaki", bg="azure2")

原创(且仍然有效)回答:

rgeos 函数gIntersection()使这非常简单。

使用mnel的漂亮示例作为跳跃点:

library(maptools)
library(raster)   ## To convert an "Extent" object to a "SpatialPolygons" object.
library(rgeos)
data(wrld_simpl)

## Create the clipping polygon
CP <- as(extent(130, 180, 40, 70), "SpatialPolygons")
proj4string(CP) <- CRS(proj4string(wrld_simpl))

## Clip the map
out <- gIntersection(wrld_simpl, CP, byid=TRUE)

## Plot the output
plot(out, col="khaki", bg="azure2")

enter image description here

答案 1 :(得分:5)

以下是使用世界地图作为示例{/ 1}}如何执行此操作的示例

这是来自R-sig-Geo mailing list的Roger Bivand。 Roger是rgeos包的作者之一。

以世界地图为例

sp

enter image description here

答案 2 :(得分:1)

您不能在sp多边形对象上使用裁剪。您需要创建一个表示dat2的bbox坐标的多边形,然后才能在rgeos库中使用gIntersects。

编辑:此评论与2012年提供的版本有关,现在已不再适用。

答案 3 :(得分:0)

参见?crop

  

corp(x,y,filename =“”,snap ='near',datatype = NULL,...)

     
    

x Raster * object

         

y Extent对象,或Extent对象可以从的任何对象     提取(见详情

  

您需要使用栅格包中的rasterize函数栅格化第一个SpatialPolygon

我创建了一些数据来展示如何使用栅格化:

n <- 1000
x <- runif(n) * 360 - 180
y <- runif(n) * 180 - 90
xy <- cbind(x, y)
vals <- 1:n
p1 <- data.frame(xy, name=vals)
p2 <- data.frame(xy, name=vals)
coordinates(p1) <- ~x+y
coordinates(p2) <- ~x+y

如果我尝试:

 crop(p1,p2)
 unable to find an inherited method for function ‘crop’ for signature ‘"SpatialPointsDataFrame"’

现在使用栅格化

r <- rasterize(p1, r, 'name', fun=min)
crop(r,p2)

class       : RasterLayer 
dimensions  : 18, 36, 648  (nrow, ncol, ncell)
resolution  : 10, 10  (x, y)
extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 
data source : in memory
names       : layer 
values      : 1, 997  (min, max)