Mapas com os declives de uma rede viária
Este repositório explica como produzir um mapa de declives de uma rede
viária em open source software, usando como exemplo o caso da cidade
do Porto.
Para criar o mapa de declives, são necessários dois ficheiros:
- Rede viária, em shapefile ou outro formato vectorial
- Modelo Digital do Terreno ou de Elevação (MDT, DEM), em raster (tif ou outro)
Recomenda-se estes dois softwares:
For an english version, check this quick script.
A rede viária pode ser obtida de várias formas. Em primeiro lugar, experimentar procurar nos “dados abertos” da câmara municipal em questão. Esses dados estão normalmente limpos e actualizados.
Caso não estejam disponíveis, pode-se usar os dados abertos do Open
Steet Map (OSM).
O problema é que a rede viária normalmente tem de ser limpa. Por
exemplo, faz sentido manter as escadas, os túneis e auto-estradas para
caminhos em bicicleta?
Ver o tutorial de como extrair e limpar uma rede viária do OSM, usando
apenas o R:
tutorials/OSMextract_prepare.md.
Ou então, pode-se recorrer ao QGIS (outro software livre de Sistemas de Informação Geográfica), e instalar um plugin OSM donwloader. Instalar um plugin no QGIS é simples.
Para o Porto, o ficheiro RedeViariaPorto_osm.shp
já foi limpo segundo
o
tutorial,
e está disponibilizado na pasta shapefiles
.
Estes raster são difíceis de obter gratuitamente para resoluções melhores. Para o caso de uma Rede Viária, seria bom ter um raster com células de 10metros ou menos.
Os dados do SRTM (Shuttle Radar Topography Mission), uma missão da NASA, estão disponíveis gratuitamente, mas para uma resolução de 25 a 30m, com erro da altimetria vertical de 16m - saber mais. Para fazer donwload do tile correcto, pode-se também recorrer a um outro plugin do QGIS, o SRTM-Donwloader, e pedir para guardar o raster que cobre a shapefile da rede viária - é uma opção no QGIS.
Em alternativa, a COPERNICUS, uma missão da ESA, também
disponibiliza
gratuitamente os DEM
para toda a Europa, e com uma resolução de 25, com erro da altimetria
vertical de 7m - saber
mais.
Trata-se de um produto que é baseado no SRTM e no ASTER GDEM, com uma
abordagem de ponderação de pesos. A sua versão anterior (1.0)
apresentava uma precisão média de 2.9m verticais, quando foi validada.
Para escolher o tile correcto, pode-se navegar no
mapa, e
seleccionar os ficheiros. Para fazer download é necessário fazer login
(registo gratuito).
Entretanto ficou descontinuado.
O novo método passa por escolher o tile a partir da grid, identificar as coordenadas, e alterar o seguinte link:
Example of direct query for a 30m DEM tile (North 29°- East 14°): https://prism-dem-open.copernicus.eu/pd-desk-open-access/prismDownload/COP-DEM_GLO-30-DGED__2022_1/Copernicus_DSM_10_N29_00_E014_00.tar source
Como o raster cobre uma área bem maior do que necessitamos (ver ficheiro
N41W009.hgt
), podemos sempre fazer um clip para ficar com dimensões
mais adequadas à nossa análise:
Raster > Extraction > Clip Raster by Extent
.
O ficheiro PortoNASA_clip.tif
ou PortoCOPERNICUS_clip.tif
na pasta
raster
já foi cortado para uma área mais adequada à cidade do Porto.
Neste caso, é necessário re-projectar a rede viária no sistema de coordenadas do DEM:
EPGS-3035
para ETRS89-LAEA. (já não se aplica!)
O ficheiro slopes.R
na pasta code
pode ser corrido em R. Antenção
para mudar os “caminhos” onde estão os ficheiros raster e shapefile.
São necessários os seguintes packages:
library(sf)
library(raster)
library(geodist)
library(slopes)
library(tmap)
RedeViaria = st_read("shapefiles/RedeViariaPorto_osm.shp")
## Reading layer `RedeViariaPorto_osm' from data source
## `/media/rosa/Dados/GIS/Declives-RedeViaria/shapefiles/RedeViariaPorto_osm.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 13738 features and 9 fields
## Geometry type: LINESTRING
## Dimension: XY
## Bounding box: xmin: -8.694169 ymin: 41.12601 xmax: -8.547498 ymax: 41.19294
## Geodetic CRS: WGS 84
# RedeViaria = st_transform(RedeViaria, 4326) #projectar em WGS84
# RedeViaria = st_cast(RedeViaria, "LINESTRING", do_split=F) #o slopes só permite linestrings, mas não deixarque parta as linhas
class(RedeViaria)
## [1] "sf" "data.frame"
Esta rede tem quase 14mil segmentos.
DEM = raster("raster/PortoNASA_clip.tif")
class(DEM)
## [1] "RasterLayer"
## attr(,"package")
## [1] "raster"
summary(values(DEM))
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -10.00 24.00 72.00 65.87 97.00 178.00
res(DEM)
## [1] 0.0002777778 0.0002777778
Este raster tem valores de altimetria entre -10 e 178m. As células são de 27.7m
O DEM e a Rede Vuária têm de estar no mesmo sistema de coordenadas.
raster::plot(DEM)
plot(sf::st_geometry(RedeViaria), add = TRUE)
Através do package slopes, vai-se calcular os declives de cada segmento da rede, em modo absoluto. Ler mais na página do package sobre como são calculados.
RedeViaria$slope = slope_raster(RedeViaria, dem = DEM) #28 segundos
Declives em percentagem: mínimo, P25, mediana, média, P75, max.
RedeViaria$declive = RedeViaria$slope*100
summary(RedeViaria$declive)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 2.347 4.222 5.449 7.121 67.547
Isto significa que metade das vias tem mais de 4% de inclinação, o que é bastante.
Criar classes de declives, com labels perceptíveis
RedeViaria$declive_class = RedeViaria$declive %>%
cut(
breaks = c(0, 3, 5, 8, 10, 20, Inf),
labels = c("0-3: plano", "3-5: leve","5-8: médio", "8-10: exigente", "10-20: terrível", ">20: impossível"),
right = F
)
Ver a percentagem de cada classe para toda a rede
round(prop.table(table(RedeViaria$declive_class))*100,1)
##
## 0-3: plano 3-5: leve 5-8: médio 8-10: exigente 10-20: terrível
## 34.3 24.0 21.4 7.7 10.8
## >20: impossível
## 1.8
… o que quer dizer que 34.3% das ruas são planas ou quase planas, e cerca de 58% são perfeitamente cicláveis.
Ao usarmos o DEM europeu (Copernicus) os resultados são diferentes: 50.9% das vias são planas ou quase planas (0-3%) e cerca de 72% das vias são perfeitamente cicláveis (0-5%). Experimenta!
Pode-se agora calcular a extensão das ruas
RedeViaria$length = st_length(RedeViaria)
e exportar novamente o shapefile
#exportar shapefile com os declives, em formato GeoPackage (QGIS)
st_write(RedeViaria, "shapefiles/RedeViariaPorto_declives.gpkg", append=F)
#exportar em formato kml (GoogleMaps)
st_write(RedeViaria, "shapefiles/RedeViariaPorto_declives.kml", append=F)
Criar uma palete de cores, entre o verde escuro e o vermelho escuro
palredgreen = c("#267300", "#70A800", "#FFAA00", "#E60000", "#A80000", "#730000")
usando o tmap
tmap_mode("view")
tmap_options(basemaps = leaflet::providers$CartoDB.Positron) #mapa base
mapadeclives =
tm_shape(RedeViaria) +
tm_lines(
col = "declive_class",
palette = palredgreen, #palete de cores
lwd = 2, #espessura das linhas
title.col = "Declive [%]",
popup.vars = c("Tipo: " = "highway",
"Comprimento" = "length",
"Declive: " = "declive",
"Classe: " = "declive_class"),
popup.format = list(digits = 1),
# id = "declive"
id = "name" #se o computaor não conseguir exportar por falta de memória, apagar esta linha.
)
mapadeclives
tmap_save(mapadeclives, "DeclivesPorto_SRTM.html")
Dependendo do tamanho da rede, pode ser exigente para a RAM. Esta tinha cerca de 14mil arcos, e só consegui exportar num pc com 16GB de RAM
O mapa final pode ser visto online aqui: http://web.tecnico.ulisboa.pt/~rosamfelix/gis/declives/DeclivesPorto.html
O portal de dados abertos da CML disponibiliza uma rede viária, embora só para vias de heirarquia superior, e um Modelo Digital do Terreno, embora com uma resolução de 48m.
Por outro lado, disponibiliza dados sobre o declive longitudinal das
vias,
com uma rede detalhada, e já com o valor de declive (slope
), embora
não forneça informação sobre que tipo de raster foi utilizado para o seu
cálculo.
- Experimenta fazer o mesmo exercício, gravando o output do
slope_raster
na variávelslopeNASA
(para não fazer overwrite doslope
), e compara os resultados. Podes usar oraster/LisboaNASA_clip.tif
- Compara os resultados com os declives calculados com um raster de
10m, do IST. Shapefile disponível em
shapefiles/RedeViariaLisboa2012_declives_etrs89.gpkg
. Que diferenças?
Declives da rede viária de Lisboa (10m): http://web.tecnico.ulisboa.pt/~rosamfelix/gis/declives/DeclivesLisboa.html
LisboaA mediana do declive das ruas de Lisboa é de 2.6%. 49% das vias são planas ou quase planas (0-3%) e cerca de 72% das vias são perfeitamente cicláveis (0-5%).