Necesito una cuadrícula espacial como una cuadrícula maestra para diversos mapas temáticos. ¿Cómo produzco una cuadrícula espacial a partir de un ráster que descarta todos los píxeles de NA?
Necesito una cuadrícula espacial como una cuadrícula maestra para diversos mapas temáticos. ¿Cómo produzco una cuadrícula espacial a partir de un ráster que descarta todos los píxeles de NA?
Respuestas:
Puede obtener todas las coordenadas de celdas que no son NA en un ráster con:
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
esas son las células que no son NA. Entonces, probablemente pueda alimentarlos a 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
Aunque personalmente cualquier cosa en una cuadrícula lo guardaría como una trama.
Todavía no estoy totalmente seguro de qué es lo que quiere: los SpatialGrid
objetos son cuadrículas rectangulares completas, por lo que uno sin los píxeles de NA no tiene sentido.
Para transformar un RasterLayer en un objeto espacial * (cuadrícula o píxeles), puede usar la función de coerción "como"
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)
Sus dos requisitos parecen ser sobre cosas diferentes:
1) Algún tipo de plantilla de cuadrícula ráster confiable.
2) Una cuadrícula dispersa que no almacena explícitamente las celdas faltantes.
sp :: GridTopology proporciona la primera, es solo una descripción de la cuadrícula basada en la coordenada de la celda inferior izquierda (cellcentre.offset), el espaciado de la celda (cellize) y las dimensiones de la cuadrícula (cells.dim).
La clase sp :: SpatialPixelsDataFrame le permite almacenar cuadrículas dispersas, pero por sí solo almacena mucho más que la "plantilla"; también almacena cada coordenada explícitamente. Esto se debe a que hace dos trabajos, uno le permite preservar las coordenadas originales que provienen de la cuadrícula y posiblemente son ligeramente irregulares, dos le permite almacenar solo aquellas celdas que tienen valores válidos. (Posiblemente * estos dos objetivos deberían haberse separado, pero esa es otra historia).
No creo que el paquete ráster tenga un análogo explícito a GridTopology, pero puede obtener los componentes para "rodar el suyo":
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
Al vincular todo esto, podemos pasar de raster a sp:
GridTopology(bbox(r1)[,1] + res(r1)/2, res(r1), dim(r1)[2:1])
(Observe cómo se deben revertir las dimensiones). Otra forma más simple es coaccionar a SpatialGrid y usar getGridTopology de sp, aunque esto es más costoso ya que las coordenadas terminan siendo generadas en el camino:
getGridTopology(as(r1, "SpatialGrid"))
Esas tres partes de la "topología" de ráster no son todas necesarias, ya que algunas son redundantes, pero de otra manera no hay una manera de capturarlas como un solo objeto, excepto que el ráster creado arriba está "vacío" y así puede hacer el trabajo que hace GridTopology para sp. No estoy seguro de los detalles de cuán "vacío" está, pero ciertamente no almacena explícitamente el espacio de "datos" y es más pequeño de lo que sería con valores en él. En general, el paquete ráster hace todo lo posible para mantener el uso de memoria al mínimo, por lo que es posible que no tenga que preocuparse por ser realmente "escaso".
Eso podría ayudar a explicar un poco más, sé que estoy superponiendo la respuesta de Spacedman, pero todavía no está claro exactamente lo que quieres decir en la pregunta todavía.