1 Zonas deEstudo

2 Carga de Dados

library(xlsx)
library(tidyr)
library(dplyr)
library(DT)
od = read.xlsx2(file = "C:/Users/fagne/OneDrive/Engenharia/_EIM/NovoHamburgo/Zoneamento/od.xlsx", sheetIndex = 4, header = 1)

library(data.table)
library(DT)

# Converte para data.table
odplot = od
setDT(odplot)

# Renomeia a primeira coluna
setnames(odplot, "Matriz", "Origem")

# Renomeia as colunas de destino
zonas <- paste0("Zona ", 1:(ncol(odplot) - 1))
setnames(odplot, old = names(odplot)[-1], new = zonas)

# Renomeia os valores da coluna Origem
odplot[, Origem := paste0("Zona ", Origem)]

# Converte valores para numérico
odplot[, (zonas) := lapply(.SD, as.numeric), .SDcols = zonas]

# Exibe como datatable interativo
datatable(odplot, options = list(pageLength = 10, scrollX = TRUE))

3 Wide para long

od_long <- od %>%
  # Converte todas as colunas de X1 a X7 para numérico
  mutate(across(starts_with("X"), as.numeric)) %>%
  # Transforma de wide para long
  pivot_longer(
    cols = starts_with("X"),
    names_to = "destino",
    values_to = "viagem"
  ) %>%
  # Remove o "X" da coluna destino e converte para número
  mutate(
    destino = as.integer(gsub("X", "", destino)),
    origem = as.integer(Matriz)  # Converte a coluna Matriz para número
  ) %>%
  # Reorganiza as colunas
  select(origem, destino, viagem)
od_long$viagem = 100*od_long$viagem
datatable(od_long)

3.1 Valida para saber se soma 100%

sum(od_long$viagem)
## [1] 100

4 Carrega a distribuição

distribuicao = read.xlsx2(file = "C:/Users/fagne/OneDrive/Engenharia/_EIM/NovoHamburgo/Zoneamento/IDsZonas.xlsx", sheetIndex = 2, header = 1)
datatable(distribuicao)

5 Desagregação de ZTs em bairros

5.1 1. Preparar distribuicao

distribuicao_clean <- distribuicao %>%
  mutate(
    ZT = as.integer(ZT),
    Pop = as.numeric(Pop..)
  ) %>%
  group_by(ZT) %>%
  mutate(
    peso_pop = Pop / sum(Pop)  # peso relativo dentro da ZT
  ) %>%
  ungroup()

datatable(distribuicao_clean)

5.2 2. Expandir od_long com IDs de origem e destino

od_expanded <- od_long %>%
  rename(ZT_origem = origem, ZT_destino = destino) %>%
  left_join(distribuicao_clean, by = c("ZT_origem" = "ZT")) %>%
  rename(ID_origem = ID, peso_origem = peso_pop) %>%
  select(ZT_origem, ZT_destino, ID_origem, peso_origem, viagem)
## Warning in left_join(., distribuicao_clean, by = c(ZT_origem = "ZT")): Detected an unexpected many-to-many relationship between `x` and `y`.
## ℹ Row 8 of `x` matches multiple rows in `y`.
## ℹ Row 1 of `y` matches multiple rows in `x`.
## ℹ If a many-to-many relationship is expected, set `relationship =
##   "many-to-many"` to silence this warning.
datatable(od_expanded)

5.3 3. Cruzar com destino

od_final <- od_expanded %>%
  left_join(distribuicao_clean, by = c("ZT_destino" = "ZT")) %>%
  rename(ID_destino = ID, peso_destino = peso_pop) %>%
  select(ID_origem, ID_destino, viagem, peso_origem, peso_destino) %>%
  mutate(
    viagem_desagregada = viagem * peso_origem * peso_destino
  )
## Warning in left_join(., distribuicao_clean, by = c(ZT_destino = "ZT")): Detected an unexpected many-to-many relationship between `x` and `y`.
## ℹ Row 2 of `x` matches multiple rows in `y`.
## ℹ Row 1 of `y` matches multiple rows in `x`.
## ℹ If a many-to-many relationship is expected, set `relationship =
##   "many-to-many"` to silence this warning.
datatable(od_final)

5.4 4. Resultado final

od_final_clean <- od_final %>%
  select(ID_origem, ID_destino, viagem_desagregada)
write.xlsx2(od_final_clean, file = "OdFinal.xlsx")
datatable(od_final_clean)

5.5 Verifica se soma 100%

sum(od_final_clean$viagem_desagregada)
## [1] 100

6 Origem/Destino por bairros

origemdestinobairros = read.xlsx2(file = "C:/Users/fagne/OneDrive/Engenharia/_EIM/NovoHamburgo/Zoneamento/odPlano_Mobilidade_Novo_Hamburgo.xlsx", sheetIndex = 1, header = 1)
origemdestinobairros$Total = NULL
origemdestinobairros$X.    = NULL
origemdestinobairros = origemdestinobairros[1:29,]
datatable(origemdestinobairros)
row.names(origemdestinobairros) = origemdestinobairros$OD...Bairros

6.1 Remove a primeira coluna (nomes de bairros de origem) e converte o restante

matriz_numerica <- origemdestinobairros %>%
  select(-OD...Bairros) %>%
  mutate(across(everything(), ~ as.numeric(.)))

6.2 Soma total da matriz

soma_total <- sum(matriz_numerica, na.rm = TRUE)
soma_total
## [1] 25781

6.3 Calcula percentual de cada célula e soma para validação

matriz_percentual <- matriz_numerica / soma_total * 100
sum(matriz_percentual, na.rm = TRUE)
## [1] 100

6.4 Matriz Final

matriz_percentual <- origemdestinobairros %>%
  select(OD...Bairros) %>%
  bind_cols(matriz_percentual)
row.names(matriz_percentual) = 1:nrow(matriz_percentual)
datatable(matriz_percentual)

7 Matriz com endpoints TransCAD

7.1 1 Primeiro, renomeie a coluna ID.1 para facilitar os joins

distribuicao_origem <- distribuicao %>% select(ID_origem = ID, ID_origem_novo = ID.1)
distribuicao_destino <- distribuicao %>% select(ID_destino = ID, ID_destino_novo = ID.1)

7.2 Agora, faça os joins para substituir os IDs

od_final_substituido <- od_final_clean %>%
  left_join(distribuicao_origem, by = "ID_origem") %>%
  left_join(distribuicao_destino, by = "ID_destino") %>%
  select(
    ID_origem = ID_origem_novo,
    ID_destino = ID_destino_novo,
    viagem_desagregada
  )

od_final_substituido$Viagens = (od_final_substituido$viagem_desagregada/100) * 354453
sum(od_final_substituido$Viagens)
## [1] 354453

7.3 3 Supondo que od_final_substituido já tem os IDs corretos

7.3.1 1. Agregue os dados por origem-destino

od_agregado <- od_final_substituido %>%
  group_by(ID_origem, ID_destino) %>%
  summarise(Viagens = sum(Viagens), .groups = "drop")

write.csv2(od_agregado, file = "od_transcad.csv")

7.3.2 2. Pivot para transformar em matriz OD

matriz_od <- od_agregado %>%
  pivot_wider(
    names_from = ID_destino,
    values_from = Viagens,
    values_fill = 0
  ) %>%
  arrange(ID_origem)
matriz_od <- as.data.frame(matriz_od)
row.names(matriz_od) = matriz_od$ID_origem
matriz_od$ID_origem = NULL
sum(matriz_od)
## [1] 354453

7.4 Matriz Final

datatable(
  matriz_od,
  options = list(pageLength = 27)
)