Potrzebuję siatki przestrzennej jako siatki głównej dla różnych map tematycznych. Jak utworzyć siatkę przestrzenną z rastra odrzucającego wszystkie piksele NA?
Potrzebuję siatki przestrzennej jako siatki głównej dla różnych map tematycznych. Jak utworzyć siatkę przestrzenną z rastra odrzucającego wszystkie piksele NA?
Odpowiedzi:
Możesz uzyskać wszystkie współrzędne komórek inne niż NA w rastrze za pomocą:
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
są to komórki, które nie są NA. Następnie prawdopodobnie możesz je przesłać do 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
Chociaż osobiście wszystko na siatce zachowałbym jako raster.
Nie jestem jeszcze do końca pewien, czego chcesz - SpatialGridobiekty definiują pełne prostokątne siatki, więc jedna bez pikseli NA nie ma sensu.
Aby przekształcić RasterLayer w obiekt Spatial * (Grid lub Pixels), możesz użyć funkcji koercji „as”
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)
Wydaje się, że twoje dwa wymagania dotyczą różnych rzeczy:
1) Pewien niezawodny szablon siatki rastrowej.
2) Rzadka siatka, która nie przechowuje jawnie brakujących komórek.
sp :: GridTopology zapewnia pierwszy, to tylko opis siatki oparty na współrzędnej lewej dolnej komórki (cellcentre.offset), odstępach między komórkami (rozmiar komórki) i wymiarach siatki (komórki.dim).
Klasa sp :: SpatialPixelsDataFrame umożliwia przechowywanie rzadkich siatek, ale sama w sobie przechowuje znacznie więcej niż „szablon” - przechowuje również wyraźnie każdą współrzędną. Wynika to z tego, że wykonuje dwa zadania, jedno pozwala zachować oryginalne współrzędne pochodzące z siatki i być może nieco nieregularne, dwa pozwala przechowywać tylko te komórki, które mają prawidłowe wartości. (Prawdopodobnie * te dwa cele powinny były zostać rozdzielone, ale to już inna historia).
Nie sądzę, że pakiet rastrowy ma wyraźny odpowiednik GridTopology, ale możesz zdobyć komponenty, aby „stworzyć własne”:
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
Łącząc je wszystkie razem, możemy przejść od rastra do sp:
GridTopology(bbox(r1)[,1] + res(r1)/2, res(r1), dim(r1)[2:1])
(Uwaga: należy odwrócić wymiary). Innym prostszym sposobem jest zmuszenie do SpatialGrid i użycie getGridTopology sp, jednak jest to droższe, ponieważ współrzędne są generowane po drodze:
getGridTopology(as(r1, "SpatialGrid"))
Te trzy części „topologii” rastra nie są wszystkie konieczne, ponieważ niektóre są zbędne, ale nie ma innego sposobu na uchwycenie ich wszystkich jako jednego obiektu - z wyjątkiem tego, że utworzony powyżej raster jest „pusty”, więc może wykonać praca, którą GridTopology wykonuje dla sp. Nie jestem pewien szczegółów na temat tego, jak „pusty” jest, ale z pewnością nie przechowuje jawnie gniazda danych i jest mniejszy niż w przypadku wartości. Pakiet rastrowy robi wszystko, co w jego mocy, aby ograniczyć zużycie pamięci do minimum, dlatego nie musisz się martwić, że naprawdę będziesz „rzadki”.
To może pomóc trochę wyjaśnić. Wiem, że pokrywam się z odpowiedzią Spacedmana, ale wciąż nie jest do końca jasne, co masz na myśli w pytaniu.