Rasterden uzamsal ızgara nasıl üretilir?


9

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?


6
Bize biraz not atın. Raster yapmak için küçük bir kod ve bundan ne bekliyorsunuz?
Spacedman

Yanıtlar:


14

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 - SpatialGridnesneler tam dikdörtgen ızgaralar tanımlar, bu yüzden NA pikselleri olmayan bir şey mantıklı değildir.


teşekkürler dostum, ne istediğinden de emin değilim. Çeşitli uzaysal nokta verilerinden aynı raster haritaları (çözünürlük, koordinatlar, crs, ...) üretmek için bir iş akışı geliştirmeye çalışıyorum. rasterleştirme, uzamsal nokta dağılımından dolayı bir seçenek değildir. İwd ya da benzerini kullanmanız gerekiyor. Haklısın, ızgara rectengular - ana şablon olarak ihtiyacım olan şey muhtemelen bir SpatialPointsDataFrame. ızgaralanabilir. S.
Janbob Squarebrains

Muhtemelen bir ana tarama (ha!) İsteyeceksiniz ve daha sonra onunla eşzamanlı olarak tüm ızgaraları oluşturacaksınız.
Radar

2
Kabul. Eğer şeyler ızgaralanırsa, raster neredeyse her zaman cevaptır. Ya bu, ya da SpatialPixels'in nasıl yapılacağını anlamak için R'deki yaklaşık 20 sayfa Uygulamalı Uzamsal Veri Analizi boyunca dolaşmak. Aslında bu seçeneği bugün doktora öğrencisine verdim. Akıllıca ... seçti!
Spacedman

20

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)

7

İ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.

  • (Tartışmasız, seyrek hücreleri açık koordinatlar yerine dizinlerini saklayarak saklayabildiğiniz ve aslında "biraz düzensiz" hücre koordinatları, gerçekten istedikleri takdirde nitelikler olarak saklanabildiğinden. basit düz çizgili kasa bile değil - bu çoğu CBS aracıyla uyumludur, ancak NetCDF gibi formatlarda oldukça yaygın olduğu ve R'nin eski eski grafikleri :: image function (son rasterImage seçeneği kullanıldığında olmasa da) .)

Sindirmem gereken çok öğretici ifadeler için teşekkürler. Umarım sorunumu çözmemi veya daha açık bir soru göndermemi sağladım!
Janbob Squarebrains

Ayrıca @Spacedman: Soru arka planımı forumda daha kesin olarak tanımladım .
Janbob Squarebrains
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.