# 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")
)