En el caso de las capas vectoriales podemos trabajar únicamente con los elementos de la capa considerando solamente la tabla de la tabla de atributos asociada, como si se tratara de un data.frame
independiente.
O realizar operaciones en los que se tiene en cuenta los elementos de cada capa por su componente espacial.
En este documento vamos a trabajar con la tabla de atributos.
Para cargar o importar una capa vectorial podemos recurrir a diferentes funciones. Como lo mas usual es que tengas la información de las capa vectoriales en formato shapefile
, el estándar para este tipo de datos, usaremos la funcionesshapefile()
de la librería raster
.
Un shapefile
es un multifichero que guarda la información espacial en varios ficheros, tienen en común el nombre y se diferencian por las extensiones, pero todos son necesarios para que el multifichero sea operativo.
Como mínimo el conjunto está formado por 3 ficheros que contienen:
.shp
las entidades geométricas de cada objeto.shx
el índice de las entidades.dbf
la tabla de atributos asociada y conectada por el índiceAunque hay otros archivos opcionales que podéis ver que contienen en el siguiente entrada de la wikipedia.
Para empezar a trabajar en R cargamos la capa:
Una vez creado el objeto asociado a la capa, puedes ver sus características, representarlo y hacer las estadísticas, transformaciones o lo que consideres necesario. Usaremos las funciones geometry()
, para determinar el tipo de objeto.
En esta ocasión vas a usar los ficheros que recogen la información de una selección de términos municipales de la Región de Murcia, en formato vectorial (seleccionTerminos.shp
, y sus restantes ficheros asociados .cpg
, .dbf
, .prj
, .qpj
y shx
).
Trabajamos con bases de datos, en ellas, se intenta ocupar el menor espacio de disco posible; en el caso de los números enteros largos (int64
) se ocupa mayor espacio que los caracteres o factores, por ello, es necesario indicar a la función que, al cargar la tabla, los tome como números. Para esto usamos el argumento integer64
. Ahora ya no es necesario generar nuevas variables como numéricas, pues desde el origen se toman como tal.
Primero recordaremos que tipo de datos espaciales tenemos usando la función geometry()
, ya vista en el módulo 1. Obtén un resumen a los datos y comprueba las dimensiones de sus tablas de atributos.
geometry( terminosV )
class : SpatialPolygons
features : 14
extent : 629962.3, 663793.3, 4205918, 4242772 (xmin, xmax, ymin, ymax)
crs : +proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs
summary( terminosV )
Object of class SpatialPolygonsDataFrame
Coordinates:
min max
x 629962.3 663793.3
y 4205918.3 4242772.3
Is projected: TRUE
proj4string :
[+proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs]
Data attributes:
ID NOMBRE POB2015 COD_COMARC
Min. : 2.00 Length:14 Min. : 504 Length:14
1st Qu.: 9.50 Class :character 1st Qu.: 1551 Class :character
Median :21.50 Mode :character Median : 6770 Mode :character
Mean :21.57 Mean :11824
3rd Qu.:33.25 3rd Qu.:12691
Max. :42.00 Max. :69331
COMARCA SUPERFKM2
Length:14 Min. : 10.27
Class :character 1st Qu.: 16.55
Mode :character Median : 39.41
Mean : 51.85
3rd Qu.: 76.79
Max. :169.47
dim( terminosV )
[1] 14 6
Recuerda que lo podemos representar y añadir los códigos de los municipios como etiqueta, función text()
, y como leyenda usando un poco el ingenio y lo que ya sabemos de R
, funciones paste()
para generar el vector con el código y nombre así como la función legend()
, para añadirla al gráfico.
plot( terminosV,
col = grey.colors( 60 )[terminosV$ID ],
border = "grey80",
cex.axis = 0.7,
axes = TRUE,
alpha = .8 )
text( terminosV,
terminosV$ID,
cex = 0.95,
col = "white" ,
halo = TRUE, hc = "darkred", hw = 0.3)
texto <- paste( terminosV$ID,
terminosV$NOMBRE )
legend( "bottomleft",
legend = texto,
cex = 0.7,
bty = "n",
box.lty = "o")
Responde
¿Cuántos términos municipales tiene la capa vectorial?
¿Qué variables son numéricas?
¿Cuál es la superficie del municipio más grande? ¿Y del más tequeño?
¿Se te ocurre como saber qué municipios son?
Como en cualquier data.frame
podemos seleccionar registros, en función de ciertos valores, ordenar la tabla, …
Por ejemplo ¿cuáles son los términos municipales con una superficie mayor de 35 km2?
Vamos a usar las operaciones lógicas, ya vistas en módulos anteriores, y al ser objetos espaciales también podrás visualizar el resultado como un mapa.
Realizamos la selección (operación lógica).
Es útil mostrar el listado de términos municipales.
También tienes la opción de representar gráficamente.
También puedes seleccionar por variables categóricas, por ejemplo, por la variable nombre, siguiendo los mismos pasos
Realizamos la selección (operación lógica).
Responde
¿Se te ocurre como seleccionar los municipios con superficie menor de 20 km2 y mayor de 100 km2?
¿Cómo resolverías la pregunta anterior pero sólo de la comarca
Vega del Segura
?
Puedes, obviamente, añadir nuevas variables a la tabla de atributos, eso sí, debes añadir un valor para cada elemento de la capa, como lo haces en cualquier data.frame
. Claro que también puedes realizar operaciones entre las variables, que den una nueva como resultado.
Vamos a ver un ejemplo de esta última opción. Como tenemos el número de habitantes de cada municipio, para el año 2015, variable POB2015
, y la superficie de cada término municipal, en kilómetros cuadrados, en la variable SUPERFKM2
, es fácil obtener la nueva variable densidad de población para 2015 (den2015
).
terminosV$den2015 <- ( terminosV$POB2015 / terminosV$SUPERFKM2 )
terminosV
class : SpatialPolygonsDataFrame
features : 14
extent : 629962.3, 663793.3, 4205918, 4242772 (xmin, xmax, ymin, ymax)
crs : +proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs
variables : 7
names : ID, NOMBRE, POB2015, COD_COMARC, COMARCA, SUPERFKM2, den2015
min values : 2, Abarán, 504, 3, Area metropolitana de Murcia, 10.27, 11.1332007952286
max values : 42, Villanueva del Río Segura, 69331, 8, Vega del Segura, 169.47, 1132.33679072605
Y podemos representar el mapa en función de esa varible, donde los colores más intensos indicarán una mayor densidad.
plot( terminosV,
col = heat.colors( 1150, rev = TRUE )[terminosV$den2015],
border = "grey80",
cex.axis = 0.7,
axes = TRUE,
alpha = .8 ,
main = "Densidad de Población\n 2015")
Responde
¿Qué variable necesitaríamos para calcular el incremento de población entre 2000 y 2015, en nuestros municipios?
¿Qué ocurre si utilizas la expresión
terminosV$nuevaVar <- 1
?¿Qué añadirías a la representación gráfica para que fuera más explicativa?
En algunos casos necesitaremos obtener la información de los elementos de nuestra capa de manera agregada, es decir, el valor de alguna de las variables en función de otra. Para ello recurrimos a la función aggregate()
, se trata de la función incluida en el paquete sp
, que carga por defecto la librería raster
; ya verás más adelante que existe también la versión aggregate
del propio paquete raster
, pero no te preocupes R
detectará cual es la necesaria.
En las capas de polígonos esta función se puede aplicar tanto a la tabla como a la capa en sí, aspecto que vemos en otro documento. Al aplicarlo a la tabla, obtendremos solamente la información solicitada.
Superficie por comarca
Número de municipios por comarca
Cuidado
Si deseas trabajar con todas las columnas de la tabla puedes recurrir a la función
aggregate
del paquetestats
:Pero cuidado, las tablas de atributos suelen tener columnas de distintos tipos. En el caso de evaluar este ejemplo obtendrás mensajes de
warning
asociados al pretendido calculo de medias para variables de cadena o factores.