Siempre me ha gustado el tema de los Sistemas de información geográfica y derivados. Ya cuando trabajaba en el IESA fui a un curso en Vigo sobre gvSIG y luego aprendí cosas con QGIS , el cual me sigue pareciendo un software más que excelente.
Hoy en día se pueden hacer muchísimas cosas con Python y con R, incluso tienen conectores con librerías de javascript para hacer cosas resultonas y con interactividad, veáse esto por ejemplo. En realidad tanto python como R tiran de las mismas librerías de bajo nivel, a saber, gdal, libproj, libgeos y similares, las cuales, para ser honestos, pueden meterte en un infierno de dependencias en según qué sistemas unix. Eso sí, una vez sales de ahí es una gozada.
Total, el caso es que el pasado jueves me llega una duda del gran Leonardo Hansa, que reproduzco a continuación.
Vicepresi, tú sabes cómo se puede saber si dos códigos postales son adyancentes? Con datos, claro, no a ojo
Y bueno, como no tenía mucho más que hacer esa tarde y soy un picado de la vida, pues me dije.
Creo que tengo un shapefile de códigos postales de 2019 que no recuerdo como llegó a mis manos, quizá pueda hacer algo.
Y me puse manos a la obra a investigar a ver cómo se podría hacer eso de encontrar polígonos adyacentes a uno dado usando Rstats. El caso es que llegué a varios hilos dónde se comentaban diferentes formas, una era usando la función poly2nb de la librería spdep y también cómo hacerlo usando la función st_intersects de la librería sf . En este issue incluso comentaban los grandes de estas cosas, Edzer Pebesma , Roger Bivand y nuestro conocico Virgilio Gómez Rubio.
Para encontrar los polígonos adyacentes uso st_intersects que permite por ejemplo saber qué puntos están dentro de un polígono y cosas así. Al aplicarlo sobre una geometría de tipo polígono lo que encuentra son los polígonos adyacentes.
Mostrar / ocultar código
# mido a ver cuánto tarda. tictoc::tic()lista_adyacentes <-st_intersects(mapa)tictoc::toc()#> 2.531 sec elapsed
Ahora si quisiera saber qué polígonos son adyacentes a uno dado, es simplemente seleccionar en lista adyacentes, por ejemplo
plot_cp_vecinos(18814, cps_adyacentes, mapa) +labs(title ="CP núcleo principal Cortes de Baza")
Mostrar / ocultar código
# plaza cascorroplot_cp_vecinos(28005, cps_adyacentes, mapa) +labs(title ="cp Plaza Cascorro")
Mostrar / ocultar código
# Pongo Carmona por ser el de mayor área (get_mis_vecinos(41410, cps_adyacentes))#> [1] 41620 41300 41449 41339 41420 41359 41610 41600 41320 41309 41520 41429#> [13] 41410 41510 41310 41016 41500 41440plot_cp_vecinos(41410, cps_adyacentes, mapa) +labs(title="Carmona")
Notas
Los códigos postales que uso están desactualizados. La capa de shapefile es un producto que vende Correos a precio no barato. Antes se podían descargar de CartoCiudad, pero ya no. Algún enlace interesante: