Atilizaremos os pacotes: geosphere, RgoogleMaps e leaflet.
install.packages("geosphere")
install.packages("RgoogleMaps")
install.packages("leaflet")
library(geosphere)
library(RgoogleMaps)
library(leaflet)A função distm() da biblioteca geosphere, recebe um vetor de coordenadas de origem, e um vetor de coordenadas de destino e retorna a matrix de distâncias entre os dois conjuntos de pontos. Por exemplo:
library(geosphere)## Loading required package: sp
distm(c(-38.53453523, -3.72019331), c(-38.53494246, -3.72004400), fun = distHaversine)## [,1]
## [1,] 48.19396
Carregando o conjunto de paradas no objeto estacoes.
setwd("C:/Users/Lucas/Documents")
estacoes = read.csv("Estacoes Metrofor.txt", dec = ".", sep = ",", header = TRUE)
head(estacoes)## id lon lat
## 1 Estação Parangaba -38.56367 -3.776055
## 2 Estação Montese -38.55284 -3.773497
## 3 Estação Vila União -38.53412 -3.769700
## 4 Estação Borges de Melo -38.52872 -3.760782
## 5 Estação São João do Tauape -38.51207 -3.760971
## 6 Estação Pontes Vieira -38.50021 -3.751978
Carregando o conjunto de rotas no objeto rota.
setwd("C:/Users/Lucas/Documents")
rota = read.csv("Trejeto metrofor.txt", dec = ".", sep = "," , header = TRUE)
head(rota)## lon lat
## 1 -38.56411 -3.776212
## 2 -38.56214 -3.774653
## 3 -38.56198 -3.774554
## 4 -38.56178 -3.774458
## 5 -38.56158 -3.774388
## 6 -38.56138 -3.774335
Agora iremos criar uma matriz ‘D’ de distâncias das estações.
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 0.000 1236.512 3358.663 4238.166 5973.442 7542.114
## [2,] 1236.512 0.000 2122.549 3029.840 4739.079 6318.238
## [3,] 3358.663 2122.549 0.000 1159.337 2634.968 4251.848
## [4,] 4238.166 3029.840 1159.337 0.000 1850.505 3315.767
## [5,] 5973.442 4739.079 2634.968 1850.505 0.000 1654.462
## [6,] 7542.114 6318.238 4251.848 3315.767 1654.462 0.000
De maneira idêntica, definimos uma matriz ‘M’ de distâncias para as rotas.
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 0.0000 279.50030 300.07117 324.83019 347.39736 368.58161
## [2,] 279.5003 0.00000 20.67966 45.95494 69.36237 91.63072
## [3,] 300.0712 20.67966 0.00000 25.37194 48.90685 71.31661
## [4,] 324.8302 45.95494 25.37194 0.00000 23.58925 46.08158
## [5,] 347.3974 69.36237 48.90685 23.58925 0.00000 22.52207
## [6,] 368.5816 91.63072 71.31661 46.08158 22.52207 0.00000
Construir a matriz de distâncias usando a função distHaversine()
xlon = cbind(estacoes$lon)
xlat = cbind(estacoes$lat)
ylon = cbind(estacoes$lon)
ylat = cbind(estacoes$lat)
dh <- function(xlon, xlat, ylon, ylat){
tmp = matrix(1,nrow(xlon),nrow(ylon))
k = 1
for (i in 1:nrow(xlon)) {
for(j in 1:nrow(ylon)){
tmp[i,j] = distHaversine(c(xlon[i],xlat[i]),c(ylon[j],ylat[j]))
k = k+1
}
}
return(tmp)
}
head(dh(xlon,xlat,ylon,ylat)[,1:6])## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 0.000 1236.512 3358.663 4238.166 5973.442 7542.114
## [2,] 1236.512 0.000 2122.549 3029.840 4739.079 6318.238
## [3,] 3358.663 2122.549 0.000 1159.337 2634.968 4251.848
## [4,] 4238.166 3029.840 1159.337 0.000 1850.505 3315.767
## [5,] 5973.442 4739.079 2634.968 1850.505 0.000 1654.462
## [6,] 7542.114 6318.238 4251.848 3315.767 1654.462 0.000
A função inrote() verifica se um conjunto de pontos pertence ou não a rota.
lon = cbind(rota$lon)
lat = cbind(rota$lat)
elon = cbind(estacoes$lon)
elat = cbind(estacoes$lat)
inrote<-function(lon,lat,elon,elat){
x = matrix(c(lon,lat),nrow = length(lon), ncol = 2)
y = matrix(c(elon,elat),nrow = length(elon),ncol = 2)
DM = distm(x,y,fun = distHaversine)
return(DM)
}Agora plotamos o mapa:
library(leaflet)
leaflet(data = estacoes) %>% addTiles() %>%
addMarkers(~lon, ~lat, popup = ~as.character(id), label = ~as.character(id))Vizualização alternativa com marcadores pontos.
m <- leaflet(estacoes) %>%
addTiles() %>%
addCircles(~lon, ~lat, popup=NA, weight = 3, radius=100,
color="black", stroke = TRUE, fillOpacity = 0.8) %>%
addLegend("bottomright", colors= "#ffa500", labels="", title="Metrofor")%>%
setView (lat=mean(estacoes$lat), lng = mean(estacoes$lon), zoom=12)
mTambém podemos incluir uma legenda e alterar a cor de cada linha do metrofor.
m <- leaflet(estacoes) %>%
addTiles() %>%
addCircles(~lon[1:10], ~lat[1:10], popup=estacoes$id[1:10], weight = 3, radius=100, color="black", stroke = TRUE, fillOpacity = 0.8) %>%
addCircles(~lon[11:20], ~lat[11:20], popup=estacoes$id[11:20], weight = 3, radius=100, color="red", stroke = TRUE, fillOpacity = 0.8) %>%
addCircles(~lon[21:40], ~lat[21:40], popup=estacoes$id[21:40], weight = 3, radius=100, color="blue", stroke = TRUE, fillOpacity = 0.8) %>%
addLegend("bottomright", colors= c("blue","red","black"), labels= c("Linha Sul","Linha Leste","VLT"), title="Metrofor")%>%
setView (lat=mean(estacoes$lat), lng = mean(estacoes$lon), zoom=12)
mAtravés do endereço: http://leaflet-extras.github.io/leaflet-providers/preview/index.html Podemos obter uma enorme variedade de estilos para o mata, por exemplo, visualização no modo satélite.
m <- leaflet(estacoes) %>%
addProviderTiles("Esri.WorldImagery") %>%
addCircles(~lon[1:10], ~lat[1:10], popup=estacoes$id[1:10], weight = 3, radius=100, color="black", stroke = TRUE, fillOpacity = 0.8) %>%
addCircles(~lon[11:20], ~lat[11:20], popup=estacoes$id[11:20], weight = 3, radius=100, color="red", stroke = TRUE, fillOpacity = 0.8) %>%
addCircles(~lon[21:40], ~lat[21:40], popup=estacoes$id[21:40], weight = 3, radius=100, color="blue", stroke = TRUE, fillOpacity = 0.8) %>%
addLegend("bottomright", colors= c("blue","red","black"), labels= c("Linha Sul","Linha Leste","VLT"), title="Metrofor")%>%
setView (lat=mean(estacoes$lat), lng = mean(estacoes$lon), zoom=12)
mPor fim, um mapa topogáfico:
m <- leaflet(estacoes) %>%
addProviderTiles("Esri.WorldTopoMap") %>%
addCircles(~lon[1:10], ~lat[1:10],popup=estacoes$id[1:10], weight = 3, radius=100, color="black", stroke = TRUE, fillOpacity = 0.8) %>%
addCircles(~lon[11:20], ~lat[11:20], popup=estacoes$id[11:20], weight = 3, radius=100, color="red", stroke = TRUE, fillOpacity = 0.8) %>%
addCircles(~lon[21:40], ~lat[21:40], popup=estacoes$id[21:40], weight = 3, radius=100, color="blue", stroke = TRUE, fillOpacity = 0.8) %>%
addLegend("bottomright", colors= c("blue","red","black"), labels= c("Linha Sul","Linha Leste","VLT"), title="Metrofor")%>%
setView (lat=mean(estacoes$lat), lng = mean(estacoes$lon), zoom=12)
mAlgo interessante també é poder filtar os marcadores por tipo, além de incluir a opção de exibir o rastro do caminho:
map <- leaflet(estacoes) %>%
# baseGroups
addTiles(group = "Visualização padrão") %>%
addProviderTiles("Esri.WorldTopoMap", group = "Topográfico") %>%
addProviderTiles("Esri.WorldImagery", group = "Satélite") %>%
# overlayGroups
addCircles(~lon[1:10], ~lat[1:10], 10,popup=estacoes$id, color="black", stroke = TRUE,
fillOpacity = 0.8, group = "VLT") %>%
addCircles(~lon[11:20], ~lat[11:20], 10,popup=estacoes$id, color="black", stroke = TRUE,
fillOpacity = 0.8, group = "linha leste") %>%
addCircles(~lon[21:40], ~lat[21:40], 10,popup=estacoes$id, color="black", stroke = TRUE,
fillOpacity = 0.8, group = "linha sul") %>%
addPolygons(data = estacoes, lng = ~lon, lat = ~lat,
fill = F, weight = 2, color = "black", group = "rotas") %>%
# Layers control
addLayersControl(
baseGroups = c("Visualização padrão", "Topográfico", "Satélite"),
overlayGroups = c("VLT", "linha leste", "linha sul","rotas"),
options = layersControlOptions(collapsed = FALSE)
)
map