[1.] Datos geográficos

1.1. ¿Qué es GIS?

Un Sistema de Información Geográfico (GIS por sus siglas en inglés), es un sistema (software + hardware) que permite gestionar y analizar la información capturada en el entorno físico.

Ver código de R aquí

1.2. Modelos de datos geográficos

1.2.1. Datos vectoriales:

La geometría de este tipo de datos se compone de uno o más vértices interconectados. Un vértice describe una posición en el espacio utilizando un eje X y un eje Y (opcionalmente también un eje z). Mas información aquí.

1.2.2. Datos raster:

Un conjunto de datos ráster está compuesto por una matriz de píxeles (también conocidos como celdas). Cada píxel representa una región geográfica, y el valor del píxel representa alguna característica de la región. Mas información aquí.

1.3. Geometrías para datos vectoriales

Tomado de: Applied Spatial Data Analysis with R
Punto: está compuesto de un solo vértice. Línea o arco: está compuesto de dos o más vértices, pero el primer y el último vértice deben ser diferentes. Polígono: está compuesto de tres o más vértices, pero el último vértice es igual a la primero.

1.4. Extensiones de los archivos

Nombre Extensión Tipo
ESRI Shapefile .shp (archivo principal) Vector
GeoJSON .geojson Vector
KML .kml Vector
GPX .gpx Vector
GeoTIFF .tif/.tiff Raster
Arc ASCII .asc Raster
R-raster .gri,.grd Raster
SQLite/SpatiaLite .sqlite Vector y raster
ESRI FileGDB .gdb Vector y raster
GeoPackage .gpkg Vector y raster

Nota: Además del archivo .shp (que almacena la geometría del objeto), el ESRI Shapefile debe contener un archivo .shx (almacena el índice de la geometría), un archivo .dbf (dataframe con los atributos) y un archivo .prj (contiene información del CRS).

[2.] Sistemas de Referencia de Coordenadas - CRS

Todo objeto espacial está asociado a un CRS (Coordinate Reference Systems). El CRS proporciona una referencia espacial estandarizada de un objeto. El CRS puedes ser Sistema de Coordenadas Geográficas o un Sistema de Coordenadas Proyectadas.

2.1. Sistema de Coordenadas Geográficas - SCG

En este SCG las ubicaciones se miden en unidades angulares desde el centro de la tierra en relación con dos planos (uno definido en el ecuador y otro definido en el primer meridiano). En este sentido una ubicación se define como la combinación entre un valor de latitud (-90:90) y un valor de longitud (-180:180).

2.2. Sistema de Coordenadas Proyectadas - SCP

Es un sistema de referencia de coordenadas bidimensional, se define normalmente mediante dos ejes. Ubicados en ángulo recto uno respecto al otro, formando el denominado plano XY (como en un plano cartesiano). Existen por lo menos 3 familias de Sistemas de Coordenadas Proyectadas, Plana (a), Cónica (b) o Cilíndrica (c).

Tomado de: https://docs.qgis.org

Por ejemplo, los CRS geográficos y los CRS proyectados están expresados en unidades diferentes. El mapa de la izquierda tiene un CRS que está representado en grados decimales, mientras que la unidad de medida del mapa de la derecha es metros.

Ver código de R aquí

Sim embargo, dentro de los CRS geográficos/proyectadas pueden existir puntos de origen diferentes. El mapa de la derecha usa un CRS con EPSG NAD83 y tiene las unidades de medida en metros, el de la derecha también tiene unidades de medidas de metros, pero usa una CRS Azimuthal que está centrada en Tegucigalpa (coordenadas lon_0=-87 y lat_0=14):

Ver código de R aquí

2.3. Código EPSG

Todas las CRS cuentan con un código de la European Petroleum Survey Group (EPSG), el cual almacena los parámetros geodésicos con códigos estándar. Puede encontrar otras referencias de EPSG aquí

[3.] R-espacial

Aquí puede acceder a los repositorios de GitHub con las librerías de r-spatial.

3.1. Popularidad de R-espacial

Ver código de R aquí

3.2. Librería sf

Fue escrita por Edzer Pebesma y Roger Bivand quienes también la librería sp (la versión anterior de sf).

¿Por qué cambiar a sf si sp ya ha sido probada y probada?

• Lectura y escritura rápida de datos.

• Rendimiento de trazado mejorado.

• Los objetos sf pueden tratarse como dataframes en la mayoría de las operaciones.

• Las funciones de sf se pueden combinar con el operador %>% y trabaja bastante bien con las funciones de la librería tidyverse.

• Los nombres de las funciones sf son relativamente consistentes e intuitivos (todos comienzan con st_).

Documentación:
vignette(package = "sf") # Ver viñetas disponibles
Vignettes in package ‘sf’:

sf1                      1. Simple Features for R (source, html)
sf2                      2. Reading, Writing and Converting Simple
                         Features (source, html)
sf3                      3. Manipulating Simple Feature Geometries
                         (source, html)
sf4                      4. Manipulating Simple Features (source, html)
sf5                      5. Plotting Simple Features (source, html)
sf6                      6. Miscellaneous (source, html)
sf7                      7. Spherical geometry in sf using s2geometry
                         (source, html)

3.3. ¿Qué es un simple feature?

Un simple feature es cualquier objeto en el mundo real, como una calle o un edificio. Un objeto sf posee una geometría (describe lugar de la Tierra en el que se encuentra) y unos atributos (describe otras propiedades del objeto). La geometría de un árbol puede ser el un círculo con el diámetro de su copa o un punto que indica su centro. Las propiedades pueden incluir su altura, color, diámetro, etc.

Tomado de: https://docs.qgis.org

Tipos de geometrías para sf

Un objeto sf puede almacenar por lo menos seis de los siguientes tipos de datos vectoriales:

Objeto sf en R

Por ejemplo, si usted tiene un objeto de clase sf al que le asignó el nombre de spatial_objetc. Puede inspeccionar la clase del objeto así:

class(spatial_objetc)
"sf"         "data.frame"

Y al imprimirlo sobre la consola puede observar que este objeto contiene atributos (columnas DPTO_CCDGO,MPIO_CCDGO,CPOB_CCDGO,NANG_RTCN y CSIMBOL) e información sobre la geometría:

## [4.] Modelo monocéntrico

Para replicar este ejercicio, primero debe descargar el siguiente proyecto de R y abrir el archivo clase-02.Rproj. Ahora puede seguir el script de la clase que está ubicado en: source/clase-02.R

4.1 Configuración inicial

## llamar pacman (contiene la función p_load)
require(pacman)

## llamar y/o instalar librerias
p_load(tidyverse,rio,
       viridis, ## paletas de colores 
       sf, ## datos espaciales
       leaflet, ## visualizaciones
       tmaptools, ## geocodificar
       ggsn, ## map scale bar 
       tidycensus) ## packages with census data

4.2 Bostón y Chicago

Puede obtener la API-key de US Census Bureau Data aquí. Además, puede obtener una documentación de la librería aquí.

census_api_key("YOUR CENSUS API HERE")
## get Median Housing Values Cook county
chicago = get_acs(geography="block group",variables="B25077_001E",state ="IL",county="Cook County",year=2016,geometry=T)

## get Median Housing Values Suffolk County
boston = get_acs(geography="block group",variables="B25077_001E",state ="MA",county="Suffolk County",year=2016,geometry = T)
## clase del objeto
class(chicago)
## [1] "sf"         "data.frame"
## plot data
leaflet(boston) %>% addTiles() %>% addPolygons(color="green",fill=NA,weight=2)
## Warning: sf layer has inconsistent datum (+proj=longlat +datum=NAD83 +no_defs).
## Need '+proj=longlat +datum=WGS84'
## Boston CBD
boston_cbd = geocode_OSM("Carmen Park, Boston", as.sf=T) 

leaflet() %>% addTiles() %>% addCircleMarkers(data=boston_cbd,col="red",weight=3)
## Chicago CBD
chicago_cbd = geocode_OSM("233 S Wacker Dr, Chicago, IL 60606, Estados Unidos", as.sf=T) ## Willis Tower

leaflet() %>% addTiles() %>% addCircleMarkers(data=chicago_cbd,col="red",weight=3)
## create distances Boston
boston_cbd = boston_cbd %>% st_transform(st_crs(boston)) ## change CRS

boston$dist_CBD = st_distance(boston,boston_cbd) 

boston$dist_CBD = as.numeric(boston$dist_CBD)*0.000621371

## create distances Chicago
chicago_cbd = chicago_cbd %>% st_transform(st_crs(chicago)) ## change CRS

chicago$dist_CBD = st_distance(chicago,chicago_cbd) 

chicago$dist_CBD = as.numeric(chicago$dist_CBD)*0.000621371

## prepare data
boston$City="Boston" ## create name city

chicago$City="Chicago" ## create name city

chicago=chicago %>% filter(dist_CBD<=10) ## keep block groups in Cook County that are within 10 miles of the city center
st_geometry(chicago) = NULL
st_geometry(boston) = NULL

dta = rbind(chicago,boston) # stack data
## scaterplot
ggplot(dta, aes(x=dist_CBD, y=estimate, color=City)) +
geom_point(shape=1) + geom_smooth(method="lm") + xlab("Distance to CBD (miles)") +
ylab("Median Housing Prices ($)") + theme_test()
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 288 rows containing non-finite values (`stat_smooth()`).
## Warning: Removed 288 rows containing missing values (`geom_point()`).

4.3 Bogotá

## leer conjutno de datos
bog  <- import("input/block_median_housing_value_bog.rds")
## ggplot + mapping
p = ggplot(data=bog) + geom_sf(mapping = aes(fill=q_price) , size=0.3 , col=NA)  +
    scale_fill_manual(values=c("yellow","#FF9900","#FF6600","#CC0000","#990000"),
                      name="Valor mediano\n del metro cuadrado") 

## add theme and labels
p = p + theme_bw() + labs(x="",y="")

## add scalebar and north symbol
p = p + north(data=bog , location="topleft") + 
    scalebar(data=bog , dist=5 , dist_unit="km" , transform=T , model="WGS84")
p

## plot 
ggplot(bog, aes(x=dist_CBD/1000, y=price_surface_median/1000000)) +
geom_point(shape=1) + geom_smooth(method="lm") + 
theme_bw() + labs(x="Distancía al centro de negocios de la ciudad (kilómetros)",
                  y="Valor mediano del metro cuadrado (millones)") 
## `geom_smooth()` using formula = 'y ~ x'