Identificar los municipios costeros y limítrofes de España con R.

27 Abr

Otro ejercicio con spatial data R Rstats y data sciense para el trabajo con objetos espaciales en el ecosistema big data. Empiezo con frase ilógica y ridícula para mejorar las búsquedas de Google pero el tema que traigo hoy creo que puede ser útil para aquellos que, dado un spatial data, tienen que identificar los polígonos que bordean ese objeto, en este caso vamos a identificar los municipios que bordean España, pueden ser limítrofes con Francia y Portugal o bien municipios costeros. No se plantean algoritmos complicados, como en entradas anteriores nos centramos en la extracción de mapas de GADM:

Obtención de los mapas necesarios

library(maptools)
library(raster)
library(maps)
library(tidyverse)
library(sqldf)

Espania <- getData('GADM', country='Spain', level=0)
Espania$name = Espania$NAME_1
Espania2 <- getData('GADM', country='Spain', level=4)
Espania2$name = Espania$NAME_1

Por un lado obtenemos el mapa de España sin división territorial que en GADM es el nivel 0 y por otro lado el municipal que es nivel 4. Un tipo brillante sería capaz de encontrar un algoritmo que identificara que polígonos no tienen adyacencia, pero un tipo mediocre pensaría "si cruzo el borde con los municipios, los objetos que crucen son el exterior"

Municipios del contorno

contorno <- map_data(Espania) %>% mutate(lat2=round(lat,1), long2=round(long,1)) %>% select(long2,lat2) 

municipios <- map_data(Espania2) %>% mutate(lat2=round(lat,1), long2=round(long,1))  %>% select(long2,lat2,region) 

contorno <- inner_join(municipios, contorno) 

En este punto hay aspectos claramente mejorables, el cruce se realiza por latitud y longitud,

dificilmente encajarán al decimal los dos objetos espaciales así que se opta por redondear a un decimal tanto la longitud como la latitud, y esto provoca, como os podéis imaginar, duplicados y un objeto con un tamaño que tiembla el misterio. Por ello es necesario seleccionar registros únicos por longitud, latitud y el campo region que es el que nos identifica el municipio:

contorno <- sqldf("select distinct * from contorno")

contorno2 <- contorno %>% group_by(region) %>% filter(row_number()==n()) %>% mutate(exterior=1) %>%
  as_tibble() %>% select(region,exterior)

Lo pongo en dos objetos para que lo veáis mejor y una advertencia sobre este paso, tarda unos minutos porque elimina duplicados de un "quasi-producto-cartesiano". Pero resulta que contorno2 tiene los municipios que bordean el objeto España:

municipios <- map_data(Espania2)
municipios <- left_join(municipios,contorno2)

ggplot(data = municipios, aes(x = long, y = lat, group = group)) +
  geom_polygon(aes(fill = exterior)) +
  scale_fill_continuous(low="white",high="red")

Y así tenéis el mapa resultante. Con poco talento podréis obtener los municipios limítrofes con Francia y los municipios limítrofes con Portugal. Otro día lo pondré, estoy reduciendo los tiempos de lectura del blog y no debo venirme arriba. Saludos.

6 respuestas a «Identificar los municipios costeros y limítrofes de España con R.»

  1. Buenas tardes, estoy intentando aplicar el código que propones arriba. En mi muy pequeño conocimiento de R, no consigo resolver los errores que obtengo:

    Error in map_data(Espania) : could not find function «map_data»;
    contorno % mutate(lat2=round(lat,1), long2=round(long,1)) %>% select(long2,lat2)
    Error in map_data(Espania) %>% mutate(lat2 = round(lat, 1), long2 = round(long, :
    could not find function «%>%»

    ¿Qué estoy haciendo mal?
    ¿Y habría algún modo de resolver esto con SAS?, aquí me muevo algo mejor. Mi idea sería disponer de una tabla en la que para cada municipio se pudiese clasificar en 1=pertenece a zona costa, 0= otro caso.

    Muchas gracias de antemano por tu ayuda. Un saludo

    • Hola, tienes que tener instalados los paquetes necesarios. Con la instrucción intall.packages(««) podrás instalarte todos los necesarios, todos los que te aparecen el las instrucciones library

  2. Muchas gracias!! Finalmente, conseguí el resultado. Sin embargo, sigo intentando trasladarlo a SAS e intentar conseguir el listado.

Deja una respuesta

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