Potrzebuję siatki przestrzennej jako siatki głównej dla różnych map tematycznych. Jak utworzyć siatkę przestrzenną z rastra odrzucającego wszystkie piksele NA?
Rzuć nam tutaj trochę skrawków. Mały kod do rastra i czego się od niego oczekujesz?
Spacedman,
Odpowiedzi:
14
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.3750.7[2,]0.1250.5[3,]0.3750.5[4,]0.6250.5[5,]0.8750.5[6,]0.1250.3[7,]0.3750.3[8,]0.6250.3[9,]0.3750.1[10,]0.8750.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.1250.254
y 0.1000.204
SpatialPoints:
x y
[1,]0.3750.7[2,]0.1250.5[3,]0.3750.5[4,]0.6250.5[5,]0.8750.5[6,]0.1250.3[7,]0.3750.3[8,]0.6250.3[9,]0.3750.1[10,]0.8750.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.
dzięki kolego, też nie jestem pewien, czego chcę. Próbuję opracować przepływ pracy, aby uzyskać identyczne mapy rastrowe (pod względem rozdzielczości, współrzędnych, crs, ...) z różnych danych punktów przestrzennych. rasteryzacja nie jest opcją ze względu na rozproszenie punktów przestrzennych. Musisz użyć iwd lub podobnego. Masz rację, siatka jest prostokątna - prawdopodobnie potrzebuję jako szablonu głównego prawdopodobnie SpatialPointsDataFrame. które mogą być gridowane. S.
Janbob Squarebrains,
Prawdopodobnie będziesz chciał głównego rastra (ha!), A następnie utworzysz wszystkie kolejne siatki równoległe z nim.
Radar
2
Zgoda. Jeśli wszystko jest w siatce, raster jest prawie zawsze odpowiedzią. Albo to, albo brodząc przez około 20 stron Zastosowanej analizy danych przestrzennych w R, aby dowiedzieć się, jak wykonać SpatialPixels. Właściwie to dałem wybór doktorantowi dzisiaj. Wybrał ... mądrze!
Spacedman,
20
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 010
s2 -9090## 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:
(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.
(Prawdopodobnie, ponieważ można przechowywać rzadkie komórki, po prostu przechowując ich indeks zamiast wyraźnych współrzędnych, a pierwotnie „nieco nieregularne” współrzędne komórkowe mogą być po prostu przechowywane jako atrybuty, jeśli naprawdę ich potrzebujesz. Ani sp, ani raster nie zajmują się nieregularnymi rastrami, nawet prostego prostoliniowego przypadku - jest to zgodne z większością narzędzi GIS, ale jest niefortunne, ponieważ jest dość powszechne w formatach takich jak NetCDF i jest obsługiwane przez dobrą starą funkcję grafiki :: image R (chociaż nie, jeśli używana jest ostatnia opcja rasterImage) .)
Dzięki za bardzo pouczające stwierdzenia, które muszę przetrawić. Mam nadzieję, że pozwoli mi to rozwiązać problem lub opublikować pytanie, które jest bardziej jednoznaczne!
Janbob Squarebrains,
Również @Spacedman: Dokładniej zdefiniowałem tło mojego pytania tutaj na forum.
Odpowiedzi:
Możesz uzyskać wszystkie współrzędne komórek inne niż NA w rastrze za pomocą:
są to komórki, które nie są NA. Następnie prawdopodobnie możesz je przesłać do SpatialPixels
Chociaż osobiście wszystko na siatce zachowałbym jako raster.
Nie jestem jeszcze do końca pewien, czego chcesz -
SpatialGrid
obiekty definiują pełne prostokątne siatki, więc jedna bez pikseli NA nie ma sensu.źródło
Aby przekształcić RasterLayer w obiekt Spatial * (Grid lub Pixels), możesz użyć funkcji koercji „as”
źródło
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”:
Łącząc je wszystkie razem, możemy przejść od rastra do sp:
(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:
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.
źródło