Representar polígonos de Voronoi dentro de un polígono

29 Nov

No es la primera vez que traigo al blog la realización de polígonos de Voronoi pero hoy la entrada está más orientada a la representación gráfica con #rstats y ggplot. En este caso deseamos crear polígonos de Voronoi en función del centro geográfico de las provincias españolas.

Origen de los datos

El pasado 25 de noviembre el Grupo de Usuarios de R de Madrid trajo la presentación de @dieghernan sobre la creación de mapas con la librería mapSpain que será la que nos permita crear mapas de españa a distintos niveles, entre ellos mapas a nivel provincial mediante un código en R que no puede ser más sencillo:

library(tidyverse)
library(mapSpain)
library(sf)

PROVINCIAS.sf <- esp_get_prov()
ggplot() + geom_sf(data=PROVINCIAS.sf, fill='grey80', color='blue')

Bajo el punto de vista del ahora escribiente el mejor y más sencillo mapa estático de España. La función esp_get_prov y dos líneas de código. Tenéis revisiones en el blog sobre ejemplos de uso.

Obtención de los centroides

Todo pivota sobre la función st_centroid del paquete sf

centroides <- st_coordinates(st_centroid(PROVINCIAS.sf$geometry))
centroides <- data.frame(centroides)

ggplot(centroides, aes(X, Y)) + geom_point()

Cada punto marca el centro geográfico de cada provincia de España.

Polígonos de Voronoi con sf

Aplicamos st_voronoi de sf para obtener los polígonos, destacar la necesidad de unir cada polígono generado para crear un objeto sf con st_union, sin ello no funciona.

voronoi <- st_voronoi(st_union(st_centroid(PROVINCIAS.sf$geometry)))
ggplot() + geom_sf(data=voronoi, fill='grey80', color='blue') 

Lo que sucede es que nos ha generado la división en póligonos de Voronoi en base al espacio que han creado las coordenadas geográficas y necesitamos que esas divisiones estén dentro del territorio de España.

Los polígonos dentro del polígono

A continuación la motivación de la entrada. Acotamos esa representación gráfica a la geografía de España, el código en R no se complica mucho.

ESPANIA.sf <- esp_get_country() 
# ggplot() + geom_sf(data=ESPANIA.sf, fill='grey80', color='blue') 

ggplot() + geom_sf(data= st_intersection(st_cast(voronoi), st_union(ESPANIA.sf)), fill='grey80', color='blue')

Ahora ya tenemos un mapa que se parece mucho a lo que deseamos, es claramente mejorable. La función de sf st_intersection hace que «crucemos» el objeto Voronoi con el objeto ESPANIA.sf y solo se representarán aquellos que estén dentro del polígono que intersecan ambos objetos. Por supuesto, esta es la represntación gráfica, pero disponéis de polígonos con los que podréis hacer algún que otro análisis espacial.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *