Fiz minha primeira visita ao Rio de Janeiro na primeira semana de maio. Estava animada pra conhecer a cidade maravilhosa, mas uns problemas de saúde me fizeram repensar a ideia de perambular sozinha por uma cidade que não conhecia.
Depois de um tempo me doendo no hotel, pensei um “vou sozinha nessa p####” e fiz um mini-roteiro e mapa, em R, de lugares próximos ao hotel onde eu estava hospedada e que seria possível visitar sem o medo de ter problema caso eu tivesse outro pico de pressão. Depois, saí do quarto (o quarto document
e o quarto do hotel, rs).
Preparando o ambiente
Antes de tudo, precisamos carregar (ou instalar, se necessário) os pacotes que utilizaremos.
Definindo os locais
Fiz um dataframe com os locais que passei/ia visitar na minha curta estadia e converti para um objeto espacial. Em seguida, gerei uma bounding box com margem para abranger melhor os arredores.
lugares <- data.frame(
nome = c("CCBB", "Feira da Praça XV", "MAM-RJ", "Windsor Florida", "ESPM",
"Museu de Folclore", "Feira da Glória", "Palácio do Catete", "Aeroporto Santos Dumont"),
lat = c(-22.901171, -22.9029828, -22.913728, -22.926667, -22.922778,
-22.924444, -22.919444, -22.925157, -22.910444),
lon = c(-43.176374, -43.1742642, -43.171843, -43.176389, -43.179167,
-43.179722, -43.177222, -43.179024, -43.163132)
)
lugares_sf <- st_as_sf(lugares, coords = c("lon", "lat"), crs = 4326)
bbox <- st_bbox(lugares_sf)
bbox_quadrada <- bbox + c(-0.01, -0.01, 0.01, 0.01)
Coletando Dados do OpenStreetMap
Com a bbox, busquei diversas camadas: ruas, prédios, áreas verdes, praias, corpos d’água e locais nomeados, como o Aterro do Flamengo e a Marina da Glória.
# Funções auxiliares
get_osm <- function(key, value) {
opq(bbox = bbox_quadrada) %>% add_osm_feature(key = key, value = value) %>% osmdata_sf()
}
ruas <- get_osm(
"highway",
c(
"primary",
"secondary",
"tertiary",
"residential",
"unclassified",
"service",
"footway",
"path"
)
)
predios <- get_osm("building", NULL)
parques <- get_osm("leisure", c("park", "garden", "recreation_ground"))
agua <- get_osm("natural", c("water", "bay"))
areas_verdes <- get_osm("landuse", c("grass", "recreation_ground", "forest"))
praias <- get_osm("natural", "beach")
aterro <- get_osm("name", "Aterro do Flamengo")
marina <- get_osm("name", "Marina da Glória")
baia <- get_osm("name", "Baía de Guanabara")
Recortando dados para o mapa
clip <- function(data, geometry = st_as_sfc(bbox_quadrada)) st_intersection(data, geometry)
ruas_corte <- clip(ruas$osm_lines)
predios_corte <- clip(predios$osm_polygons)
parques_corte <- clip(parques$osm_polygons)
agua_corte <- clip(agua$osm_polygons)
areas_verdes_corte <- clip(areas_verdes$osm_polygons)
praias_corte <- clip(praias$osm_polygons)
aterro_corte <- clip(aterro$osm_polygons)
marina_corte <- clip(marina$osm_polygons)
baia_geom <- if (!is.null(baia$osm_multipolygons) && nrow(baia$osm_multipolygons) > 0) {
baia$osm_multipolygons
} else {
baia$osm_polygons
}
baia_corte <- clip(baia_geom)
lugares_corte <- clip(lugares_sf)
Plotando!
ggplot() +
geom_sf(data = baia_corte, fill = "#A9D3DE", color = NA) +
geom_sf(data = agua_corte, fill = "#A9D3DE", color = NA) +
geom_sf(data = marina_corte, fill = "#A9D3DE", color = NA) +
geom_sf(data = praias_corte, fill = "#f4e8c1", color = NA) +
geom_sf(data = parques_corte, fill = "#b2d8b2", color = NA) +
geom_sf(data = aterro_corte, fill = "#b2d8b2", color = NA) +
geom_sf(data = areas_verdes_corte, fill = "#cdeac0", color = NA) +
geom_sf(data = predios_corte, fill = "grey80", color = NA) +
geom_sf(data = ruas_corte, color = "grey30", size = 0.3) +
geom_sf(data = lugares_corte, color = "red", size = 1) +
geom_label_repel(
data = lugares,
aes(x = lon, y = lat, label = nome),
size = 3, label.size = 0.2, label.padding = 0.2, box.padding = 0.3,
fill = "white", family = "roboto_slab"
) +
theme_void() +
theme(
text = element_text(family = "roboto_slab"),
plot.background = element_rect(fill = "#A9D3DE", color = NA),
panel.background = element_rect(fill = "beige", color = NA)
) +
coord_sf(
xlim = c(bbox_quadrada["xmin"], bbox_quadrada["xmax"]),
ylim = c(bbox_quadrada["ymin"], bbox_quadrada["ymax"]),
expand = FALSE
)