Vou sozinha nessa p#####: Rio de Janeiro

Mapa usando OSM e R

R
Mapa
Data de Publicação

30 de junho de 2025

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.

# Instale se necessário:
# install.packages(c("osmdata", "sf", "ggplot2", "ggrepel", "cowplot", "showtext"))

library(osmdata)
library(sf)
library(ggplot2)
library(ggrepel)
library(cowplot)
library(showtext)


## Configurando a fonte
font_add_google("Roboto Slab", "roboto_slab")
showtext_auto()

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
  )