La información espacial se puede representar con un modelo vectorial de datos. En el caso del modelo ráster describimos las propiedades de los píxeles, en el modelo vectorial asociamos la información a objetos. Los objetos que se pueden representar incluyen: puntos, líneas y polígonos. En todos los casos, la geometría de estos objetos consiste en un conjunto de pares de coordenadas (x, y), uno para cada punto. En el caso de las líneas y polígonos el número de pares depende del detalle y extensión los segmentos que los definen.
Hay que tener en cuenta cada capa de información contiene un sólo tipo de objeto: puntos, líneas o polígonos; asociado a cada elemento de la capa (feature) se asocian los atributos atributos, una tabla compuesta por una o más variables que describen las propiedades de los objetos.
En el modelo vectorial hablamos de dos componentes:
geométrico: con la información espacial que describe a los objetos.
variables o atributos: con la tabla de datos asociada a cada uno de esos objetos.
Algunas de estas variables pueden obtenerse de la propia geometría de la componente espacial. Por ejemplo, en el caso de las líneas podemos obtener su longitud, para los polígonos, podemos calcular su superficie y perímetro. Obviamente, para los puntos no es posible asociar dichos atributos.
Los puntos son el caso de objetos espaciales más simple. La capa tiene \(n\) puntos y cada uno de ellos un par de coordenadas
, y \(p\) variables asociadas.
Lo más usual es tener la información ya elaborada y en uno o varios fichero con geometría y los atributos, Más adelante veremos como realizar su importación de estos ficheros a R
). Vamos a ejemplificar con la ayuda de un objeto llamado localidades
que contiene 36 localidades de 4 de las comarcas de la Región de Murcia. Para representarlo, la manera más sencilla, es usando la función plot
.
También podemos acceder a su contenido, como todo objeto de R
, lo podemos:
evaluar el objeto directamente:
localidades
class : SpatialPointsDataFrame
features : 36
extent : 640193.3, 662208.7, 4209645, 4233469 (xmin, xmax, ymin, ymax)
crs : +proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs
variables : 4
names : ID, comarca, cod_comarc, Nombre
min values : 1, Área metropolitana de Murcia, 3, Abarán
max values : 36, Vega del Segura, 8, Villanueva del Río Segura
visualizar la información sobre la componente espacial con la función: geometry()
:
examinar los atributos con @data
:
localidades@data
ID comarca cod_comarc Nombre
1 1 Vega del Segura 3 Ceutí
2 2 Vega del Segura 3 Lorquí
3 3 Área metropolitana de Murcia 8 Molina de Segura
4 4 Vega del Segura 3 Los Torraos
5 5 Área metropolitana de Murcia 8 Alguazas
6 6 Área metropolitana de Murcia 8 El Llano
7 7 Área metropolitana de Murcia 8 Romeral
8 8 Vega del Segura 3 Archena
9 9 Área metropolitana de Murcia 8 Altorreal
10 10 Área metropolitana de Murcia 8 La Alcaina
11 11 Área metropolitana de Murcia 8 El Chorrico
12 12 Área metropolitana de Murcia 8 Torrealta
13 13 Área metropolitana de Murcia 8 Los Valientes
14 14 Área metropolitana de Murcia 8 Casa del Cura
15 15 Área metropolitana de Murcia 8 Finca de Máximo
16 16 Área metropolitana de Murcia 8 Los Conejos
17 17 Área metropolitana de Murcia 8 Los Olivos
18 18 Área metropolitana de Murcia 8 El pino
[ reached 'max' / getOption("max.print") -- omitted 18 rows ]
Para ver la información de las primeras filas de la tabla, como siempre, recurrimos a la función head
:
La información que nos muestra es la siguiente, verás algunos elementos son los mismos que en los objetos Raster Layer:
class: clase del objeto.
El objeto localidades
es un Spatial Points Data Frame, es decir, un objeto que incluye datos espaciales de tipo punto más las variables asociadas en una tabla de atributos como un data.frame.
features: número de elementos que incluye.
Comprobamos, que efectivamente contiene los 36 puntos.
extent: extensión o límites del mapa, es decir coordenadas máximas y mínimas del área donde están incluidos los puntos.
crs: Coordinate reference system o también llamado Spatial reference system (SRS)), es el sistema de referencia, donde está incluido la información sobre coordenadas y proyección geográfica.
En nuestro objeto vemos que es se trata de una proyección UTM, en la zona 30 y el elipsoide es el GRS80, es equivalente a decir que el sistema de referencia es el ETRS89 UTM ZONA 30N, (entraremos en detalle sobre CRS en módulos posteriores).
variables: el número de las variables.
Efectivamente comprobamos que el data.frame
contiene las 4 variables (columnas).
names: los nombres de las variables que contiene.
En este caso tenemos 4 variables asociadas: nombre
(denominación de la localidad), ID
(identificador de cada punto), comarca
(denominación de la comarca) y cod_comarca
(código numérico de la comarca).
min values: valor mínimo de cada una de las variables.
max values: valor máximo de cada una de las variables.
Como en todo objeto de R
podemos acceder a los diferentes contenidos, al igual que si fuera un data.frame
, pero en vez de usar el símbolo $
para acceder a los elementos, en este caso se utiliza el símbolo @
, ya que se trata de un tipo S4. Por lo que para acceder a:
Las coordenadas de los puntos que incluye:
localidades@coords
coords.x1 coords.x2
[1,] 651565.1 4216041
[2,] 653394.4 4216431
[3,] 657330.2 4213519
[4,] 650779.3 4218141
[5,] 654081.1 4213189
[6,] 654424.5 4215711
[7,] 657171.7 4217006
[8,] 649128.4 4220215
[9,] 660875.4 4215629
[10,] 661428.8 4216988
[11,] 659743.3 4214372
[12,] 657051.5 4211416
[13,] 661655.3 4221755
[14,] 662208.7 4219818
[15,] 657278.0 4218963
[16,] 659793.6 4218472
[17,] 660837.7 4217894
[18,] 659328.2 4217982
[19,] 659051.5 4217466
[20,] 661315.6 4222699
[21,] 657233.9 4225164
[22,] 646328.4 4222529
[23,] 650152.3 4219202
[24,] 646913.3 4221972
[25,] 646775.0 4221758
[26,] 645290.7 4223544
[27,] 643306.5 4224136
[28,] 642514.0 4226928
[29,] 654079.9 4209947
[30,] 657406.9 4209645
[31,] 641652.4 4210186
[32,] 644633.5 4211670
[33,] 640193.3 4229695
[34,] 645602.0 4233469
[35,] 642306.5 4230161
[36,] 643702.7 4230928
Las variables asociadas a estos puntos. Podemos mostrarlas todas usando localidades@data
o las 6 primeras o solamente los nombres usando funciones como head()
o names()
.
head( localidades@data )
ID comarca cod_comarc Nombre
1 1 Vega del Segura 3 Ceutí
2 2 Vega del Segura 3 Lorquí
3 3 Área metropolitana de Murcia 8 Molina de Segura
4 4 Vega del Segura 3 Los Torraos
5 5 Área metropolitana de Murcia 8 Alguazas
6 6 Área metropolitana de Murcia 8 El Llano
names( localidades@data )
[1] "ID" "comarca" "cod_comarc" "Nombre"
Los límites del mapa, incluso seleccionar que límite mostrar, por ejemplo la coordenada $x_{min}$
O solamente el sistema de referencia:
Si lo que queremos acceder es a la tabla de datos asociada o tabla de atributos, podemos recurrir a dos maneras, como si localidades
fuera un data.frame
usando $
así podemos acceder a cada una de las variables, o usando @data
que accederíamos a todas. En el ejemplo siguiente solamente voy a nostras los 6 primeros registros.
Usando la notación @data
para acceder a la tabla de atributos:
Usando la notación @data
para acceder a la primera variable:
Accediendo directamente a las variables:
R
Podemos generar directamente en R nuestro objeto de puntos, como ejemplo utilizo los 3 primeros puntos del objeto municipios
, para ello:
x <- c( 651565, 653394, 657330 )
y <- c( 4216041, 4216431, 4213519 )
coordenadas <- cbind( x, y )
localidades3 <- SpatialPoints( coordenadas )
Para ver que contiene este elemento, simplemente, lo evaluamos y nos muestra la siguiente información:
localidades3
class : SpatialPoints
features : 3
extent : 651565, 657330, 4213519, 4216431 (xmin, xmax, ymin, ymax)
crs : NA
En este caso solamente es un Spatial points
, es decir, puntos con coordenadas pero sin variables asociadas y, efectivamente, son 3 puntos, sin sistema de referencia asociado porque no se lo hemos indicado.
Para añadir las variables generaríamos los vectores que luego uniríamos en un objeto data.frame
.
Empezamos por un identificador, ID
, y después otras variables.
ID <- c(1:3)
comarca <- c("Vega del Segura",
"Vega del Segura",
"Área metropolitana de Murcia")
cod_comarca <- c("3", "3", "8")
Nombre <- c("Ceutí",
"Lorquí",
"Molina de Segura")
variables <-data.frame( cbind( ID,
comarca,
cod_comarca,
Nombre) )
variables
ID comarca cod_comarca Nombre
1 1 Vega del Segura 3 Ceutí
2 2 Vega del Segura 3 Lorquí
3 3 Área metropolitana de Murcia 8 Molina de Segura
Finalmente, unimos las coordenadas a la tabla de atributos, obteniendo el objeto tipo Spatial Points Data Frame, datos espaciales tipo punto con sus variables asociadas en una tabla. El nombre del objeto localidades3d
tiene como objetivo que ahora tenemos \(x\), \(y\) y \(z\), actuando como esta última: cualquiera de la tabla.
localidades3d <- SpatialPointsDataFrame( coordenadas,
variables)
localidades3d
class : SpatialPointsDataFrame
features : 3
extent : 651565, 657330, 4213519, 4216431 (xmin, xmax, ymin, ymax)
crs : NA
variables : 4
names : ID, comarca, cod_comarca, Nombre
min values : 1, Área metropolitana de Murcia, 3, Ceutí
max values : 3, Vega del Segura, 8, Molina de Segura
Y para representarlo gráficamente simplemente utilizamos la función plot
.
Para asegurarnos, vamos a representarlos juntos:
par( mfrow = c( 1, 2 ), cex = 0.75 )
plot(localidades,
main = "localidades3",
axes= TRUE)
plot( localidades3,
col = "orange",
pch = 20,
add = TRUE)
plot(localidades,
main = "localidades3d",
axes= TRUE)
plot( localidades3d,
col = "green",
pch = 20,
add = TRUE)
Seguro que has detectado que el CRS tanto de localidades3
como de localidades3d
aparece como NA
, sin dato; más adelante os explicaremos como generarlo.
Ahora la manera más rápida de darle el valor correspondiente, es usando la proyección del objeto localidades
. Sabemos que tienen la misma proyección, ya que las coordenadas que hemos utilizado son las mismas y por tanto están en el mismo sistema de referencia.
localidades3@proj4string <- localidades@proj4string
localidades3
class : SpatialPoints
features : 3
extent : 651565, 657330, 4213519, 4216431 (xmin, xmax, ymin, ymax)
crs : +proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs
localidades3d@proj4string <- localidades@proj4string
localidades3d
class : SpatialPointsDataFrame
features : 3
extent : 651565, 657330, 4213519, 4216431 (xmin, xmax, ymin, ymax)
crs : +proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs
variables : 4
names : ID, comarca, cod_comarca, Nombre
min values : 1, Área metropolitana de Murcia, 3, Ceutí
max values : 3, Vega del Segura, 8, Molina de Segura
La geometría de las líneas es un poco más compleja. Se refiere a un conjunto de una o más polilíneas (series conectadas de segmentos de línea). Por ejemplo, en el análisis espacial, un río y todos sus afluentes podrían considerarse como una sola “línea”, pero también podrían ser varias líneas.
Las líneas se representan como conjuntos ordenados de coordenadas (nodos) conectados en orden por segmentos.
Como en el caso de los puntos, generalmente tendremos preparada de antemano la capa con la información vectorial y únicamente la cargaremos para realizar los diferentes análisis. Aunque, también, se podría generar en R
, lo mas usual si no se dispone, de ella, es proceder a digitalizarla o vectorizarla. Es decir, entraríamos en la producción de mapas en formato digital, a partir de imágenes y fotografías aéreas de manera manual o, a la antigua usanza, con tabletas de digitalización. Para este proceso se utilizan otros programas específicos de SIG como QGIS o GRASS.
Como en el vectorial de puntos podemos representarlo y acceder a sus contenidos, la única diferencia con las capas de puntos es el acceso a las coordenadas que forman las líneas, en este documento solamente veremos los más generales, usando como ejemplo el objeto vias
:
Información sobre el objeto:
vias
class : SpatialLinesDataFrame
features : 4
extent : 638279.3, 657277.3, 4203633, 4243987 (xmin, xmax, ymin, ymax)
crs : +proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs
variables : 4
names : id, nombre, Longitudm, cod_via
min values : 1, Autovía, 7779.92, 1
max values : 5, Línea ferrocarril, 42256.56, 3
Visualización del objeto:
Otra información sobre el objeto:
!Ojo¡ @lines
guarda las coordenadas de los nodos de las líneas.
```r
vias@data
vias@lines
vias@bbox
vias@proj4string
```
Para representar las líneas podemos incluir como información adicional por color o tipo en ellas el valor de alguno de los atributos.
par( mfrow = c( 1, 3 ), cex = 0.75 )
plot( vias, col = vias$id,
axes = TRUE)
plot( vias,
lty = as.integer( vias$cod_via ),
axes = TRUE)
plot( vias,
col = vias$id,
lty = as.integer( vias$cod_via ),
axes = TRUE)
Cuestionario de autoevaluación
- Si te animas a comprobar tus logros responde a las cuestiones del apartado Capa de líneas.
Un polígono se define como un conjunto de polilíneas cerradas. La geometría es muy similar a la de las líneas, pero para cerrar un polígono el último par de coordenadas coincide con el primer par. Una complicación con los polígonos es que pueden tener agujeros o regiones internas de otra naturaleza, por ejemplo una isla dentro de un lago. También es posible que varios polígonos aislados entre ellos, formen un único objeto. Por ejemplo, desde ciertos puntos de vista, las Canarias, es posible que cada isla se presente como un polígono pero son un conjunto y se trata como un único elemento en la tabla.
Además, los polígonos son válidos si no presentan intersecciones, es decir, ninguno corta o se superpone a los vecinos. Y como en el caso de las capas vectoriales de líneas necesitamos que la información esté ya digitalizada previamente, de lo contrario hay que recurrir a programas específicos.
Vemos, muy por encima, un ejemplo con una capa llamada municipios
. Como en el vectorial de puntos también podemos representarlo y acceder a sus contenidos, y al igual que en una capa de líneas difiere de la de punto en el acceso a las coordenadas, la de polígonos presenta su propia manera de acceder a los polígonos. En el objeto tenemos un nuevo contenido: el orden de los polígonos. Veamos los elementos más generales.
municipios
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 : 6
names : ID, NOMBRE, POB2015, COD_COMARC, COMARCA, SUPERFKM2
min values : 11, Abarán, 11227, 3, Area metropolitana de Murcia, 10.27
max values : 9, Villanueva del Río Segura, 9544, 8, Vega del Segura, 169.47
Vemos que el objeto es de la clase Spatial Polygons Data Frame, 14 polígonos, ojo al comentario anterior sobre los grupos de ellos, 6 variables, …
Para acceder directamente a la información recurrimos, prácticamente, a los mismos procedimientos que en los casos anteriores.
!Ojo¡ @polygons
guarda las coordenadas para generar los polígonos. Y tenemos una nueva información, el ordne de los polígonos que se guarda en @plotOrder
print( municipios )
municipios@data
municipios@polygons
municipios@plotOrder
municipios@bbox
municipios@proj4string
Gráficamente como en el caso de las líneas podemos recurrir a la tabla de atributos para obtener gráficos relevantes para nuestro trabajo, a modo de ejemplo:
par( mfrow = c( 1, 3 ), cex = 0.75 )
plot( municipios,
axes = TRUE)
plot( municipios,
col = rainbow( 60 )[ municipios$ID ],
axes = TRUE)
plot( municipios,
col = grey.colors( 60 )[municipios$ID ],
border = "white",
axes = TRUE)
points( localidades, pch = 20, col = "yellow" )
Seguro que puedes ver el trazado del río Segura ^__^
.
Cuestionario de autoevaluación
- Si te animas a comprobar tus logros responde a las cuestiones del apartado Capa de polígonos.