27個のラスターを含むラスタースタックがあります。空間ポリゴンデータフレームに27個の対応するポリゴンがあります。ポリゴン[i]をラスター[i]にオーバーレイし、ラスター[i]から値を抽出して合計し、ポリゴン[i]内のセル数のカウントを取得して、合計値を#で除算します。細胞の。言い換えると、ラスターは使用率分布またはカーネル使用密度です。ポリゴンがラスターと重なっている領域で多くの使用が発生していることを知りたいです。ポリゴンのサイズを考慮して、ポリゴン内のセルの数で除算したいと思います。
これを行うスクリプトがありますが、これは、データフレーム内の任意の数の空間ポリゴンによってのみ1つのラスターからデータを抽出することを目的として作成されたものです。それは動作し、醜いです、そして私は今それをもっと流線型のものに変換したいと思います。時間がかかるかもしれないので、助けてくれる誰かが私の周りにいたらいいのにと思いますか?
これは私が与えられたコードであり、私が起こっていると思うことの要約です:
msum99Kern07 = SpatialPolygonDataFrame (many polygons)
KERNWolfPIX07m = Raster (this is a single raster, I have 27 rasters I put into a stack
)。
#Extracting value from raster to many polygons
sRISK_Moose07m<- extract(KERNWolfPIX07m, msum99Kern07,df=FALSE,method='bilinear')
#Calculate THE SUM FOR EACH polygon#
sRISK_Moose07m<-unlist(lapply(sRISK_Moose07m, function(x) if (!is.null(x)) sum(x, na.rm=TRUE) else NA ))
sRISK_Moose07m<-as.data.frame(sRISK_Moose07m)
#Im not sure why these next commands are needed Im only guessing
#data.frame(levels) as there are many polygons creating a dataframe to put the info into
ID_SUM_07<-as.data.frame(levels(as.factor(msum07locs$ID2)))
#ADD ID TO THE risk data frame
sRISK_Moose07m$ID<-ID_SUM_07[,1]
#NUMBER OF CELLS WITHIN POLYGON EXTRACT CELLS/ POLYGON
NB_SUM2007m<-cellFromPolygon(KERNWolfPIX07m, msum99Kern07)
NB_SUM07m<-unlist(lapply(NB_SUM2007m, function(x) if (!is.null(x)) length(x) else NA ))
#####CONVERT TO DATA FRAME
NB_SUM07m<-as.data.frame(NB_SUM07m)
###ADD THE NB OF CELLS TO THE RISK_SUM FILE###
sRISK_Moose07m$NB_CELLS<-NB_SUM07m[,1]
###DIVIDING VALUE by NB CELLS##
sRISK_Moose07m$DIVID<-sRISK_Moose07m$sRISK_Moose07m/sRISK_Moose07m$NB_CELLS
これで、27個のポリゴンを含む空間ポリゴンデータフレームと、27個のラスターを含むラスタースタックができました。ラスター[i]とポリゴン[i]を選択し、重なり合う領域のカーネル密度を抽出、合計、計算したいと思います。ポリゴンとラスターが重なっていない可能性があるため、エラーが発生する可能性があります...Rでこれを確認する方法がまったくわかりません。
私が始めた私のスクリプト:
moose99kern = spatial polygon data frame 27 moose
Rastwtrial = stack of 27 rasters having the same unique name as the ID in moose99kern
mkernID=unique(moose99kern$id)
for (i in length(mkernID)){
r = Rastwtrial[Rastwtrial[[i]]== mkernID[i]] #pick frm Rasterstack the raster that has the same name
mp = moose99kern[moose99kern$id == mkernID[i]] #pick from spatialpolygondataframe the polygon that has the same name
RISK_MooseTrial<- extract(r, mp, df=T, method'bilinear')
risksum = (RISK_MooseTrial, function(x) if (!is.null(x)) sum(x, na.rm=TRUE) else NA )#sum all the values that were extracted from the raster
ラスタースタックにインデックスを付ける方法がわからないため、スクリプトが機能し始めません。しかし、それでも、一度に1つのラスター/ 1ポリゴンを通過すると、コードで次に何をすべきかわかりません。これがStackOverflowにとって多すぎる場合は、お詫び申し上げます。私は真剣に立ち往生していて、どこを向くべきかわからない。
これは、ポリゴンの2人のテストデータです。
dput(mtestpoly)
new("SpatialPolygonsDataFrame"
, data = structure(list(id = structure(1:2, .Label = c("F01001_1", "F07002_1"
), class = "factor"), area = c(1259.93082578125, 966.364499511719
)), .Names = c("id", "area"), row.names = c("F01001_1", "F07002_1"
), class = "data.frame")
, polygons = list(<S4 object of class structure("Polygons", package = "sp")>,
<S4 object of class structure("Polygons", package = "sp")>)
, plotOrder = 1:2
, bbox = structure(c(6619693.77161797, 1480549.31292137, 6625570.48348294,
1485861.5586371), .Dim = c(2L, 2L), .Dimnames = list(c("x", "y"
), c("min", "max")))
, proj4string = new("CRS"
, projargs = NA_character_
dput(Rastwtest)
new("RasterStack"
, filename = ""
, layers = list(<S4 object of class structure("RasterLayer", package = "raster")>,
<S4 object of class structure("RasterLayer", package = "raster")>)
, title = character(0)
, extent = new("Extent"
, xmin = 1452505.6959799
, xmax = 1515444.7110552
, ymin = 6575235.1959799
, ymax = 6646756.8040201
)
, rotated = FALSE
, rotation = new(".Rotation"
, geotrans = numeric(0)
, transfun = function ()
NULL
)
, ncols = 176L
, nrows = 200L
, crs = new("CRS"
, projargs = NA_character_
)
, z = list()
, layernames = "Do not use the layernames slot (it is obsolete and will be removed)\nUse function 'names'"
)