1.Finalidad

Este “mini” proyecto, se basa en mi propia necesidad de crecer aprendiendo, por lo que está alineado con mi plan de actuación MiPágina; y forma parte de un paso de él.

El siguiente será la integración, adaptación y mejora, de lo visto aquí, con Shiny y con ShinyDasboard (más adelante se verá flexDasboard, pero no en este proyecto).

Y como todo lo relacionado con tecnologías opensource, siempre hay un componente de ayuda y colaboración, y este pequeño proyecto, no podría ser menos, de ahí el código en abierto.

2. Aplicaciones

Ni que decir tiene, que la geolocalización, y georreferenciación, son fundamentales en cualquier sector, pero sobre todo en los correspondientes a:

  • Sector Administraciones Públicas. Posicionamiento de lindes, cálculo de áreas, mapeos estadísticos -socioeconómicos, etc.

  • Sector Primario. Agricultura de precisión, área forestal, cálculo de biomasa. En jardinería también, en grandes ciudades, reduciendo rutas, control espacial del regadio, etc.

  • Sector Energía Renovables. Estudio de la generación de energía distribuida, eligiendo la localización que maximice el emplazamiento, promedio anual de velocidad, Geotérmica (heatmap), etc.

  • etc.

Desde los análisis de delincuencia hasta la vigilancia de enfermedades, pasando por políticas de venta minorista y públicas, etc. Por ello, esta muestra de lo que puede hacerse, aunque son múltiples sus aplicaciones y usos.

3. Descripción:

Queremos conseguir representar datos, dentro de un mapa, que tengan relación con la población, tasa de empleo, etc, por franja de edad, sexo, etc.

Para ello se extraen los datos georreferenciados, mediante la página oficial de la Junta de Andalucía, diferenciando en:

¿Por qué? Para conseguir diferentes visualizaciones y formas de representar datos. Además, en mi caso, como usuario de QGIS o de ArcGis, quería realizar el paso de la integración de mapas, en base a GIS, pero sin usar ninguno. Para ello, sí es necesario manejar toda la georreferenciación asociada, y sus proyecciones, en las respectivas coordenadas, dentro de RStudio.

4.Cargamos los paquetes:

##  [1] "Cargado Correctamente el paquete tidyverse"     
##  [2] "Cargado Correctamente el paquete data.table"    
##  [3] "Cargado Correctamente el paquete sf"            
##  [4] "Cargado Correctamente el paquete leaflet"       
##  [5] "Cargado Correctamente el paquete leaflet.extras"
##  [6] "Cargado Correctamente el paquete htmlwidgets"   
##  [7] "Cargado Correctamente el paquete readxl"        
##  [8] "Cargado Correctamente el paquete knitr"         
##  [9] "Cargado Correctamente el paquete kableExtra"    
## [10] "Cargado Correctamente el paquete stringr"       
## [11] "Cargado Correctamente el paquete xlsx"          
## [12] "Cargado Correctamente el paquete shiny"         
## [13] "Cargado Correctamente el paquete htmltools"     
## [14] "Cargado Correctamente el paquete devtools"      
## [15] "Cargado Correctamente el paquete kableExtra"    
## [16] "Cargado Correctamente el paquete sparkline"
##      tidyverse     data.table             sf        leaflet leaflet.extras 
##           TRUE           TRUE           TRUE           TRUE           TRUE 
##    htmlwidgets         readxl          knitr     kableExtra        stringr 
##           TRUE           TRUE           TRUE           TRUE           TRUE 
##           xlsx          shiny      htmltools       devtools     kableExtra 
##           TRUE           TRUE           TRUE           TRUE           TRUE 
##      sparkline 
##           TRUE

5.Importación de datos

Como comentamos anteriormente, se descargan los formatos “shape”, que nos son necesarios para realizar las proyecciones, en nuestro caso corresponden a polígonos.

Dentro de los 5 formatos que nos dan los archivos georreferenciados, en GIS, existen: “.cpg, .dbf, .prj, .qpj, .shp y .shx”, nos hacen falta los de extensión: “.shp”.

Importante señalar, que para ver correctamente los datos en el mapa, es necesario interactuar con él, es decir, pasar el cursor por el sitio recomendado, escribir la dirección que queremos encontrar dentro del buscador, seleccionar el mapa que queremos ver de fondo, etc.

5.1 Georreferenciados mediante malla

# Formato Malla
sscc_andalucia_mallas<-read_sf("Malla_Estadistica/mep19_250.shp")

El formato obtenido de la: Página Oficial Junta de Andalucia, se basa en una malla de población 250 m x 250 m a 1 de enero de 2019 (mep19_250m), elaborada por el Instituto de Estadística y Cartografía de Andalucía, que permite disponer de información minuciosa y actualizada de la distribución de la población en Andalucía, al margen de las divisiones administrativas.

Se trata de una malla de celdillas habitadas de 250 m x 250 m a las que, mediante georreferenciación, se les ha asignado la población del ámbito que ocupan tomando como referencia el número de residentes inscrito a 1 de enero de 2019 en la Base de Datos Longitudinal de Población de Andalucía.

Siempre y cuando el secreto estadístico no se vea comprometido además del total de población, cada celdilla ofrece información sociodemográfica permitiéndonos conocer la población residente según grandes grupos de edad, nacionalidad, lugar de nacimiento en relación al lugar de residencia, tiempo de residencia, estado de afiliación, percepción de pensiones contributivas de la Seguridad Social, ingresos medianos de cada tipología de pensión y demandantes de empleo del Servicio Andaluz de Empleo.

La página web del Instituto de Estadística y Cartografía de Andalucía ofrece un servicio de visualización: Distribución espacial de la población de Andalucía que permite su consulta interactiva, así como servicios interoperables WMS y WFS, a los que se puede acceder desde este enlace:

http://www.juntadeandalucia.es/institutodeestadisticaycartografia/distribucionpob/index.htm

  • Datos por Grid
# Por Grid
sscc_andalucia_mallas<-st_transform(sscc_andalucia_mallas, crs =4326)
  • Vemos la tabla
# Utilizamos kableExtra
sscc_andalucia_mallas

Nota: Los valores -1, tal y como indica la referencia, son debidos al secreto estadístico

  • Leyenda
# Leyenda
 Leyenda<-read_xls("C:/Users/evely/Documents/R/MapasRaul/Datos_Malla_Estadistica.xls", sheet ="Diseno")

# Modificación
Leyenda<-Leyenda %>%
  select(-TIPO)

# Vemos el significado de todo
Leyenda %>%
  head(20) %>%
  kbl(caption = "Recreating booktabs style table") %>%
  kable_classic(full_width = F, html_font = "Cambria")
Recreating booktabs style table
NOMBRE DESCRIPCIÓN
gidmp Identificador único de la celda de población
grd_fixid Código de celda 250m (INSPIRE)
grd_floaid Código de celda 250m (INSPIRE)
grd_inspir_1k Código de celda 1km (INSPIRE)
municipio Municipio o municipios en los que se encuentra la celda
cmun Código de municipio o municipios en los que se encuentra la celda
csecc Código de sección o secciones censales en los que se encuentra la celda1
pob_tot Población total de la celda
pob_m Población de mujeres.
pob_h Población de hombres.
edad0015 Población menor de 16 años
edad1664 Población con edad entre 16 y 64 años
edad65_ Población mayor de 64 años
esp Población con nacionalidad española
ue15 Población con nacionalidad de algunos de los estados miembros de la Unión Europea con fecha de ingreso anterior a 2004. Se excluye España
mag Población con nacionalidad de alguno de los países del Magreb
ams Población con nacionalidad de alguno de los países de Sudamérica
otr Población con nacionalidad de algún país no incluido en los cuatro campos anteriores
muni Población por lugar de nacimiento en relación al lugar de residencia: mismo municipio1
mund Población por lugar de nacimiento en relación al lugar de residencia: distinto municipio y misma provincia1
  • Menor valor de población:
sscc_andalucia_mallas$POB_TOT[which.min(sscc_andalucia_mallas$POB_TOT)]
## [1] -1
  • Mayor valor de población:
sscc_andalucia_mallas$POB_TOT[which.max(sscc_andalucia_mallas$POB_TOT)]
## [1] 4610
  • Creamos las Etiquetas del mapa:
labels_1 <- sprintf(
  "<strong>%s</strong><br/ >%g=Poblacion Total / %g=Población menor de 16 años/",
  sscc_andalucia_mallas$MUNICIPIO, sscc_andalucia_mallas$POB_TOT, sscc_andalucia_mallas$EDAD0015) %>%
  lapply(htmltools::HTML)
  • Actualmente, existen 3 funciones de color, para la entrada continua de colores:

    • 1.ColorNumeric* Entrada continua, colores continuos
    • 2.ColorBin* Entrada continua, colores discretos
    • 3.ColorQuantile* Entrada continua, colores discretos
    • 4.Y una forma para la entrada categórica, colorFactor.

Para mas información, consultar: Folleto

  • En nuestro caso usaremos ColorBin:
    # Degradado para los colores
    tramos_1 <- c(-1,0, 500,1000,1500,2000,2500,3000,3500,4000,Inf)
    pal_1 <- colorBin("YlGnBu", domain = sscc_andalucia_mallas$POB_TOT, bins = tramos_1)
  • Creamos el Mapa:
# Creación del mennu para cambiar de mapa
l<-leaflet() %>%
    addTiles() %>%
 # Creación del mapa
   setView(lng = -4.42034,lat = 36.72016,zoom = 7) %>% # Centrado en Málaga
   addPolygons(data =sscc_andalucia_mallas,
              color = 'red', 
              weight = 0.1, 
              smoothFactor = 0.5,
              opacity = 1.0, 
              fillColor = pal_1(sscc_andalucia_mallas$POB_TOT),
              fillOpacity = 0.5,
              highlightOptions = highlightOptions(color = 'black',
              weight = 2, bringToFront = TRUE), 
              label = labels_1,
              labelOptions = labelOptions(style = list("font-weight" = "normal",
                                                      padding = "3px 8px"),
              textsize = "15px",
              direction = "auto")) %>% 
  # Leyenda
  addLegend(pal = pal_1, 
            values = sscc_andalucia_mallas$POB_TOT, 
            opacity = 0.3, 
            title = 'Población Total por malla',
            position = "bottomright") %>%

# para volver a la visión inical
addResetMapButton() %>%

# para buscar direcciones o pueblos
addSearchOSM()
  • Añadimos el AddMinimap
# Añadimos el basegroup para poder elegir la capa que queramos de los mapas
l <-l 
  esri <- grep("^Esri", providers, value = TRUE) 
  for (provider in esri) {
   l <- l %>% addProviderTiles(provider, group = provider)
  }
  
l %>%
  addLayersControl(
  baseGroups = names(esri),options = layersControlOptions(collapsed = TRUE)) %>%
  addMiniMap(tiles = esri[[1]], toggleDisplay = TRUE,position = "bottomleft") %>%
    htmlwidgets::onRender("function(el, x) {var myMap = this;
      myMap.on('baselayerchange',
      function (e) {
      myMap.minimap.changeLayer(L.tileLayer.provider(e.name));
      })
    }"
    )

Los mapas que salen en el menú, por capas, son extraídos del provider (leaflet), solo los que son obtenidos de Esri. Hay muchos mas, puede verlo instalando leafet.

5.2 Para datos Administrativos

Se realiza en otra publicación por problemas de memoria en RPubs.

6.Problemas

Muchos, la verdad, el trabajar con datos georreferenciados, es complicado, si no tienes una visión previa, de como está estructurado el mismo.

El principal problema, es modificar el archivo, para poder añadir columnas en modo ad hoc. De momento no hemos usado el comando: addLayersControl para crear leyendas que pudieran activar o desactivar zonas geográficas,como provincias concretas (ver tabla, columna NPRO), está en estudio.

Ver: Pregunta

7. Referencias

Mapas Interactivos en R con Leaflet. Isaac González DS4B

R Markdown: la guía definitiva Yihui Xie, JJ Allaire, Garrett Grolemund libro

Ecléctikus Página

jcheng5 Estadísticas de Git (GitHub) Folleto para R. Folleto

Uso de Leaflet en R - Tutorial Timothy Lin Página

Y lo próximo aplicaciones ShinyDasboard y FlexDasboard