- Datos espaciales y análisis exploratorio
- Datos georeferenciados
- Creación y tratamiento de datos tipo vector en R (librería sp)
- Gráficos exploratorios
- Aplicaciones
sp es el paquete principal que soporta el análisis de datos espaciales en R. sp define un conjunto de clases para representar datos espaciales.¡Para tener en cuenta!
- Una clase define un tipo de datos particular.
- Un
dataframees un ejemplo de una clase.- Cualquier
dataframeparticular que crees es un objeto (instancia) de esa clase.
- La librería
spintroduce una serie de clases con nombres que comienzan conSpatial.- Para los datos vectoriales, los tipos básicos son los:
SpatialPoints,SpatialLinesySpatialPolygons. Estas clases solo representan geometrías.- Para almacenar atributos, debe agregarse estos nombres el prefijo
DataFrame.
SpatialPolygonsDataFrame,SpatialLinesDataFrameySpatialPointsDataFrame.- Cuando se hace referencia a cualquier objeto con un nombre que comience con Spatial, se escribe
Spatial(Points/Lines/Polygons)Spatial(Points/Lines/Polygons)DataFrame, si es una instancia.- Vamos algunos ejemplos de la cración y manipulación de estas clases de la librería
sp.
longitud <- c(-116.7, -120.4, -116.7, -113.5, -115.5, -120.8, -119.5, -113.7, -113.7, -110.7)
latitud <- c(45.3, 42.6, 38.9, 42.1, 35.7, 38.9, 36.2, 39, 41.6, 36.9)
lonlat <- cbind(longitud, latitud)
Un objeto de la clase SpatialPoints
# pts es un objeto de la clase SpatialPoints
library(sp)
pts <- SpatialPoints(lonlat)
Veamos que clase tiene
class(pts)
Vaemos ahora que hay dentro
showDefault(pts)
proj4string. Esto almacena el sistema de referencia de las coordenadas crs. crs (es desconocido NA).¡Demoselas!
crdref <- CRS('+proj=longlat +datum=WGS84')
pts <- SpatialPoints(lonlat, proj4string=crdref)
Veamos ahora como queda
# usamos la libreria raster, para ver como estan los elementos del objeto espacial
library(raster)
pts
Usemos el objeto SpatialPoints para crear un objeto SpatialPointsDataFrame.
1 . Necesitamos un dataframe con la misma cantidad de filas que instancias del objeto geometrico (puntos).
df <- data.frame(ID=1:nrow(lonlat), precipitacion=(latitud-30)^3)
2 . Combinemos el SpatialPoints con el dataframe.
ptsdf <- SpatialPointsDataFrame(pts, data=df)
3 . Veamos como queda su contenido.
#usando str
str(ptsdf)
#usando showDefault
showDefault(ptsdf)
SpatialPoints. Hay otros tipos de objetos, como:
SpatialLinesSpatialPolygonsspLines y spPolygons de la librería raster, para crear lineas y poligonos.Veamos como se hace con lineas:
# usamos spLines
lon <- c(-116.8, -114.2, -112.9, -111.9, -114.2, -115.4, -117.7)
lat <- c(41.3, 42.9, 42.4, 39.8, 37.6, 38.3, 37.6)
lonlat <- cbind(lon, lat)
lns <- spLines(lonlat, crs=crdref)
Ahora con poligonos
# usamos spPolygons
pols <- spPolygons(lonlat, crs=crdref)
Finalmente, generemos un “mapa”, con los elementos de la clase spPolygons.
plot(pols, axes=TRUE, las=1, main="Mapa", xlab="Lon", ylab="Lat")
#plot(pols, border='blue', col='yellow', lwd=3,add=TRUE)
#points(pts, col='red', pch=20, cex=3)
sp admite datos ráster (en cuadrícula) con las clases SpatialGridDataFrame y SpatialPixelsDataFrame.raster y sus clases para los datos tipo raster.La libraría raster, tiene las clases:
RasterLayer, RasterBrick y RasterStack; que son las más importantes para nosostros.La librería ráster tiene funciones para crear, leer, manipular y escribir datos ráster.
Proporciona, entre otras cosas, funciones generales de manipulación de datos raster para desarrollar funciones más específicas. Por ejemplo para:
La librería también implementa otras funciones para la manipulación de datos raster.
RasterLayer representa datos ráster de capa única (variable). RasterLayer tiene los parámetros:
RasterLayer puede almacenar información sobre el archivo en el que se almacenan los valores de la celda raster (si existe tal archivo); así como los valores de celda ráster en la memoria.Crearemos un objeto de tipo(clase) RasterLayer, con la función raster
xmn, nrow, ncol y/o crs. RasterLayer en otro sistema de coordenadas de referencia(proyección) puede usar la función projectRaster.Aquí creamos un RasterLayer desde cero. Tenga en cuenta que, en la mayoría de los casos en que se analizan datos reales, estos objetos se crean a partir de un archivo(datos reales).
# RasterLayer con parametros por defecto
library(raster)
r <- raster()
# RasterLayer con nuevos parametros
r <- raster(nrow=18, ncol=36, xmn=-1000, xmx=1000, ymn=-100, ymx=900)
# cambiemos la resolucion
res(r) <- 100
# cambiemos el numero de columnas(esto afecta la resolucion)
ncol(r) <- 18
# agreguemos valores aleatorios al raster
values(r) <- runif(ncell(r))
# agreguemos una la proyeccion
projection(r) <- "+proj=utm +zone=48 +datum=WGS84"
plot(r)
library(raster)
r1 <- raster(ncol=10, nrow=10, xmx=-80, xmn=-150, ymn=20, ymx=60)
res(r1) <- 100
# agregar valores del 1:ncell al raster
values(r1) <- 1:ncell(r1)
plot(r1)
# agregar poligonos y puntos
lon <- c(-116.8, -114.2, -112.9, -111.9, -114.2, -115.4, -117.7)
lat <- c(41.3, 42.9, 42.4, 39.8, 37.6, 38.3, 37.6)
lonlat <- cbind(lon, lat)
crsr <- "+proj=utm +zone=48 +datum=WGS84"
pols <- spPolygons(lonlat, crs=crsr)
plot(pols, border='blue', lwd=2, add=TRUE)
points(lonlat, col='red', pch=20, cex=1.5)
- Los objetos creados hasta ahora, solo consisten en:
- la geometría del ráster (número de fil y col).
- la ubicación del ráster en el espacio geográfico.
- valores de celda asociados con el raster
# creamos el raster con algunos parametros
r <- raster(ncol=10, nrow=10, xmx=-80, xmn=-150, ymn=20, ymx=60)
values(r) <- 1:ncell(r)
r2 <- r * r
r3 <- sqrt(r)
# RasterStack
s <- stack(r, r2, r3)
plot(s)
# RasterBrick
b <- brick(s)
plot(b)
Ejemplo SpatialPolygons
f <- "/home/rober/Downloads/COL_adm/COL_adm1.shp"
library(raster)
p <- shapefile(f)
par(mai=c(0,0,0,0))
plot(p)
Extraer atributos del archivo .shp
d <- data.frame(p)
Extraer la geometría del .shp
g <- geom(p)
Extraer variables
d$NAME_1
p$NAME_1
Extraer un SpatialPolygonsDataFrame de la variable NAME_1
p[, 'NAME_1']
Observe la diferencia de p[, 'NAME_1'] y p$NAME_1.
Insertar nueva variable
set.seed(0)
p$new <- sample(letters, length(p))
Insertar nuevos valores a una variable existente
p$new <- sample(LETTERS, length(p))
Eliminar una variable
p$new <- NULL
Puede Mezclar(unir) un data.frame con un objeto Spatial* con merge.
dfr <- data.frame(Depto=p$NAME_1, ComInt=p$TYPE_1, Value=round(runif(length(p), 100, 1000)))
dfr <- dfr[order(d$TYPE_1), ]
pm <- merge(p, dfr, by.x=c('NAME_1', 'TYPE_1'), by.y=c('Depto', 'ComInt'))
Guardar una variable del SpatialPolygonsDataFrame
i <- which(p$TYPE_1 == "Departamento")
g <- p[i,]
Creemos una malla(grid) sobre una parte del mapa (.shp)
z <- raster(p, nrow=5, ncol=5, vals=1:25)
names(z) <- 'Zona'
# obligar al RasterLayer para convertirlo en SpatialPolygonsDataFrame por zonas
z <- as(z, 'SpatialPolygonsDataFrame')
Coloquemos la malla(grid) sobre una parte del mapa (.shp)
z2 <- z[2,]
plot(p)
plot(z, add=TRUE, border='blue', lwd=3)
plot(z2, add=TRUE, border='red', lwd=2, density=6, col='red')
Para Anexar el objeto SpatialPolygonsDataFrame z a p usemos bind
b <- bind(p, z)
head(b)
tail(b)
Agregue SpatialPolygons disolviendo el mapa
pa <- aggregate(p, by='TYPE_1')
za <- aggregate(z)
plot(za, col='light gray', border='light gray', lwd=5)
plot(pa, add=TRUE, col=rainbow(3), lwd=3, border='white')
Agregue SpatialPolygons sin disolver el mapa
pa <- aggregate(p, by='TYPE_1',dissolve=FALSE)
za <- aggregate(z)
plot(za, col='light gray', border='light gray', lwd=5)
plot(pa, add=TRUE, col=rainbow(3), lwd=3, border='white')
Borrar SpatialPolygons
#crear una zona del mapa
z <- raster(p, nrow=2, ncol=2, vals=1:4)
z <- as(z, 'SpatialPolygonsDataFrame')
z2 = z[2,]
# borrar la zona - forma 1
e <- erase(p, z2)
# equivalente a - forma 2
e <- p - z2
plot(e)
Interceptar SpatialPolygons
i <- intersect(p, z2)
# i <- p * z2 #equivalente
plot(i)
Interceptar una celda con el mapa
e <- extent(-75.8, -74.5, 9.5, 10.9)
pe <- crop(p, e)
plot(p)
plot(pe, col='light blue', add=TRUE)
plot(e, add=TRUE, lwd=3, col='red')
Unir dos objetos de tipo SpatialPolygon*.
u <- union(p, z)
# equivalente
#u <- p + z
Ahora, cada una de las areas segmentadas forma un poligono; además de los existentes en el mapa
set.seed(5)
plot(u, col=sample(rainbow(length(u))))
cover es una combinación de intersección y unión
cov <- cover(p, z)
cov
plot(cov)
Diferencia simetrica de dos objetos SpatialPolygons*
dif <- symdif(z,p)
plot(dif, col=rainbow(length(dif)))
Consultas sobre los poligonos y las rejillas.
pts <- matrix(c(-75.8, -73.4,-72.8, -75.1, 9, 10,4, 6.9), ncol=2)
spts <- SpatialPoints(pts, proj4string=crs(p))
plot(z, col='light blue', lwd=2)
points(spts, col='light gray', pch=20, cex=6)
text(spts, 1:nrow(pts), col='red', font=2, cex=1.5)
lines(p, col='blue', lwd=2)
Encontramos los departamento donde están las coordenadas de pts
over(spts, p)
Encontramos las zonas de la rejilla donde están las coordenadas de pts
over(spts, z)
Encontramos los id donde están las coordenadas de pts
extract(z, pts)