Vamos a seguir trabajando con nuestra capa de términos municipales y añadimos dos capas más para operar con ellas y entre ellas.
Las localizaciones de los núcleos de población de la Región de Murcia. Vectorial de puntos.
La red fluvial de la cuenca del Segura una capa vectorial de líneas.
Con la función aggregate
, esta vez de la librería raster
, se pueden generar nuevas capas uniendo los polígonos que compartan algún atributo. Por ejemplo, podemos crear una capa de las comarcas a partir de los términos municipales, con sus superficies calculadas.
En este caso se usa el argumento by
:
Podemos ver como se ha modificado la capa y la tabla de atributos
class : SpatialPolygonsDataFrame
features : 3
extent : 629962.3, 663793.3, 4205918, 4242772 (xmin, xmax, ymin, ymax)
crs : +proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs
variables : 2
names : Group.1, SUPERFKM2
min values : Area metropolitana de Murcia, 64.29
max values : Vega del Segura, 429.69
Group.1 SUPERFKM2
1 Area metropolitana de Murcia 231.99
2 Cuenca de Mula 64.29
3 Vega del Segura 429.69
Y representarla, ahora ya no hay fronteras entre los términos municipales, solo entre comarcas.
Alternativamente, en ocasiones, agregamos por comarcas sin realizar ningún cálculo, sencillamente queremos una capa con solamente las comarcas, para añadir, en su caso y posteriormente, a la tabla de atributos las variables que estimemos oportunas.
class : SpatialPolygonsDataFrame
features : 3
extent : 629962.3, 663793.3, 4205918, 4242772 (xmin, xmax, ymin, ymax)
crs : +proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs
variables : 1
names : COMARCA
min values : Area metropolitana de Murcia
max values : Vega del Segura
COMARCA
1 Area metropolitana de Murcia
2 Cuenca de Mula
3 Vega del Segura
Responde
¿Cuál es la diferencia en el resultado de la generación de los colores asociados a las comarcas?
¿Encuentras alguna ventaja o inconveniente en cambiar el código de los dos casos con las siguientes alternativas?
col = c( rank( comarcasSup$SUPERFKM2 ) )
col = c( rank( rownames( comarcas@data ) ) )
En muchas ocasiones no queremos trabajar sobre una capa entera por que es mucho más extensa de la región de interés, los cálculos se relentizan, necesitamos más memoria, los ficheros de trabajo de trabajo son mucho más grandes. Por ejemplo no es sensato trabajar con un capa de toda Europa si únicamente nos interesan los resultados de un país.
Al enfrentar este tipo de situaciones recurrimos a procedimiento de selección con la función subset
; el argumento subset
de esta función es el que recoge la selección.
Volvamos a nuestra capa de terminos municipales, veamos como seleccionar:
por una variable tipo código o carácter, como por ejemplo la variable COD_COMARC
por una variable cuantitativa, como por ejemplo, la población.
un único elemento.
Responde
Puesto que el argumento de selección
subset
permite usar expresiones ¿cómo seleccionarías los términos municipales de la comarca Área metropolitana de Murcia, con población mayor de 8000 habitantes en el año 2015?
Estás selecciones también se aplican a capas vectoriale de lineas o de puntos, por ejemplo, si de nuestra capa de la red fluvial solo queremos tener la línea correspondiente al Río Segura.
rioSegura <- subset(fluvialV , nom_rio == "RIO SEGURA")
plot( rioSegura,
main = "Río Segura",
axes = TRUE)
Responde
¿Cómo crearías una capa,
cauces25
, con los cauces de longitud superior a 35 km?¿Cómo sería tu código para representar a la vez las capas
cauces25
,rioSegura
yfluvialV
para visualizar claramente los tres niveles de información?
Lo habitual es que trabajemos con varias capas de cara a obtener la información deseada, pero considerando la información espacial y no la de la tabla de atributos.
Por ejemplo nuestra capa de localidades de la Región de Murcia, solamente tiene el código de la entidad (Nucleo de Población
). ¿Qué localidades están en cada término municipal? ¿Cómo conseguir una selección y obtener una nueva capa con solo las incluidas en nuestra capa terminosV
?
class : SpatialPointsDataFrame
features : 1070
extent : 559433.3, 702875.3, 4139828, 4288105 (xmin, xmax, ymin, ymax)
crs : +proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs
variables : 1
names : COD_NUCPOB
min values : 30001000101
max values : 30902000301
Dada la frecuencia con la que vamos a requerir información de otras capas, pero sólo para nuestra área de trabajo, o parte de ella, sin una variable para realizar la selección, vamos a plantearnos las soluciones más habituales.
Este es, posiblemente, el caso más frecuente ¿cómo podemos crear la capa con las localidades (puntos) incluidas en nuestra área de trabajo (polígonos en teminosV
)?
plot( localidadesRMv,
main = "Localidades de la Región de Murcia",
pch = 21,
cex = 0.5,
axes = TRUE )
plot( terminosV,
border = "red",
add = TRUE )
La solución es bastante sencilla, recurrimos a una selección por capas o por localización:
localidadesSel <- localidadesRMv[ terminosV, ]
plot( localidadesSel,
pch = 21,
cex = 0.5,
axes = TRUE)
plot( terminosV,
border = "red",
add = TRUE)
Realmente parece mágico, simplemente en el criterio de selección indicamos la capa que condiciona esta. Otro ejemplo:
Este procedimiento puede extenderse a capas de líneas o polígonos, pero el resultado, no es el esperado. Si aplicamos el criterio que acabamos de ver la selección incluye a todas las entidades o registros que “coindiden” espacialmente con la capa de selección. En el caso, en que sólo queremos la parte incluida, lo que necesitaríamos es realizar un corte de los elementos de la capa selecionada en función de la que selecciona. En el ejemplo siguiente vemos una aplicación directa de este procedimiento y lo inadecuado, si sólo queremos las partes incluidas en las región definida por la capa de corte. Para estos casos debemos recurrir a operaciones, cortes, intersecciones,
tal como veremos más adelante.
fluvialSel <- fluvialV[ terminosV, ]
plot( fluvialSel,
pch = 21,
cex = 0.5,
axes = TRUE )
plot( terminosV,
border = "red",
add = TRUE )
Responde
¿En qué situación de un proyecto de trabajo podrían requerir el uso de este procedimiento en particular?
La última operación que vamos a ver en este módulo es el conteo de puntos sobre una capa de polígonos.
También se trata de una situación usual: queremos saber cuantos puntos, es decir, localizaciones de muestreo, localidades, puntos de riesgo, ubicación de equipos de emergencias, enfermos de una epidémia, … incluidos en cada uno de poligonos del área de estudio.
Para resolver fácilmente la cuestión, la función requerida es over
de la librería sp
.
Por ejemplo ¿cuántas localidades hay por termino municipal?
Visualmente, simplemente contamos ^__^
:
Para calcular el resultado:
A partir de las dos capas obtenemos una tabla con la información de la capa de términos:
COD_NUCPOB
4 30034D26073
9 30011D25252
15 30038000399
17 30040D26154
22 30014000101
36 30027D25805
ID NOMBRE POB2015 COD_COMARC COMARCA SUPERFKM2
4 34 Ricote 1369 3 Vega del Segura 86.64
9 11 Blanca 6521 3 Vega del Segura 87.29
15 38 Torres de Cotillas, Las 21399 8 Area metropolitana de Murcia 38.78
17 40 Ulea 906 3 Vega del Segura 40.03
22 14 Campos del Río 2083 4 Cuenca de Mula 47.25
36 27 Molina de Segura 69331 8 Area metropolitana de Murcia 169.47
Generamos una tabla de conteos, para cada identificador, ID
, de la capa terminosV
, determinando así cuantas localidades hay por cada ID
—o lo que es lo mismo, por cara término municipal— y creamos un data.frame
.
Var1 Freq
1 2 7
2 4 2
3 7 3
4 9 6
5 11 7
6 14 5
7 18 3
8 25 4
9 27 21
10 31 4
11 34 12
12 38 10
13 40 3
14 42 2
Asignamos cada valor del conteo a su termino municipal y se genera la capa nueva incluyendo esta variable: Freq
.
ID NOMBRE POB2015 COD_COMARC COMARCA SUPERFKM2 Freq
7 18 Ceutí 11227 3 Vega del Segura 10.27 3
1 2 Abarán 13179 3 Vega del Segura 114.90 7
2 4 Albudeite 1374 4 Cuenca de Mula 17.04 2
12 38 Torres de Cotillas, Las 21399 8 Area metropolitana de Murcia 38.78 10
13 40 Ulea 906 3 Vega del Segura 40.03 3
3 7 Alguazas 9544 8 Area metropolitana de Murcia 23.74 3
Gráficamente comprobamos los resultados mediante:
Desafío
Imagina que en tu trabajo necesitaras realizar este tipo de procedimiento con mucha frecuencia. ¿Se te ocurre como crear una función —de nombre
cuentaPuntosPol
— que tome como argumentos la capa de puntos y la de políngos y devuelva una nueva, de polígonos, con la variable de conteo incluida en la tabla de atributos?