Farklı tematik haritalar için ana ızgara olarak bir Mekansal Izgaraya ihtiyacım var. Tüm NA piksellerini atarak bir taramadan nasıl bir Mekansal Izgara üretebilirim?
Farklı tematik haritalar için ana ızgara olarak bir Mekansal Izgaraya ihtiyacım var. Tüm NA piksellerini atarak bir taramadan nasıl bir Mekansal Izgara üretebilirim?
Yanıtlar:
Bir rasterdeki hücrelerin NA olmayan tüm koordinatlarını şu şekilde alabilirsiniz:
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
bunlar NA olmayan hücrelerdir. Daha sonra bunları SpatialPixels'e besleyebilirsiniz.
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
Her ne kadar kişisel olarak bir ızgara üzerinde bir şey raster olarak tutmak istiyorum.
Hala ne istediğinizden emin değilim - SpatialGrid
nesneler tam dikdörtgen ızgaralar tanımlar, bu yüzden NA pikselleri olmayan bir şey mantıklı değildir.
Bir RasterLayer'ı bir Spatial * nesnesine (Izgara veya Piksel) dönüştürmek için zorlama işlevini ""
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)
İki gereksiniminiz farklı şeylerle ilgili gibi görünüyor:
1) Bir çeşit güvenilir ızgara ızgara şablonu.
2) Eksik hücreleri açıkça saklamayan seyrek bir ızgara.
sp :: GridTopology birincisini sağlar, sadece sol alt hücre koordinatına (cellcentre.offset), hücre aralığına (hücre boyutu) ve ızgaranın boyutlarına (cellers.dim) dayalı bir ızgara açıklamasıdır.
Sp :: SpatialPixelsDataFrame sınıfı, seyrek ızgaraları depolamanıza izin verir, ancak kendi başına "şablon" dan çok daha fazlasını depolar - ayrıca her koordinatı açıkça saklar. Bunun nedeni, iki iş yapmasıdır, biri ızgaradan gelen ve muhtemelen biraz düzensiz olan orijinal koordinatları korumanıza izin verir, iki, yalnızca geçerli değerlere sahip hücreleri depolamanızı sağlar. (Tartışmalı olarak * bu iki hedef birbirinden ayrılmalıdır, ama bu başka bir hikaye).
Raster paketinin GridTopology için açık bir analogu olduğunu düşünmüyorum, ancak bileşenlerinizin "kendinizinkini yuvarlamak" için kullanabileceğinizi düşünüyorum:
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
Bunları birbirine bağlayarak, rasterden sp'ye gidebiliriz:
GridTopology(bbox(r1)[,1] + res(r1)/2, res(r1), dim(r1)[2:1])
(Boyutların nasıl ters çevrilmesi gerektiğini unutmayın). Başka bir basit yol, SpatialGrid'e zorlamak ve sp'nin getGridTopolojisini kullanmaktır, ancak bu daha pahalıdır, çünkü koordinatlar yol boyunca üretilir:
getGridTopology(as(r1, "SpatialGrid"))
Raster "topolojisinin" bu üç bölümünün hepsi gerekli değildir, çünkü bazıları gereksizdir, ancak hepsini tek bir nesne olarak yakalamanın başka bir yolu yoktur - ancak yukarıda oluşturulan raster "boş" ve böylece GridTopology'nin sp. Ne kadar "boş" olduğunu ayrıntılarından emin değilim, ama kesinlikle açıkça "veri" yuvası depolamaz ve içindeki değerlerle olduğundan daha küçüktür. Raster paketi genel olarak bellek kullanımını minimumda tutmak için elinden geleni yapar ve bu nedenle gerçekten "seyrek" olma konusunda endişelenmenize gerek olmayabilir.
Bu biraz daha açıklamaya yardımcı olabilir, Spacedman'ın cevabını örtüştüğümü biliyorum, ancak yine de soruda ne demek istediğinizi tam olarak bilmiyoruz.