Este trabajo forma parte del módulo Estadística Espacial en el posgrado en Big Data e Inteligencia Territorial de FLACSO Argentina a cargo de Priscilla Minotti.
Se abordará un data set sobre puntos de elevación (originalmente medidos en pies pero convertidos a metros) de edificios en la ciudad de Nueva York con distintos métodos de interpolación espacial.
Los datos originales están disponibles acá mientras que la muestra con la que trabajamos junto con el proyecto del trabajo acá.
Cargamos los paquetes que vamos a utilizar:
library(gstat)
library(tidyverse)
library(sf)
library(sp)
library(rgdal)
library(raster)
library(osmdata)
library(leaflet)
library(tmap)
Ahora vamos a explicar paso por paso cómo es el procedimiento desde la carga de datos al procesamiento, las visualizaciones, los métodos de interpolación en sí y los resultados.
Cargamos el data set con la muestra de los puntos de elevación que vamos a usar para interpolar.
elevaciones <- st_read("elevaciones_NY_muestra.shp") %>%
st_as_sf()
## Reading layer `elevaciones_NY_muestra' from data source `/Users/usernamemateo/Library/Mobile Documents/com~apple~CloudDocs/R/geostat/elevaciones_NY_muestra.shp' using driver `ESRI Shapefile'
## Simple feature collection with 10849 features and 2 fields
## Geometry type: POINT
## Dimension: XY
## Bounding box: xmin: 913410.9 ymin: 121129.2 xmax: 1067130 ymax: 271166.4
## Projected CRS: NAD83 / New York Long Island (ftUS)
Para entender mejor los puntos de elevación vamos a usar summary()
summary(elevaciones$elevacion)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 3.682 14.914 22.315 25.085 31.188 430.803
Como vemos, el punto más de medición de altura de edificios mas bajo está elevado a 3.68 metros, en promedio la altura de los edificios es de 25.085 metros y la mediana es 22.315 metros. La altura máxima es de algo más de 430 metros.
Para entender mejor los datos vamos a graficar los puntos de elevación ubicados en el mapa. Para eso vamos a usar tmap. Lo configuramos.
tmap_mode("view")
Y ahora, graficamos los puntos con el mapa base:
qtm(elevaciones, scale = 0.5)
Ahora vamos a ver específicamente cómo de distribuyen los puntos de elevación de nuestro data set y cual es su altura:
ggplot() +
geom_sf(data = elevaciones, aes(color = elevacion), size = 0.5) +
ggtitle("Puntos de elevación: edificios en la ciudad de Nueva York") +
scale_color_viridis_c(name = "Altura (mts)", direction = -1, option = "magma") +
theme_dark()
Como podemos observar, en nuestro dataset hay unos pocos edificios con altura mayor a 300 metros. La mayoría los edificios tienen alturas menores de 150 metros.
En este apartado vamos a ver tres métodos para definir el área de trabajo o de interés (AOI) que nos resulta útil para definir el área de análisis espacial a partir de nuestros datos.
Bounding box (o simplemente bbox) es un área definida por dos latitudes y dos longitudes.En este caso, usamos bbox que nos sirve para setear los límites (en forma de caja).
elevaciones_bbox <- st_as_sfc(st_bbox(elevaciones))
Cuando usamos la función st_buffer(), ésta nos devuelve una geometría que representa todos los puntos cuya distancia es menor o igual a la distancia indicada. En este caso vamos a usar como distancia 2000 metros para crear un polígono usable para interpolar.
elevaciones_buffer <- elevaciones %>%
st_buffer(dist= 2000) %>%
st_geometry() %>%
st_simplify() %>%
st_union()
elevaciones_buffer
## Geometry set for 1 feature
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 911410.9 ymin: 119129.2 xmax: 1069130 ymax: 273166.4
## Projected CRS: NAD83 / New York Long Island (ftUS)
## MULTIPOLYGON (((919078.2 120248, 919065.4 12022...
Convex hull es el polígono convexo más pequeño que incluye a todos los puntos incluidos en un data set. Vamos a calcular el polígono máximo convexo de nuestros puntos de elevación:
elevaciones_convex_hull <- elevaciones %>% st_union()%>% st_convex_hull()
elevaciones_convex_hull
## Geometry set for 1 feature
## Geometry type: POLYGON
## Dimension: XY
## Bounding box: xmin: 913410.9 ymin: 121129.2 xmax: 1067130 ymax: 271166.4
## Projected CRS: NAD83 / New York Long Island (ftUS)
## POLYGON ((917283.4 121129.2, 916440.4 121295.2,...
Cargamos un shapefile con los límiter políticos y administrativos de la ciudad (sin agua). Los límites están disponibles acá.
elevaciones_limites <- st_read("nybb.shp") %>%
st_geometry() %>%
st_simplify() %>%
st_union()
## Reading layer `nybb' from data source `/Users/usernamemateo/Library/Mobile Documents/com~apple~CloudDocs/R/geostat/nybb.shp' using driver `ESRI Shapefile'
## Simple feature collection with 5 features and 4 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 913175.1 ymin: 120121.9 xmax: 1067383 ymax: 272844.3
## Projected CRS: NAD83 / New York Long Island (ftUS)
Ahora vamos a ver cada tipo de límite en el mapa con los puntos de elevación:
qtm(elevaciones, scale = 0.5, title = "Límites de la ciudad en el mapa") +
#en rojo los bordes de la bounding box
qtm(elevaciones_bbox, fill = NULL, borders="red") +
#en azul los bordes de buffer
qtm(elevaciones_buffer, fill = NULL, borders = "blue") +
#en verde los bordes del poligono convexo
qtm(elevaciones_convex_hull, fill = NULL, borders = "green") +
#en negro los bordes de los límites políticos y administrativos
qtm(elevaciones_limites, fill = NULL, borders = "black")
De ahora en adelante vamos a trabajar con los límites políticos y administrativos.
Vamos a desarrollar tres métodos de interpolación: Polígonos de Voronoi o Thiessen, Distancia Inversa Ponderada (de ahora en más IDW) y Kriging.
Los puntos de elevación conocidos son utilizados como puntos generadores para dividir nuestra área de interés en tantos polígonos o teselas como puntos conocidos. El espacio interno de estos polígonos contiene todos los puntos cuya distancia al punto generador es menor que la distancia a cualquier otro punto externo. La división es a través de bisectores perpendiculares (líneas) que se forman al calcular las distancias entre puntos.
voronoi <- elevaciones %>%
st_geometry() %>%
st_union() %>%
st_voronoi() %>%
st_collection_extract()%>%
st_sfc(crs = st_crs(elevaciones)) %>%
st_sf() %>%
st_join(elevaciones) %>%
st_intersection(elevaciones_limites)
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
Graficamos:
qtm(voronoi, fill = "elevacion", fill.palette = "-viridis", borders = "black", scale = 0.1, title = "Polígonos de Voronoi: altura de edificios en Nueva York")