CONSIGNA: PARTE 1
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)
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()
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.
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.
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.
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
Preparamos la data antes de mostrarla:
#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.