Saya membutuhkan Spatial Grid sebagai master grid untuk beragam peta tematik. Bagaimana cara menghasilkan Spatial Grid dari raster yang membuang semua piksel NA?
Saya membutuhkan Spatial Grid sebagai master grid untuk beragam peta tematik. Bagaimana cara menghasilkan Spatial Grid dari raster yang membuang semua piksel NA?
Jawaban:
Anda bisa mendapatkan semua koordinat sel non-NA dalam raster dengan:
r = raster(matrix(runif(20),5,4))
r[r>.5]=NA
coordinates(r)[!is.na(values(r)),]
x y
[1,] 0.375 0.7
[2,] 0.125 0.5
[3,] 0.375 0.5
[4,] 0.625 0.5
[5,] 0.875 0.5
[6,] 0.125 0.3
[7,] 0.375 0.3
[8,] 0.625 0.3
[9,] 0.375 0.1
[10,] 0.875 0.1
mereka adalah sel-sel yang bukan NA. Anda mungkin dapat memberi ini ke SpatialPixels
SpatialPixels(SpatialPoints(coordinates(r)[!is.na(values(r)),]))
Object of class SpatialPixels
Grid topology:
cellcentre.offset cellsize cells.dim
x 0.125 0.25 4
y 0.100 0.20 4
SpatialPoints:
x y
[1,] 0.375 0.7
[2,] 0.125 0.5
[3,] 0.375 0.5
[4,] 0.625 0.5
[5,] 0.875 0.5
[6,] 0.125 0.3
[7,] 0.375 0.3
[8,] 0.625 0.3
[9,] 0.375 0.1
[10,] 0.875 0.1
Coordinate Reference System (CRS) arguments: NA
Meskipun secara pribadi apa pun di grid saya tetap sebagai raster.
Saya tidak benar-benar yakin apa yang Anda inginkan - SpatialGrid
objek didefinisikan grid persegi panjang penuh, jadi satu tanpa piksel NA tidak masuk akal.
Untuk mengubah RasterLayer menjadi objek Spasial * (Kotak atau Piksel) Anda dapat menggunakan fungsi paksaan "sebagai"
library(raster)
r <- raster(matrix(runif(20),5,4))
r[r>.5] <- NA
g <- as(r, 'SpatialGridDataFrame')
p <- as(r, 'SpatialPixels')
plot(r)
points(p)
Dua persyaratan Anda tampaknya tentang hal-hal yang berbeda:
1) Beberapa jenis templat raster grid yang andal.
2) Kisi jarang yang tidak secara eksplisit menyimpan sel yang hilang.
sp :: GridTopology menyediakan yang pertama, itu hanya deskripsi grid berdasarkan koordinat sel kiri bawah (cellcentre.offset), jarak sel (cellsize), dan dimensi grid (cells.dim).
Kelas sp :: SpatialPixelsDataFrame memungkinkan Anda untuk menyimpan grid jarang, tetapi dengan sendirinya menyimpan lebih dari "templat" - ia juga menyimpan setiap koordinat secara eksplisit. Ini karena ia melakukan dua pekerjaan, satu memungkinkan Anda untuk mempertahankan koordinat asli yang berasal dari grid dan mungkin sedikit tidak teratur, dua memungkinkan Anda menyimpan hanya sel-sel yang memiliki nilai yang valid. (Bisa dibilang * dua tujuan ini seharusnya dipisahkan, tapi itu cerita lain).
Saya tidak berpikir paket raster memiliki analog eksplisit dengan GridTopology, tetapi Anda bisa mendapatkan komponen untuk "roll your own":
library(raster)
r1 <- raster(nrows=108, ncols=21, xmn=0, xmx=10)
## "cellsize"
res(r1)
## [1] 0.4761905 1.6666667
## extreme cell corners (just a different convention to sp's cellcentre)
extent(r1)
class : Extent
xmin : 0
xmax : 10
ymin : -90
ymax : 90
## we can also use bbox to get the same thing
bbox(r1)
min max
s1 0 10
s2 -90 90
## grid dimensions (including number of attributes/layers as 3rd "dim")
dim(r1)
## [1] 108 21 1
Menghubungkan semua ini bersama-sama, kita bisa beralih dari raster ke sp:
GridTopology(bbox(r1)[,1] + res(r1)/2, res(r1), dim(r1)[2:1])
(Perhatikan bagaimana dimensi harus dibalik). Cara lain yang lebih sederhana adalah dengan memaksa SpatialGrid dan menggunakan sp's getGridTopology, meskipun ini lebih mahal karena koordinat akhirnya dihasilkan di sepanjang jalan:
getGridTopology(as(r1, "SpatialGrid"))
Ketiga bagian dari "topologi" raster tidak semuanya diperlukan, karena beberapa di antaranya berlebihan tetapi tidak ada cara lain untuk menangkap semuanya sebagai satu objek - kecuali, raster yang dibuat di atas adalah "kosong" sehingga dapat melakukan pekerjaan yang dilakukan GridTopology untuk sp. Saya tidak yakin tentang detail "kosong" itu, tetapi jelas tidak secara eksplisit menyimpan slot "data" dan lebih kecil daripada dengan nilai di dalamnya. Paket raster pada umumnya melakukan yang terbaik untuk menjaga penggunaan memori seminimal mungkin, dan karenanya Anda tidak perlu khawatir benar-benar "jarang".
Itu mungkin bisa membantu menjelaskan sedikit lagi, saya tahu saya tumpang tindih dengan jawaban Spacedman, tetapi masih belum jelas apa yang Anda maksud dalam pertanyaan itu.