GIS y R Parte 3: emparejamiento y guardado de objetos espaciales en R
- Jans
- 14 ene 2018
- 3 Min. de lectura
En este conjunto de entradas vamos a cubrir lo básico al momento de leer y manipular archivos del tipo ESRI shapefile en R. R tiene algunas librerías muy útiles para trabajar con datos espaciales. En esta entrada utilizaremos la librería denominada rgdal. La documentación de la librería la puedes encontrar en el siguiente link.
En esta Parte II se mostrará cómo transformar la tabla de atributos de un shapefile en objeto de R para trabajarlo como una base de datos (es decir, sin propiedades geométricas), cómo hacer un emparejamiento y como guardar el shapefile resultante.
R, al ser un software prominentemente estadístico, está orientado a realizar este tipo de análisis con los objetos que cargamos en su ambiente de trabajo. Como vimos en las Partes 1 y 2, un shapefile es un objeto de objetos (como una lista) de tipo Spatial Polygon Data Frame. Para crear un objeto manipulable con todos los atributos de la tabla de atributos del shapefile inicial, ejecutamos:
# creamos un objeto con los atributos del shapefile inicial
> aman.df <- aman@data
> dis.df <- dis@data
# tipo de objeto
> class(dis.df)
[1] "data.frame"
# nombres de las columnas de aman.df
> names(aman.df)
DPA_SECTOR DPA_VALOR DPA_ANIO DPA_ZONA FUENTE Shape_Leng Shape_Le_1
# frecuencia de los valores del campo FUENTE
> table(aman.df$FUENTE)
BASE MAP BING GOOGLE EARTH IEE M_IGM ORTOFOTO SIN AJUSTE
13 140 264 99 418 22689 1117
# histograma del campo Shape_Leng
> hist(aman.df$Shape_Leng)

Como podemos observar, el objeto aman.df puede manipularse como cualquier base de datos en R. Dependiendo del análisis a realizar podemos decidir entre procesar directamente sobre el shapefile cargado (aman o dis), o separar sus atributos y procesarlos separadamente (aman.df y dis.df). La diferencia radica en los atributos geométricos, los cuales se pueden ver afectados si no realizamos nuestro trabajo apropiadamente.
Emparejamiento de una base da datos con un objeto espacial
A continuación, realizaremos un emparejamiento entre el shapefile y una base que contiene atributos adicionales de nuestro interés. Esta base, llamada dpa_zdc, contiene la codificación de Zona, Distrito y Circuito, la cual es una división del territorio ecuatoriano con fines de ordenamiento interno y planificación. Para tal fin, ejecutamos:
# leemos el archivo de correspondencia
> dpa_zdc <- read.xlsx("./bases/DPA_ZDC.xlsx",
sheetIndex=1,
as.data.frame=T)
# nombres y primeras filas del objeto dpa_zdc
> head(dpa_zdc)
IDENTIF ZONADC DISTRITO CIRCUITO
1 010150001001 6 01D02 01D02C08
2 010150001002 6 01D02 01D02C08
3 010150001003 6 01D02 01D02C08
4 010150001004 6 01D02 01D02C08
5 010150001005 6 01D02 01D02C08
6 010150001006 6 01D02 01D02C08
#cambiamos los nombres de dpa_zdc a todo minúscula
> colnames(dpa_zdc) <- tolower(colnames(dpa_zdc))
# emparejamiento de la base de datos dpa_zdc con aman.df y dis.df
> aman.df <- merge(aman.df, dpa_zdc,
by.x="DPA_SECTOR",
by.y="identif",
all.x=TRUE)
> dis.df <- merge(dis.df, dpa_zdc,
by.x="DPA_SECDIS",
by.y="identif",
all.x=TRUE)
Con la función merge logramos emparejar los atributos de las dos bases de datos, fijando los siguientes argumentos:
primeros dos argumentos: son las bases a emparejar (por ejemplo, aman.df y dpa_zdc).
by.x: el identificador único o clave de la primera base a emparejar (base izquierda o base.x).
by.y: el identificador único o clave de la segunda base a emparejar (base derecha o base.y).
all.x: la base final solamente contendra los casos iniciales correspondientes a la base izquierda o base.x (en nuestro ejemplo son las bases aman.df y dis.df).
# campos de la nueva base aman.df
> names(aman.df)
[1] "DPA_SECTOR" "DPA_VALOR" "DPA_ANIO" "DPA_ZONA" "FUENTE" "Shape_Leng"
[7] "Shape_Le_1" "Shape_Area" "CIUDAD" "zonadc" "distrito" "circuito"
#seleccionamos los campos de interés a emparejar en el shapefile
> aman.df <- aman.df[ ,c("DPA_SECTOR", "zonadc", "distrito", "circuito")]
> dis.df <- dis.df[, c("DPA_SECDIS", "zonadc", "distrito", "circuito")]
# emparejamiento de la base trabajada con los shapefiles
> aman <- merge(aman, aman.df,
by.x="DPA_SECTOR",
by.y="DPA_SECTOR",
all.x=TRUE,
> dis <- merge(dis, dis.df,
by.x="DPA_SECDIS",
by.y="DPA_SECDIS",
all.x=TRUE)
Guardar un objeto espacial en formato ESRI Shapefile
Terminado nuestro procesamieto, si queremos guardar nuestro objeto espacial, ejecutamos:
# escritura del nuevo shapefile
> dsn1 <- setwd("ruta_de_salida_de_los_objetos_espaciales/shapes_nuevos")
> writeOGR(aman,
dsn1,
"aman_dpa_zdc",
driver="ESRI Shapefile",
overwrite_layer=TRUE)
> writeOGR(dis,
dsn1,
"dis_dpa_zdc",
driver="ESRI Shapefile",
overwrite_layer=TRUE)
Mendiante la función writeORG definimos:
aman o dis: el objeto espacial a guardar
dsn1: ruta donde se guardarán los nuevos archivos.
aman_dpa_zdc: nombre del shp nuevo.
driver: el controlador de salida a utilizar, en otras palabras el formato con el que queremos guardar nuestro objeto espacial.
overwrite_layer: si existe un shp con el msimo nombre, sobreescribimos o no?
Con esto terminamos nuestra serie de entradas. Espero que hayan sido de su agrado.
Comments