Especialización en Big Data e Inteligencia Territorial - FLACSO, Argentina.

Ciudad: Asunción, Paraguay

CONSIGNA: PARTE 1

  1. Descargar con ggmap el mapa base de la Ciudad de Asunción, Paraguay. Visualizarlo en un mapa.

Cargamos librerias

library(sf)
library(ggmap)
library(tidyverse)
library(osmdata)
library(leaflet)

Descargamos el ggmap creando el bbox de asunción.

#configuramos el perimetro de Asunción
bbox_asuncion <- getbb("Asunción", "Paraguay")

#cargamos stadia_map con el bbox
mapa_asuncion <- get_stadiamap(bbox = bbox_asuncion,
                               maptype = "alidade_smooth",
                               zoom = 12)
## ℹ © Stadia Maps © Stamen Design © OpenMapTiles © OpenStreetMap contributors.
#Visualizamos el resultado
ggmap(mapa_asuncion)

  1. Utilizar osmdata para descargar de OpenStreetMap el polígono de la ciudad de Asunción y visualizarlo sobre el mapa base.

Extraemos el polígono con la función format_out() y lo pasamos en geom_sf() para visualizarlo.

#Extraemos el poligono de Asunción Paraguay
polygon_asuncion <- getbb("Asunción", "Paraguay",
                          format_out = "sf_polygon")
#Proyectamos en ggmap
ggmap(mapa_asuncion) +
  geom_sf(data = polygon_asuncion, fill = NA, color = "black", lwd = 0.75, inherit.aes = FALSE) +
  labs (
    title = "Asunción, Paraguay",
    caption = "Fuente: OpenStreetMap"
  ) +
  theme_void()

  1. Descargar de OpenStreetMap los puntos correspondientes a “servicios financieros” (bank, atm, bureau_de_change) para la ciudad de Asunción. Visualizarlo junto al polígono y el mapa base.

Paso 1.- Reconocemos los features que están disponible en OSM para buscar las categorías que se requieren.

#para conocer los features que tiene OSM
available_features()
##   [1] "4wd_only"                    "abandoned"                  
##   [3] "abutters"                    "access"                     
##   [5] "addr"                        "addr:*"                     
##   [7] "addr:city"                   "addr:conscriptionnumber"    
##   [9] "addr:country"                "addr:county"                
##  [11] "addr:district"               "addr:flats"                 
##  [13] "addr:full"                   "addr:hamlet"                
##  [15] "addr:housename"              "addr:housenumber"           
##  [17] "addr:inclusion"              "addr:interpolation"         
##  [19] "addr:place"                  "addr:postbox"               
##  [21] "addr:postcode"               "addr:province"              
##  [23] "addr:state"                  "addr:street"                
##  [25] "addr:subdistrict"            "addr:suburb"                
##  [27] "addr:unit"                   "admin_level"                
##  [29] "aeroway"                     "agricultural"               
##  [31] "alcohol"                     "alt_name"                   
##  [33] "amenity"                     "area"                       
##  [35] "atv"                         "backward"                   
##  [37] "barrier"                     "basin"                      
##  [39] "bdouble"                     "bicycle"                    
##  [41] "bicycle_road"                "biergarten"                 
##  [43] "boat"                        "border_type"                
##  [45] "boundary"                    "brand"                      
##  [47] "bridge"                      "building"                   
##  [49] "building:architecture"       "building:fireproof"         
##  [51] "building:flats"              "building:levels"            
##  [53] "building:material"           "building:min_level"         
##  [55] "building:part"               "building:soft_storey"       
##  [57] "bus"                         "bus:lanes"                  
##  [59] "bus_bay"                     "busway"                     
##  [61] "capacity"                    "carriage"                   
##  [63] "castle_type"                 "change"                     
##  [65] "charge"                      "clothes"                    
##  [67] "construction"                "construction#Railways"      
##  [69] "construction_date"           "covered"                    
##  [71] "craft"                       "crossing"                   
##  [73] "crossing:island"             "cuisine"                    
##  [75] "cutting"                     "cycle_rickshaw"             
##  [77] "cycleway"                    "cycleway:left"              
##  [79] "cycleway:left:oneway"        "cycleway:right"             
##  [81] "cycleway:right:oneway"       "denomination"               
##  [83] "destination"                 "diet:*"                     
##  [85] "direction"                   "dispensing"                 
##  [87] "disused"                     "dog"                        
##  [89] "drinking_water"              "drinking_water:legal"       
##  [91] "drive_in"                    "drive_through"              
##  [93] "ele"                         "electric_bicycle"           
##  [95] "electrified"                 "embankment"                 
##  [97] "embedded_rails"              "emergency"                  
##  [99] "end_date"                    "entrance"                   
## [101] "est_width"                   "fee"                        
## [103] "female"                      "fire_object:type"           
## [105] "fire_operator"               "fire_rank"                  
## [107] "food"                        "foot"                       
## [109] "footway"                     "ford"                       
## [111] "forestry"                    "forward"                    
## [113] "frequency"                   "frontage_road"              
## [115] "fuel"                        "full_name"                  
## [117] "gauge"                       "gender_segregated"          
## [119] "golf_cart"                   "goods"                      
## [121] "hand_cart"                   "hazard"                     
## [123] "hazmat"                      "healthcare"                 
## [125] "healthcare:counselling"      "healthcare:speciality"      
## [127] "height"                      "hgv"                        
## [129] "highway"                     "historic"                   
## [131] "horse"                       "hot_water"                  
## [133] "hov"                         "ice_road"                   
## [135] "incline"                     "industrial"                 
## [137] "inline_skates"               "inscription"                
## [139] "int_name"                    "internet_access"            
## [141] "junction"                    "kerb"                       
## [143] "landuse"                     "lane_markings"              
## [145] "lanes"                       "lanes:bus"                  
## [147] "lanes:psv"                   "layer"                      
## [149] "leaf_cycle"                  "leaf_type"                  
## [151] "leisure"                     "lhv"                        
## [153] "lit"                         "loc_name"                   
## [155] "location"                    "male"                       
## [157] "man_made"                    "max_age"                    
## [159] "max_level"                   "maxaxleload"                
## [161] "maxheight"                   "maxlength"                  
## [163] "maxspeed"                    "maxstay"                    
## [165] "maxweight"                   "maxwidth"                   
## [167] "military"                    "min_age"                    
## [169] "min_level"                   "minspeed"                   
## [171] "mofa"                        "moped"                      
## [173] "motor_vehicle"               "motorboat"                  
## [175] "motorcar"                    "motorcycle"                 
## [177] "motorroad"                   "mountain_pass"              
## [179] "mtb:description"             "mtb:scale"                  
## [181] "name"                        "name:left"                  
## [183] "name:right"                  "name_1"                     
## [185] "name_2"                      "narrow"                     
## [187] "nat_name"                    "natural"                    
## [189] "nickname"                    "noexit"                     
## [191] "non_existent_levels"         "nudism"                     
## [193] "office"                      "official_name"              
## [195] "old_name"                    "oneway"                     
## [197] "oneway:bicycle"              "oneway:bus"                 
## [199] "openfire"                    "opening_hours"              
## [201] "opening_hours:drive_through" "operator"                   
## [203] "orientation"                 "oven"                       
## [205] "overtaking"                  "parking"                    
## [207] "parking:condition"           "parking:lane"               
## [209] "passenger_lines"             "passing_places"             
## [211] "place"                       "power"                      
## [213] "power_supply"                "priority"                   
## [215] "priority_road"               "produce"                    
## [217] "proposed"                    "proposed:name"              
## [219] "protected_area"              "psv"                        
## [221] "psv:lanes"                   "public_transport"           
## [223] "railway"                     "railway:preserved"          
## [225] "railway:track_ref"           "recycling_type"             
## [227] "ref"                         "ref_name"                   
## [229] "reg_name"                    "religion"                   
## [231] "religious_level"             "rental"                     
## [233] "residential"                 "roadtrain"                  
## [235] "route"                       "sac_scale"                  
## [237] "sauna"                       "service"                    
## [239] "service_times"               "shelter_type"               
## [241] "shop"                        "short_name"                 
## [243] "shoulder"                    "shower"                     
## [245] "side_road"                   "sidewalk"                   
## [247] "site"                        "ski"                        
## [249] "smoking"                     "smoothness"                 
## [251] "social_facility"             "sorting_name"               
## [253] "speed_pedelec"               "sport"                      
## [255] "start_date"                  "step_count"                 
## [257] "substation"                  "surface"                    
## [259] "tactile_paving"              "tank"                       
## [261] "taxi"                        "tidal"                      
## [263] "toilets"                     "toilets:wheelchair"         
## [265] "toll"                        "topless"                    
## [267] "tourism"                     "tourist_bus"                
## [269] "tracks"                      "tracktype"                  
## [271] "traffic_calming"             "traffic_sign"               
## [273] "trail_visibility"            "trailblazed"                
## [275] "trailblazed:visibility"      "trailer"                    
## [277] "tunnel"                      "turn"                       
## [279] "type"                        "unisex"                     
## [281] "usage"                       "vehicle"                    
## [283] "vending"                     "voltage"                    
## [285] "water"                       "wheelchair"                 
## [287] "wholesale"                   "width"                      
## [289] "winter_road"                 "wood"
#para conocer etiquetas de los features
available_tags("amenity")
## # A tibble: 137 × 2
##    Key     Value          
##    <chr>   <chr>          
##  1 amenity animal_boarding
##  2 amenity animal_breeding
##  3 amenity animal_shelter 
##  4 amenity animal_training
##  5 amenity arts_centre    
##  6 amenity atm            
##  7 amenity baby_hatch     
##  8 amenity baking_oven    
##  9 amenity bank           
## 10 amenity bar            
## # ℹ 127 more rows

Paso 2.- Identificados los features, procedemos a extraer los puntos en 4 pasos.

#Paso 1 obtenemos el bbox de los elementos
servicios_financieros <- opq(bbox_asuncion)
#Paso 2 obtenemos los features de los servicios financieros
servicios_financieros <- servicios_financieros |>  
  add_osm_feature(key = "amenity", value = c("bank", "atm", "bureau_de_change*"))
#Paso 3 descargamos los feature como sf
servicios_financieros <-  osmdata_sf(servicios_financieros)
#Paso 4 dejamos solo los puntos.
servicios_financieros <- servicios_financieros$osm_points

Nos quedamos con 749 elemetos que conforman los servicios financieros dentro del grupo Bank, ATM y Bureau de Change.

  1. Hacer un mapa donde se les de color a los servicios financieros a partir de un atributo a elección (por ejemplo amenity). Agregar título, subtitulo y nota al pie.

Antes de realizar el mapa, vamos a dejar solamente los servicios financieros que están denro de Asunción. Aquí vamos a usar la función st_intersection ()

servicios_financieros <- st_intersection(servicios_financieros, polygon_asuncion)

Aplicada la función, vemos que de 749 elementos iniciales, nos quedamos con solamente 638 elementos que se encuentran dentro del perímetro de Asunción.

Procedemos a graficar el resultado en función del tipo de servicio financiero (amenity).

ggmap(mapa_asuncion) +
  geom_sf(data = polygon_asuncion, fill = NA, color = "black", lwd = 0.75, inherit.aes = FALSE) +
  geom_sf(data = servicios_financieros, aes(color = amenity), inherit.aes = FALSE) +
  labs(title = "Mapa de Servicios Financieros",
       subtitle = "Asunción, Paraguay",
       caption = "Fuente: OpenStreetMap",
       color = "amenity") +
  scale_color_manual(values = c("firebrick3", "darkorange1", "blue4")) +
  theme_void() +
  theme(title = element_text(size = 10, face = "bold"), #tamaño de titulo del mapa
        plot.caption = element_text(face = "italic", colour = "gray35",size = 7)) #tamaño de nota al pie

Identificamos que tenemos también valores NA que no se encentran categorizados por la comunidad de OSM. Vamos a identificar cuántos servicios financieros tenemos de cada uno.

  1. Responder: ¿Cuántos registros hay de cada tipo de servicio financiero?

Creamos un nuevo objeto y guardamos el resultado.

#Agrupamos y contamos
resumen_SF <- servicios_financieros |> 
  group_by(amenity) |> 
  count()

#Verificamos el resultado
resumen_SF
## Simple feature collection with 4 features and 2 fields
## Geometry type: MULTIPOINT
## Dimension:     XY
## Bounding box:  xmin: -57.65604 ymin: -25.34847 xmax: -57.54189 ymax: -25.23902
## Geodetic CRS:  WGS 84
## # A tibble: 4 × 3
##   amenity              n                                                geometry
## * <chr>            <int>                                        <MULTIPOINT [°]>
## 1 atm                 56 ((-57.64867 -25.2881), (-57.5655 -25.27224), (-57.5905…
## 2 bank                59 ((-57.56739 -25.2752), (-57.56513 -25.28154), (-57.579…
## 3 bureau_de_change    16 ((-57.63251 -25.28413), (-57.634 -25.28325), (-57.6327…
## 4 <NA>               507 ((-57.6559 -25.28889), (-57.65599 -25.28891), (-57.655…

Como resultado tenemos que existen 56 ATM para retiro de dinero, 59 bancos para realizar transacciones, 16 centros de cambio de moneda y 507 elementos que no están categorizados por la comunidad de OSM.

  1. Descargar algún otro dato geográfico (a elección) de tipo línea o polígono y hacer un mapa donde se pueda ver el resultado.

Vamos a descargar los edificios de tipo polígonos donde estén las oficinas de negocios, tiendas, supermarket.

Key = building values = commercial, office, retal, supermarket. `

#Paso 1 obtenemos el bbox de los elementos
vias <- opq(bbox_asuncion)
#Paso 2 obtenemos los features de los servicios financieros
vias <- vias |>  
  add_osm_feature(key = "highway", value = c("primary", "secondary", "tertiary"))
#Paso 3 descargamos los feature como sf
vias <-  osmdata_sf(vias)
#Paso 4 dejamos solo los líneas.
vias <- vias$osm_lines

Tenemos en total 2688 líneas con las categorías de highway elegidas, vamos a quedarnos con lo que está dentro de Asunción.

vias <-  st_intersection(vias, polygon_asuncion)
## Warning: attribute variables are assumed to be spatially constant throughout
## all geometries
vias_filtro <- vias %>%
  filter(st_geometry_type(.) %in% ("LINESTRING"))

Nos quedamos al final con 1744 líneas que están dentro de Asunción. Ahora, vamos a graficarlo para identificar su ubicación.

ggmap(mapa_asuncion) +
  geom_sf(data = polygon_asuncion, fill = NA, color = "black", lwd = 0.75, inherit.aes = FALSE) +
  geom_sf(data = vias_filtro, aes(color = highway), inherit.aes = FALSE) +
  geom_sf(data = servicios_financieros, aes(color = amenity), inherit.aes = FALSE) +
  labs(title = "Mapa de Servicios Financieros",
       subtitle = "Asunción, Paraguay",
       caption = "Fuente: OpenStreetMap",
       color = "Simbología") +
  theme_void() +
  theme(title = element_text(size = 10, face = "bold"), #tamaño de titulo del mapa
        plot.caption = element_text(face = "italic", colour = "gray35",size = 7)) #tamaño de nota al pie

CONSIGNA: PARTE 2

  1. Realizar un mapa interactivo con los puntos descargados (servicios financieros). Agregar un color a cada tipo de servicio y un pop up que muestre el nombre y el tipo.

Preparamos la data antes de mostrarla:

  1. Paleta de colores que vamos a mostrar
#paleta para leaflet
factpal <- colorFactor(palette = c("blue","grey", "green"), 
               levels = servicios_financieros$amenity)
## Warning in colorFactor(palette = c("blue", "grey", "green"), levels =
## servicios_financieros$amenity): Duplicate levels detected

Transformamos valores na y tildes mal escritas

servicios_financieros <- servicios_financieros |> 
  filter(!is.na(name), !is.na(amenity)) |> # elimina valores na
  mutate_if(is.character, iconv, from="UTF-8", to="latin1" )   #reemplaza valores de tildes y ñ mal escritas

Graficamos resultado final

#Agregamos mapa dinamico
leaflet(servicios_financieros) |> 
  addTiles() |> 
  addCircleMarkers(popup = paste("Tipo:", servicios_financieros$amenity, "<br>",
                           "Nombre:", servicios_financieros$name),
             color = ~factpal(amenity)) |> 
  addPolygons(data = polygon_asuncion, color = "black", weight = 2, fill = FALSE) |> 
  addPolylines(data = vias_filtro, color = "grey") |> 
  addLegend("bottomright", pal = factpal, values = ~amenity,
            title = "Tipo",
            opacity = 1) |> 
  addMiniMap()

Para determinar a partir de un heatmap los servicios financieros que están cerca y contar los puntos de influencia de forma dinámica podemos visualizarlo de esta forma

Cargamos libreria nueva para leaflet

#Cargamos libreria
library(leaflet.extras)
## Warning: package 'leaflet.extras' was built under R version 4.5.1

Aplicamos el siguiente código

leaflet(servicios_financieros) |> 
  addTiles() |> 
  addPolygons(data = polygon_asuncion, color = "black", weight = 2, fill = FALSE) |> 
  addHeatmap(radius = 15, max = 0.05) |> 
  addMiniMap() |> 
  addMarkers(
    popup = paste(
      "<b>Tipo:</b>", servicios_financieros$amenity, "<br>",
      "<b>Nombre:</b>", servicios_financieros$name),
    clusterOptions = markerClusterOptions(),
    options = pathOptions(opacity = 0)
  )

Con esto podemos identificar el agrupamiento de servicios financieros dentro de la ciudad de Asunción, Paraguay.