2つの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をトリミングします。私はそれを行う方法がわかりません。以前は「crop」関数を使用してラスターファイルを処理していました。
現在のデータにこの関数を使用すると、次のエラーが発生します。
> r1 <- crop(BiomassCarbon.shp,alberta.shp)
Error in function (classes, fdef, mtable) :
unable to find an inherited method for function ‘crop’ for signature"SpatialPolygonsDataFrame"’
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 function 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")
_
例として世界地図を使用してrgeos
でこれを行う方法の例を次に示します
これは R-sig-Geoメーリングリスト のRoger Bivandによるものです。ロジャーはsp
パッケージの作者の一人です。
例として世界地図を使用する
library(maptools)
data(wrld_simpl)
# interested in the arealy bounded by the following rectangle
# rect(130, 40, 180, 70)
library(rgeos)
# create a polygon that defines the boundary
bnds <- cbind(x=c(130, 130, 180, 180, 130), y=c(40, 70, 70, 40, 40))
# convert to a spatial polygons object with the same CRS
SP <- SpatialPolygons(list(Polygons(list(Polygon(bnds)), "1")),
proj4string=CRS(proj4string(wrld_simpl)))
# find the intersection with the original SPDF
gI <- gIntersects(wrld_simpl, SP, byid=TRUE)
# create the new spatial polygons object.
out <- vector(mode="list", length=length(which(gI)))
ii <- 1
for (i in seq(along=gI)) if (gI[i]) {
out[[ii]] <- gIntersection(wrld_simpl[i,], SP)
row.names(out[[ii]]) <- row.names(wrld_simpl)[i]; ii <- ii+1
}
# use rbind.SpatialPolygons method to combine into a new object.
out1 <- do.call("rbind", out)
# look here is Eastern Russia and a bit of Japan and China.
plot(out1, col = "Khaki", bg = "Azure2")
Spポリゴンオブジェクトではクロップを使用できません。 dat2のbbox座標を表すポリゴンを作成する必要があります。その後、rgeosライブラリのgIntersectsを使用できます。
編集:このコメントは2012年に利用可能なバージョンに関連していたため、現在は当てはまりません。
を参照してください
corp(x、y、filename = ""、snap = 'near'、datatype = NULL、...)
x Raster *オブジェクト
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)