Extensão da rede

Evolução da rede ciclável em Lisboa


Extensão das ciclovias por ano


A informação disponibilizada neste site não deve ser encarada como fonte de informação oficial

Esta dashboard pretende ser um exercício de recolha, tratamento e visualização de dados, utilizando software open-source (R software).
Esta App utiliza os seguintes packages: shiny, sf, leaflet, dplyr, ggplot2, plotly, units, rmarkdown.

Dados

A informação sobre as ciclovias foi recolhida através do portal de geodados da Câmara Municipal de Lisboa, que mantém esta base de dados actualizada com regularidade.
última actualização: 08.Fevereiro.2024

O ano de construção e tipologias foram depois acertadas, tal como desrito no código-fonte. São também apresentadas ciclovias que deixaram de existir ou que foram corrigidas, tais como:

  • Campo Grande - Telheiras, anterior à construção do Estádio de Alvalade
  • Bici+BUS na Avenida da Liberdade, antes de passarem paras as laterais
  • Braço de Prata - Matinha, reformulação do traçado
  • Avenida Almirante Reis, reformulação do traçado
  • Avenida de Berna, reformulação do traçado

Créditos

Este site foi desenvolvido por Rosa Félix, investigadora na área da mobilidade ciclável no U-Shift lab, do CERIS, no Instituto Superior Técnico - Universidade de Lisboa.

Algo está errado?

Falta alguma ciclovia? Há um troço mal classificado? A ciclovia não foi construída naquele ano?
Deixa os teus comentários em https://github.com/U-Shift/RedeCiclavel-Lisboa/issues

Obrigada!

knitr::opts_chunk$set(echo = TRUE)
library(rmarkdown)

Importação dos dados

Importar packages R

library(tidyverse)
library(sf)
library(mapview)
library(units)
library(cartography)

Importar rede ciclável

Download da informação geoffererenciada a partir do servidor da CML: https://services.arcgis.com/1dSrzEWVQn5kHHyK/arcgis/rest/services/Ciclovias/FeatureServer/0/query?outFields=*&where=1%3D1&f=geojson

CicloviasAnteriores = readRDS("CicloviasAnos/CicloviasAnos.Rds")
Ciclovias2023 = st_read("https://services.arcgis.com/1dSrzEWVQn5kHHyK/arcgis/rest/services/Ciclovias/FeatureServer/0/query?outFields=*&where=1%3D1&f=geojson")
length(unique(Ciclovias2023$OBJECTID)) #892
length(unique(Ciclovias2023$COD_SIG)) #864

Adicionar campo de ID único, enquanto a BD oficial não tiver um.

# ver primeiro as que já tínhamos


Ciclovias2023 = Ciclovias2023 |> select(COD_SIG, DESIGNACAO, TIPOLOGIA, NIVEL_SEGREGACAO, ANO, Shape__Length, geometry)

Ciclovias2023$IDunico = paste(Ciclovias2023$COD_SIG, round(Ciclovias2023$Shape__Length), sep = "_" )
Ciclovias2023 = Ciclovias2023[,c(7,2:5)]
table(duplicated(Ciclovias2023$IDunico)) #0

Agora temos um campo único para cada segmento.

Corrigir dados

Adicionar as novas que não estavam na shp anterior de Dez 2022.

Remover os que estão a mais

#filtrar só últimos anos
Ciclovias2023 = Ciclovias2023 %>% filter(ANO == 2023)
# atenção que há umas que vêm da CML que não têm ano atribuído!

#exportar e abrir no sig
st_write(Ciclovias2023, "data/Ciclovias2023_dez_cml.gpkg", delete_dsn = TRUE)

Verificar as que não têm ano

Ciclovias2023_semdata = st_read("https://services.arcgis.com/1dSrzEWVQn5kHHyK/arcgis/rest/services/Ciclovias/FeatureServer/0/query?outFields=*&where=1%3D1&f=geojson")
Ciclovias2023_semdata = Ciclovias2023_semdata |> filter(ANO == "Sem dados")

#exportar e abrir no sig
st_write(Ciclovias2023_semdata, "data/Ciclovias2023_semdata_dez_cml.gpkg", delete_dsn = TRUE)
mapview(Ciclovias2023_semdata)

Importar novamente o shp atualizado

Neste caso removeu-se um troço de ciclovia na Rua Francisco Gentil Martins (que já existia anteriormente), e adicionou-se o troço da Rua da Prata. Atualizou-se a ciclovia da Av Berna / Praça de Espanha, que passou a ter nova configuração.

Ciclovias2023_new = st_read("data/Ciclovias2023_dez_corrigido.gpkg")
AvBerna23 = st_read("data/avberna_2023.gpkg", layer = "avberna_2023")
Ciclovias2023_new = rbind(Ciclovias2023_new|> select(-NIVEL_SEGREGACAO), AvBerna23 |> select(-AnoT, -lenght))
# Rua da Prata em dúvida quanto à sua categoria
Ciclovias2023_new$TIPOLOGIA[Ciclovias2023_new$DESIGNACAO=="Rua da Prata"] = "Nao dedicada"
# por acgora fica equivalente a uma bici+30, e não um percurso ciclopedonal (tipo trilho)

Incluir as anteriores que não tinham data ou não estavam no da CML

  1. Doca Pesca (desde 2019)
  2. Estrada do Barcal (desde 2021)
  3. Fim da Rua Pinheiro Chagas (desde 2017)
  4. Convesão de troço nas Docas de Alcântara (desde 2009)
  5. Conversão de troço na Estrada da Circunvalação, Parque Campismo (desde 2022)
Ciclovias2023_outrasanteriores = st_read("data/outras_anteriores23.gpkg")
# duplicar para os anos seguintes

# 1.   Doca Pesca (desde 2019)
Ciclovias2023_outrasanteriores_1_20 = Ciclovias2023_outrasanteriores %>% filter(DESIGNACAO == "Doca Pesca") |> mutate(AnoT = 2020)
Ciclovias2023_outrasanteriores_1_21 = Ciclovias2023_outrasanteriores %>% filter(DESIGNACAO == "Doca Pesca") |> mutate(AnoT = 2021)
Ciclovias2023_outrasanteriores_1_22 = Ciclovias2023_outrasanteriores %>% filter(DESIGNACAO == "Doca Pesca") |> mutate(AnoT = 2022)
Ciclovias2023_outrasanteriores_1_23 = Ciclovias2023_outrasanteriores %>% filter(DESIGNACAO == "Doca Pesca") |> mutate(AnoT = 2023)
Ciclovias2023_outrasanteriores = rbind(Ciclovias2023_outrasanteriores, Ciclovias2023_outrasanteriores_1_20,
                                       Ciclovias2023_outrasanteriores_1_21, Ciclovias2023_outrasanteriores_1_22,
                                       Ciclovias2023_outrasanteriores_1_23)

# 2.   Estrada do Barcal (desde 2021)
Ciclovias2023_outrasanteriores_2_22 = Ciclovias2023_outrasanteriores %>% filter(DESIGNACAO == "Estrada do Barcal") |> mutate(AnoT = 2022)
Ciclovias2023_outrasanteriores_2_23 = Ciclovias2023_outrasanteriores %>% filter(DESIGNACAO == "Estrada do Barcal") |> mutate(AnoT = 2023)
Ciclovias2023_outrasanteriores = rbind(Ciclovias2023_outrasanteriores, Ciclovias2023_outrasanteriores_2_22,
                                       Ciclovias2023_outrasanteriores_2_23)

# 3.   Fim da Rua Pinheiro Chagas (desde 2017)
Ciclovias2023_outrasanteriores_3_18 = Ciclovias2023_outrasanteriores %>% filter(DESIGNACAO == "Rua Pinheiro Chagas") |> mutate(AnoT = 2018)
Ciclovias2023_outrasanteriores_3_19 = Ciclovias2023_outrasanteriores %>% filter(DESIGNACAO == "Rua Pinheiro Chagas") |> mutate(AnoT = 2019)
Ciclovias2023_outrasanteriores_3_20 = Ciclovias2023_outrasanteriores %>% filter(DESIGNACAO == "Rua Pinheiro Chagas") |> mutate(AnoT = 2020)
Ciclovias2023_outrasanteriores_3_21 = Ciclovias2023_outrasanteriores %>% filter(DESIGNACAO == "Rua Pinheiro Chagas") |> mutate(AnoT = 2021)
Ciclovias2023_outrasanteriores_3_22 = Ciclovias2023_outrasanteriores %>% filter(DESIGNACAO == "Rua Pinheiro Chagas") |> mutate(AnoT = 2022)
Ciclovias2023_outrasanteriores_3_23 = Ciclovias2023_outrasanteriores %>% filter(DESIGNACAO == "Rua Pinheiro Chagas") |> mutate(AnoT = 2023)
Ciclovias2023_outrasanteriores = rbind(Ciclovias2023_outrasanteriores, Ciclovias2023_outrasanteriores_3_18,
                                       Ciclovias2023_outrasanteriores_3_19, Ciclovias2023_outrasanteriores_3_20,
                                       Ciclovias2023_outrasanteriores_3_21, Ciclovias2023_outrasanteriores_3_22,
                                       Ciclovias2023_outrasanteriores_3_23)

# 4.   Convesão de troço nas Docas de Alcântara (desde 2009)
# mapview(Ciclovias2020T |> filter(AnoT == 2020, DESIGNACAO == "Troço da Frente Ribeirinha"), zcol = "TIPOLOGIA")
Ciclovias2023_outrasanteriores_4_09 = Ciclovias2020T |> filter(AnoT == 2020, DESIGNACAO == "Troço da Frente Ribeirinha")
Ciclovias2023_outrasanteriores_4_09$TIPOLOGIA[Ciclovias2023_outrasanteriores_4_09$IDunico == "4004"] = "Percurso Ciclo-pedonal"
# mapview(Ciclovias2023_outrasanteriores_4_09, zcol = "TIPOLOGIA")
st_geometry(Ciclovias2023_outrasanteriores_4_09) = "geom"
Ciclovias2023_outrasanteriores_4_09 = Ciclovias2023_outrasanteriores_4_09 |> select(dput(names(Ciclovias2023_outrasanteriores_3_23))) |>
  mutate(AnoT = 2009)
Ciclovias2023_outrasanteriores_4_10 = Ciclovias2023_outrasanteriores_4_09 |> mutate(AnoT = 2010)
Ciclovias2023_outrasanteriores_4_11 = Ciclovias2023_outrasanteriores_4_09 |> mutate(AnoT = 2011)
Ciclovias2023_outrasanteriores_4_12 = Ciclovias2023_outrasanteriores_4_09 |> mutate(AnoT = 2012)
Ciclovias2023_outrasanteriores_4_13 = Ciclovias2023_outrasanteriores_4_09 |> mutate(AnoT = 2013)
Ciclovias2023_outrasanteriores_4_14 = Ciclovias2023_outrasanteriores_4_09 |> mutate(AnoT = 2014)
Ciclovias2023_outrasanteriores_4_15 = Ciclovias2023_outrasanteriores_4_09 |> mutate(AnoT = 2015)
Ciclovias2023_outrasanteriores_4_16 = Ciclovias2023_outrasanteriores_4_09 |> mutate(AnoT = 2016)
Ciclovias2023_outrasanteriores_4_17 = Ciclovias2023_outrasanteriores_4_09 |> mutate(AnoT = 2017)
Ciclovias2023_outrasanteriores_4_18 = Ciclovias2023_outrasanteriores_4_09 |> mutate(AnoT = 2018)
Ciclovias2023_outrasanteriores_4_19 = Ciclovias2023_outrasanteriores_4_09 |> mutate(AnoT = 2019)
Ciclovias2023_outrasanteriores_4_20 = Ciclovias2023_outrasanteriores_4_09 |> mutate(AnoT = 2020)
Ciclovias2023_outrasanteriores_4_21 = Ciclovias2023_outrasanteriores_4_09 |> mutate(AnoT = 2021)
Ciclovias2023_outrasanteriores_4_22 = Ciclovias2023_outrasanteriores_4_09 |> mutate(AnoT = 2022)
Ciclovias2023_outrasanteriores_4_23 = Ciclovias2023_outrasanteriores_4_09 |> mutate(AnoT = 2023)

Ciclovias2023_outrasanteriores = rbind(Ciclovias2023_outrasanteriores, Ciclovias2023_outrasanteriores_4_09, Ciclovias2023_outrasanteriores_4_10,
                                       Ciclovias2023_outrasanteriores_4_11, Ciclovias2023_outrasanteriores_4_12, Ciclovias2023_outrasanteriores_4_13,
                                       Ciclovias2023_outrasanteriores_4_14, Ciclovias2023_outrasanteriores_4_15, Ciclovias2023_outrasanteriores_4_16,
                                       Ciclovias2023_outrasanteriores_4_17, Ciclovias2023_outrasanteriores_4_18, Ciclovias2023_outrasanteriores_4_19,
                                       Ciclovias2023_outrasanteriores_4_20, Ciclovias2023_outrasanteriores_4_21, Ciclovias2023_outrasanteriores_4_22,
                                       Ciclovias2023_outrasanteriores_4_23)

CicloviasAnteriores = CicloviasAnteriores |> filter(!(DESIGNACAO == "Troço da Frente Ribeirinha")) # remover versão anterior

# 5.   Conversão de troço na Estrada da Circunvalação, Parque Campismo (desde 2022)
# mapview(CicloviasAnteriores |> filter(AnoT == 2022, DESIGNACAO == "Estrada da Circunvalação"), zcol = "TIPOLOGIA")
Ciclovias2023_outrasanteriores_5_22 = Ciclovias2023_outrasanteriores |>  filter(AnoT %in% c(2021, 2022), DESIGNACAO == "Estrada da Circunvalação")
Ciclovias2023_outrasanteriores_5_22 = Ciclovias2023_outrasanteriores_5_22 |>
  mutate(id = seq(1:nrow(Ciclovias2023_outrasanteriores_5_22))) |>
  filter(TIPOLOGIA != "30+Bici") |> 
  filter(!id %in% c(5,7)) |> 
  select(-id) |> 
  mutate(AnoT = 2022)
# mapview(Ciclovias2023_outrasanteriores_5_22, zcol = "TIPOLOGIA")
Ciclovias2023_outrasanteriores_5_23 = Ciclovias2023_outrasanteriores_5_22 |> mutate(AnoT = 2023)
Ciclovias2023_outrasanteriores = rbind(Ciclovias2023_outrasanteriores, Ciclovias2023_outrasanteriores_5_22,
                                       Ciclovias2023_outrasanteriores_5_23)
CicloviasAnteriores = CicloviasAnteriores |> filter(!(DESIGNACAO == "Estrada da Circunvalação")) # remover versão anterior

# limpar
rm(Ciclovias2023_outrasanteriores_1_20, Ciclovias2023_outrasanteriores_1_21, Ciclovias2023_outrasanteriores_1_22, Ciclovias2023_outrasanteriores_1_23,
   Ciclovias2023_outrasanteriores_2_22, Ciclovias2023_outrasanteriores_2_23, Ciclovias2023_outrasanteriores_3_18, Ciclovias2023_outrasanteriores_3_19,
   Ciclovias2023_outrasanteriores_3_20, Ciclovias2023_outrasanteriores_3_21, Ciclovias2023_outrasanteriores_3_22, Ciclovias2023_outrasanteriores_3_23,
   Ciclovias2023_outrasanteriores_4_09, Ciclovias2023_outrasanteriores_4_10, Ciclovias2023_outrasanteriores_4_11, Ciclovias2023_outrasanteriores_4_12,
   Ciclovias2023_outrasanteriores_4_13, Ciclovias2023_outrasanteriores_4_14, Ciclovias2023_outrasanteriores_4_15, Ciclovias2023_outrasanteriores_4_16,
   Ciclovias2023_outrasanteriores_4_17, Ciclovias2023_outrasanteriores_4_18, Ciclovias2023_outrasanteriores_4_19, Ciclovias2023_outrasanteriores_4_20,
   Ciclovias2023_outrasanteriores_4_21, Ciclovias2023_outrasanteriores_4_22, Ciclovias2023_outrasanteriores_4_23, Ciclovias2023_outrasanteriores_5_22,
   Ciclovias2023_outrasanteriores_5_23)

# Juntar 2023 novamente
Ciclovias2023_new = Ciclovias2023_new |> select(DESIGNACAO, TIPOLOGIA, geom) |> 
  mutate(ANO = 2023, AnoT = 2023, lenght = st_length(geom) %>% units::set_units(km))
# # rename sf column
# st_geometry(Ciclovias2023_new) = "geom"

Ciclovias2023_outrasanteriores = Ciclovias2023_outrasanteriores |> 
  mutate(lenght = st_length(geom) %>% units::set_units(km))

Ciclovias2023_new = rbind(Ciclovias2023_new, Ciclovias2023_outrasanteriores)

Reclassificar ciclovias

Em dedicadas (uni e bi-direccionais, pistas cicláveis) e não-dedicadas (30+bici, zona de coexistência), e percursos em coexistência com o peão (ciclo-pedonal)

table(Ciclovias2023_new$TIPOLOGIA)
Ciclovias2023_new$TIPOLOGIA[Ciclovias2023_new$TIPOLOGIA=="Percurso Ciclopedonal"] = "Percurso Ciclo-pedonal"
Ciclovias2023_new$TIPOLOGIA[Ciclovias2023_new$TIPOLOGIA=="Pista Ciclavel Bidirecional"] = "Ciclovia dedicada"
Ciclovias2023_new$TIPOLOGIA[Ciclovias2023_new$TIPOLOGIA=="Pista Ciclável Bidirecional"] = "Ciclovia dedicada"
Ciclovias2023_new$TIPOLOGIA[Ciclovias2023_new$TIPOLOGIA=="Pista Ciclável Unidirecional"] = "Ciclovia dedicada"
Ciclovias2023_new$TIPOLOGIA[Ciclovias2023_new$TIPOLOGIA=="Pista ciclável (ciclovia)"] = "Ciclovia dedicada"
Ciclovias2023_new$TIPOLOGIA[Ciclovias2023_new$TIPOLOGIA=="Contrassentido"] = "Ciclovia dedicada"
Ciclovias2023_new$TIPOLOGIA[Ciclovias2023_new$TIPOLOGIA=="Faixa Ciclável"] = "Ciclovia dedicada"

Ciclovias2023_new$TIPOLOGIA[Ciclovias2023_new$TIPOLOGIA=="30+Bici"] = "Nao dedicada"
Ciclovias2023_new$TIPOLOGIA[Ciclovias2023_new$TIPOLOGIA=="Zona de Coexistência"] = "Nao dedicada"

#factor tipologia
Ciclovias2023_new$TIPOLOGIA = factor(Ciclovias2023_new$TIPOLOGIA)

Juntar novamente com as anteriores

#prolongar vida ultimos anos
CicloviasAnteriores_23 = CicloviasAnteriores %>% filter(AnoT == 2022) %>% mutate(AnoT = 2023)
CicloviasAnteriores = rbind(CicloviasAnteriores, CicloviasAnteriores_23)

#juntar
Ciclovias = bind_rows(CicloviasAnteriores, Ciclovias2023_new)

#remover duplicados
Ciclovias = distinct(Ciclovias)


#recalcular geometria
# Ciclovias$lenght = st_length(Ciclovias) %>% units::set_units(km)
sum(Ciclovias$lenght)
# calma, há segmentos que foram destruídos entretanto

Ver num mapa

Todas as ciclovias que existem ou existiram no server da CML

mapview::mapview(Ciclovias, zcol="TIPOLOGIA", lwd=1.5, hide=F, legend=T)