Weekly Viz: Ruas de Porto Alegre

mapas
ggplot2
weekly-viz
data-visualization
Author

Vinicius Oike

Published

September 6, 2023

Nome das ruas de Porto Alegre

Uma avenida polêmica

Aqueles que acompanham as venturas da capital gaúcha bem devem saber da polêmica Avenida Castelo Branco, que dá entrada à cidade, para quem vem da Região Metropolitana. Em 2014, a câmara de vereadores de Porto Alegre aprovou a mudança da Av. Castelo Branco para Av. da Legalidade e da Democracia. A Avenida da Legalidade, como ficou conhecida, durou pouco tempo: em 2018 a justiça considerou inválida a lei que alterou o nome da avenida e ela voltou a se chamar Castelo Branco, agora Av. Presidente Castelo Branco, como se querendo debochar da mudança anterior.

Na minha vivência na cidade, sempre reparei na quantidade de ruas e avenidas que homenageavam não somente os presidentes da ditadura militar, mas membros do exército em geral. A principal via do boêmio bairro da Cidade Baixa chama-se Rua General Lima e Silva; a avenida que liga a Protásio com a 24, Av. Coronel Lucas de Oliveira; um longo trecho da terceira perimetral, Av. Coronel Aparício Borges; no querido Bom Fim, General João Telles; no Centro Histórico, Gen. Vitorino, Gen. Andrade Neves, Gen. Câmara, Gen. Salustiano, Cel. Fernando Machado e tantos outros.

Parti então para a empreitada de classificar todas as ruas da cidade e entender quais os nomes que formam os logradouros de Porto Alegre. O resultado está no mapa abaixo. Para ver em mais detalhes, selecione “Abrir imagem em nova aba” e use o zoom.

Sobre o mapa

A tarefa foi mais difícil do que esperava. De imediato, nota-se que a maior parte das ruas têm nome de pessoas, cerca de 65%. O restante das ruas ou são “coisas”, como Av. Icaraí, Av. Ipiranga, etc. ou são ruas sem nome como Beco A, Rua 1, etc. Estas ruas sem nome concentram-se ou em aglomerados subnormais (favelas) ou em condomínios fechados. Por fim, temos ruas que têm nomes de outros lugares, como a Av. Nova York, Rua Europa, etc.

O exército realmente tem muitas ruas, em torno de 185, ou 3% do total; é mais do que o nome de ruas que têm os políticos (35) e até mesmo do que as figuras religiosas que têm 155. Há menos ruas com nomes de políticos do que eu esperava; as poucas ruas, contudo, costumam ser bastante importantes, como a Av. João Pessoa, Av. Getúlio Vargas e Av. Protásio Alves. Nossos padres, freis e papas têm muitas ruas, mas a maioria delas são pequenas; a exceção é a Av. Padre Cacique, na Zona Sul.

Como mencionei acima, o Centro Histórico concentra muitas ruas com nomes de generais, coroneis e marechais.

As ruas sem nome são bastante aglomeradas espacialmente. Na sua maioria, estas ruas são de condomínios fechados ou de aglomerados subnormais. A foto abaixo mostra a esquina da Rua C com a Rua Oito, no bairro Bom Jesus. As ruas em volta seguem o mesmo padrão: Rua 11, Rua Doze, Rua P, etc.

Algumas partes da cidade parecem temáticas. Na Zona Norte, por exemplo, no Bairro São Geraldo, há um enorme número de ruas contíguas com nomes de locais: Av. Pará, Av. Amazonas, Av. Bahia, Av. Ceará, Av. França, Av. Madrid, etc. No Partenon, a Rua Chile faz esquina com a R. Valparaíso e é paralela com a R. Buenos Aires.

Os nomes de personalidades históricas estão espalhados pela cidade e não parece haver um padrão. Os escritores Machado de Assis, Graciliano Ramos, Eça de Queiroz, Olavo Bilac e outros estão cada um em um canto. Já Raimundo Correa, Alfonso Celso e Vicente de Carvalho (todos poetas) estão reunidos no entorno da Praça Japão; durante um trecho, também, Castro Alves e Casemiro de Abreu são paralelos. A Av. Érico Veríssimo, na sua longa extensão, faz esquina com a Olavo Bilac e eventualmente encontra-se com a Av. José de Alencar.

Muitas ruas têm nomes de profissões, como R. Doutor Flores ou R. Professor Fitzgerald. A profissão mais comum é a de doutor (cerca de 120 ruas) seguida por professor (cerca de 80 ruas). Também temos bastante engenheiros, como na Av. Engenheiro Alfredo Corrêa Daudt. No meio das ruas temos até uma Av. Economista Nilo Wulff, no Bairro Restinga, que foi um dos criados do Conselho de Economia do Rio Grande do Sul. As ruas com nomes de profissão estão espalhadas por toda a cidade. No Bairro Tristeza, na Zona Sul, há várias delas reunidas, várias ruas com nome de Doutor.

Sobre fazer o mapa

Classificar o nome das ruas é uma tarefa nada trivial. Primeiro, porque as categorias que eu me propus a usar não são mututamente excludentes. A Av. Senador Salgado Filho, por exemplo, é nome de um município, refere-se a uma profissão (senador), é nome de um político e, de maneira geral, é nome de uma personalidade histórica.

A Av. Bento Gonçalves também é um pouco ambígua, afinal é o nome de um município importante; neste caso, contudo, tanto a avenida como a cidade homenageam Bento Gonçalves da Silva, tenente-coronel, líder da Revolução Farroupilha. Além disso, a Lei Ordinária No 1 de março de 1936, deixa evidente que o homenageado era o General. Infelizmente, são poucas as ruas e avenidas que estão propriamente documentadas online. Em alguns casos não há registros de quem era a pessoa homenageada ou há mesmo várias pessoas com nome similar.

Por fim, algumas ruas são simplesmente difíceis de classificar. A Travessa Azevedo, por exemplo. Quem terá sido este Azevedo? Na dúvida, ficou como personalidade histórica.

Para a minha surpesa algumas ruas tem nomes duplicados. A BR-290 que liga a cidade ao litoral tem o nome Estrada Marechal Osório no Google Maps, mas tem nome Rodovia Osvaldo Aranha no OpenStreetMaps. Até onde me lembro sempre ouvi as pessoas chamando ela de “freeway”. Não consegui encontrar algum tipo de material oficial na prefeitura para sanar a dúvida.

Não encontrei nenhum tipo de “dicionário” ou lista com personalidades gaúchas. Sem uma boa lista que junta nomes com descrições fica difícil aplicar algum tipo de metodologia que envolva aprendizado de máquina. A classificação foi feita com uso extensivo de regex; a revisão foi na base de tentativa e erro, pois há incontáveis exceções a todo tipo de regra. Na minha classificação as categorias “coringa” são “personalidade histórica” e “coisa”. Até por isso, estas são as duas categorias com maior chance de estar superestimadas.

Código

Como sempre, o código para fazer o mapa segue abaixo:

Code
# Classificar o nome das ruas de Poa #

library(osmdata)
library(sf)
library(ggplot2)
library(dplyr)
library(stringr)
library(ggtext)
sysfonts::font_add("Gill Sans", "GillSans.ttc")
showtext::showtext_auto()

# Import Data -------------------------------------------------------------

## geobr -------------------------------------------------------------------

# City border
poa <- geobr::read_municipality(4314902)

## osmdata -----------------------------------------------------------------

# Define bbox
bbox <- getbb("Porto Alegre Brazil")
# Base query
qr <- opq(bbox)

# Add feature requests to query

# All roads
qr_roads <- add_osm_feature(qr, key = "highway")

# Only big roads
qr_big_streets <- add_osm_feature(
  qr,
  key = "highway",
  value = c("motorway", "primary", "motorway_link", "primary_link")
)

# Only medium roads
qr_med_streets <- add_osm_feature(
  qr,
  key = "highway",
  value = c("secondary", "tertiary", "secondary_link", "tertiary_link")
)

# Only small roads
qr_small_streets <- add_osm_feature(
  qr,
  key = "highway",
  value = c("residential", "living_street", "unclassified", "service",
            "footway")
)

# Download
roads <- osmdata_sf(q = qr_roads)
roads <- roads$osm_lines
roads <- st_transform(roads, crs = 4674)
roads <- st_join(roads, poa)
roads <- filter(roads, !is.na(code_muni))


big_streets <- osmdata_sf(q = qr_big_streets)
med_streets <- osmdata_sf(q = qr_med_streets)
small_streets <- osmdata_sf(q = qr_small_streets)

#> Get street names
snames <- roads$name

#> Remove duplicate names and missing values
snames <- unique(snames)
snames <- na.omit(snames)

# Convert to tibble
dictionary <- tibble(
  street_name = snames
)

# Streets - classify ------------------------------------------------------

#> Group into categories: historical personalities, names of other cities or 
#> states, jobs, holiday, religious figure, army, nameless

#> Get names of all cities and states in Brazil
muni <- sidrar::get_sidra(4709, geo = "City", variable = 93)

name_muni <- muni |> 
  janitor::clean_names() |> 
  filter(valor > 1e5) |> 
  tidyr::separate(municipio, into = c("name_muni", "abb"), sep = " - ") |> 
  pull(name_muni) |> 
  unique()
 
state <- geobr::read_state()
state_name <- state$name_state

state_lower <- c(
  "Rio Grande do Sul", "Rio de Janeiro", "Rio Grande do Norte",
  "Mato Grosso do Sul"
  )

state_name <- c(state_name, state_lower)

geonames <- c(name_muni, state_name)
geostring <- paste(glue::glue("({geonames})"), collapse = "|")

#> Common titles for army position, liberal professions, and religious
#> personalities

posto_exercito <- c(
  "Marechal", "Almirante", "General", "Comandante", "Coronel", "Cabo",
  "Capitão", "Brigadeiro", "Tenente", "(Castello Branco)",
  "(Costa e Silva)", "(Ernesto Geisel)", "PM", "Major"
  )

#> Common prefixes for job titles
profissao <- c(
  "Engenheir", "Doutor", "Profess", "Desembargador", "Economista", "Jornalista", "Escrivão", "Contabilista"
  )

#> Common names for religious figures
santidade <- c("Frei", "Santo", "Santa", "São", "Padre", "Papa", "Reverendo")

politico <- c("Vereador", "Deputado", "Governador", "Senador", "Presidente")

#> Collapse strings
posto_exercito <- paste(posto_exercito, collapse = "|")
profissao <- paste(profissao, collapse = "|")
santidade <- paste(paste0(santidade, " "), collapse = "|")
politico <- paste(politico, collapse = "|")

# Proxy for closed condominiums / favelas

cardinais <- c(
  "Um", "Dois", "Três", "Quatro", "Cinco", "Seis", "Sete", "Oito",
  "Nove", "Dez", "Onze", "Doze", "Treze", "Catorze", "Quatorze",
  "Quinze", "Dezesseis", "Dezesete", "Dezoito", "Dezenove", "Vinte",
  "Vinte e Um", "Vinte e Dois", "Vinte e Três", "Vinte e Quatro",
  "Vinte e Cinco", "Vinte e Seis", "Vinte e Sete", "Vinte e Oito",
  "Vinte e Nove", "Trinta", "Quarenta", "Cinquenta", "Sessenta",
  "Setenta", "Oitenta", "Noventa", "Cem"
  )

cardinais <- paste(paste0("(Rua ", cardinais, ")"), collapse = "|")

#> "nameless" streets
name_vias <- c(
  "Alameda", "Avenida", "Acesso", "Beco", "Caminho", "Passagem", "Via", "Viela"
)

rx_vias <- paste(name_vias, "[A-Z0-9]+[A-Z]?$")

rua_sem_nome <- c("[0-9].+", rx_vias, cardinais)

rua_sem_nome <- paste(glue::glue("({rua_sem_nome})"), collapse = "|")

rua_sem_nome <- paste(rua_sem_nome, cardinais, sep = "|")

dictionary <- dictionary |>
  mutate(
    class = case_when(
      str_count(street_name, "\\w+") > 2 ~ "Personalidade Histórica",
      str_count(street_name, "\\w+") <= 2 ~ "Coisa",
      TRUE ~ "Outro"
    ),
    class = case_when(
      str_detect(street_name, geostring) ~ "Nome de Cidade/UF",
      str_detect(street_name, politico) ~ "Político",
      str_detect(street_name, posto_exercito) ~ "Exército",
      str_detect(street_name, profissao) ~ "Profissão",
      str_detect(street_name, santidade) ~ "Figura Religiosa",
      str_detect(street_name, "[0-9] de") ~ "Feriado",
      str_detect(street_name, rua_sem_nome) ~ "Rua sem nome",
      TRUE ~ class
    )
  )

pers <- c(
  "Carlos Gomes", "Protásio Alves", "Salgado Filho", "Mário Tavares Haussen",
  "Donário Braga", "Joracy Camargo", "Goethe", "Mozart", "Schiller",
  "Edgar Pires de Castro", "Plínio Brasil Milano", "Santos Dumont"
  )

exercito <- c(
  "Bento Gonçalves", "Luís Carlos Prestes", "Presidente Castello Branco",
  "João Antônio da Silveira"
  )

politicos <- c(
  "Getúlio Vargas", "João Pessoa", "Protásio Alves", "Loureiro da Silva"
  )

coisas <- c(
  "Azenha", "Rua da Conceição", "Túnel da Conceição", "Elevada da Conceição",
  "Viaduto da Conceição", "Ipiranga", "Beira Rio", "Rio Jacuí", " Banco",
  "Lago das ", "Lago do", "Rio dos Frades", "Rio Pardo", "Rio Claro",
  "Rio dos Sinos", "Rio Negro", "Rio Grande", "Rio Tejo", "Rio Maria",
  "Rio Verde", "Rio Solimoes", "Rio Xingu", "Rio Tapajos", "Avenida da Cavalhada",
  "Estrada do Varejão", "Estrada da Taquara", "Sarandi"
  )

locais <- c(
  "Chicago", "Madri", "Nova York", "Nova Zelândia", "Quito", "Brasil",
  "Europa", "Estados Unidos", "Japão", "Itália", "Polônia", "Caracas",
  "Buenos Aires"
)

pers <- paste(glue::glue("({pers})"), collapse = "|")
coisas <- paste(glue::glue("({coisas})"), collapse = "|")
locais <- paste(glue::glue("({locais})"), collapse = "|")
politicos <- paste(glue::glue("({politicos})"), collapse = "|")
exercito <- paste(glue::glue("({exercito})"), collapse = "|")

# Ajustes manuais
dictionary <- dictionary |>
  mutate(
    class = if_else(str_detect(street_name, pers), "Personalidade Histórica", class),
    class = if_else(str_detect(street_name, coisas), "Coisa", class),
    class = if_else(str_detect(street_name, locais), "Nome de Cidade/UF", class),
    class = if_else(str_detect(street_name, politicos), "Político", class),
    class = if_else(str_detect(street_name, exercito), "Exército", class)
  )

dictionary |> 
  count(class, sort = TRUE) |> 
  mutate(share = n / sum(n) * 100)

# Streets ---------------------------------------------------------------

s1 <- big_streets$osm_lines |>
  st_transform(crs = 4674) |>
  left_join(dictionary, by = c("name" = "street_name"))

s2 <- med_streets$osm_lines |>
  st_transform(crs = 4674) |>
  left_join(dictionary, by = c("name" = "street_name"))

s3 <- small_streets$osm_lines |>
  st_transform(crs = 4674) |>
  left_join(dictionary, by = c("name" = "street_name"))

# Plot ------------------------------------------------------------------
cores <- c(
  "coisa" = "#33a02c",
  "exercito" = "#b15928",
  "feriado" = "#fb9a99",
  "religioso" = "#e41a1c",
  "nome_cidade" = "#1f77b4",
  "personalidade" = "#ff7f00",
  "politico" = "#a6cee3",
  "profissao" = "#984ea3",
  "sem_nome" = "#e78ac3"
  )

bg_color <- "#F5F5F5"

p1 <- ggplot() +
  geom_sf(
    data = filter(s1, !is.na(class)),
    aes(color = class),
    linewidth = 0.8,
    key_glyph = draw_key_rect
  ) +
  geom_sf(
    data = filter(s2, !is.na(class)),
    aes(color = class),
    key_glyph = draw_key_rect,
    linewidth = 0.35
  ) +
  geom_sf(
    data = filter(s3, !is.na(class)),
    aes(color = class),
    key_glyph = draw_key_rect,
    linewidth = 0.15
  ) +
  coord_sf(
    ylim = c(-30.124, -29.9691),
    xlim = c(-51.265, -51.135)
  ) +
  scale_colour_manual(name = "", values = unname(cores)) +
  labs(
    title = "**Origem do Nome de Ruas em Porto Alegre**",
    caption = "Fonte: OSM. Cores: ColorBrewer. Autor: @viniciusoike"
  ) +
  theme_void() +
  theme(
    plot.background = element_rect(fill = bg_color, colour = bg_color),
    panel.background = element_rect(fill = bg_color, colour = bg_color),
    #> Plot Margin
    plot.margin = margin(t = 1.5, r = 0.5, l = 0.5, b = 1, unit = "cm"),
    #> Textual elements
    text = element_text(family = "Gill Sans", size = 8),
    plot.title = element_markdown(
      family = "Gill Sans",
      size = 20,
      hjust = 0.5
    ),
    panel.border = element_rect(colour = "gray20", fill = "transparent"),
    #> Legend 
    legend.position = c(0.16, 0.8),
    #legend.position = "right",
    legend.title = element_blank(),
    legend.background = element_rect(fill = bg_color, colour = bg_color),
    legend.box.background = element_rect(fill = bg_color, colour = bg_color),
    legend.text = element_text(size = 8),
    legend.margin = margin(t = 0.5, b = 0.5, unit = "cm")
  )