Visualização e exploração de dados espaciais em R

Posted by Marcelo Felix on June 3, 2017

Visualização e exploração de dados espaciais no R

Neste post iremos nos basear no tutorial de Robin Lovelace et. al. (2017) e o material que será utilizado está disponível em seu repositorio no Github, no projeto Creating-maps-in-R.Rproj. Inicialmente, é preciso instalar os seguintes pacotes no R: "ggplot2", "ggmap","rgdal","rgeos","maptools","dplyr","tidyr","tmap"

Feita a instalação dos pacotes necessários, o primeiro passo é abrir a shape file. Aqui iremos nos basear no tutorial de Robin Lovelace et. al. (2017) e o material que será utilizado está disponível no link no projeto Creating-maps-in-R.Rproj.

O shapefile é um formato de arquivo que armazena dados geoespaciais, como posição, forma e atributos, em forma de vetor. No RStudio a abertura desse tipo de arquivo pode ser feita da seguinte forma:

library(rgdal)
lnd <- readOGR(dsn = "data", layer = "london_sport")
head(lnd@data, n = 2)
sapply(lnd@data, class)

A última linha do código mostra que a classe da variável Pop_2001 está classificada como fator, enquanto deveria ser do tipo numérico. Portanto, devemos alterá-la:

lnd$Pop_2001 <-  as.numeric(as.character(lnd$Pop_2001))
sapply(lnd@data, class) 

Uma primeira análise pode ser feita com apenas selecionando as regiões que possuam determinado índice de participação no esporte:

sel <- lnd$Partic_Per > 20 & lnd$Partic_Per < 25
plot(lnd, col = "lightgrey")
plot(lnd[sel,], col = "turquoise", add = TRUE)

Outra análise interessante é a identificação de quadrantes. Essa divisão pode ser feita tendo como base as coordenadas do centroide, que no caso representa o ponto central de Londres.

library(rgeos)
## encontrando o centro da região de londres
lat <- coordinates(gCentroid(lnd))[[1]]
lng <- coordinates(gCentroid(lnd))[[2]]
## argumento para testar se a região está ao norte ou ao leste do centro
norte <-  sapply(coordinates(lnd)[,2], function(x) x > lng)
leste <- sapply(coordinates(lnd)[,1], function(x) x > lat)
oeste <- sapply(coordinates(lnd)[,1], function(x) x < lat)
sul <- sapply(coordinates(lnd)[,2], function(x) x < lng)
## testando se a coordenada está a norte ou leste do centro
lnd@data$quadrant[norte & leste] <- "nordeste"
lnd@data$quadrant[norte & oeste] <- "noroeste"
lnd@data$quadrant[sul & leste] <- "sudeste"
lnd@data$quadrant[sul & oeste] <- "sudoeste"

## colorindo os quadrantes no gráfico
sapply(lnd@data, class)
lnd@data$quadrant <- as.factor(as.character(lnd@data$quadrant))
sapply(lnd@data, class)
plot(lnd, col = "lightgrey")
plot(lnd[norte & leste,],col = "red", add = TRUE)
plot(lnd[norte & oeste,], col = "blue", add = TRUE)
plot(lnd[sul & leste,], col = "green", add = TRUE)
plot(lnd[sul & oeste,], col = "yellow", add = TRUE)

Criando mapas com tmap, ggplot e leaflet

Tmap

A análise pode ser feita gerando um gradiente de cores com base na participação percentual da população no esporte:

library(tmap)
qtm(shp = lnd, fill = "Partic_Per", fill.palette = "-Blues")

ggplot2

Diferentemente do tmap, o ggplot exige que você forneça a base de dados em formado de data.frame. Isto pode ser feito por meio da função fortify():

library(ggplot2)
library(dplyr)
lnd_f <- fortify(lnd)
head(lnd_f, n = 2)
lnd$id <- row.names(lnd) # Atribui um ID para a base sp 
head(lnd@data, n = 2) # ultima checagem antes da junção (os nomes das variáveis precisam ser iguais)
lnd_f <-left_join(lnd_f, lnd@data) # juntou pela única variável com nome em comum
head(lnd_f, n = 2)

Agora o objeto lnd_f pode ser utilizado para a criação de um mapa com ggplot:

map<-ggplot(lnd_f, aes(long, lat, group = group, fill = Partic_Per)) + 
  geom_polygon() + coord_equal() + 
  labs(x = "Easting (m)", y = "Northing (m)", fill = "% Sports\nParticipation") + 
  ggtitle("London Sports Participation")
map
## trocando as cores
map + scale_fill_gradient(low = "red", high = "green")
## salvando o grafico com ggsave
ggsave("Sport Participation - London.jpg")

Mapas interativos com leaflet

O pacote leaflet permite a criação de mapas interativos e age de forma conjunta com o pacote shiny, tornando possível a visualização online dos mapas. O objeto lnd está com um CRS (Coordinate Reference System) que não é compatível com o leaflet. A visualização será possível depois que o CRS do objeto lnd for alterado para o EPSG:4326, que tem sido o mais utilizado:

library(leaflet)
lnd84 <- spTransform(lnd, CRS("+init=epsg:4326")) #reprojeta
leaflet() %>%
   addTiles() %>%
   addPolygons(data = lnd84)

Esse mapa se diferencia dos outros por permitir uma interatividade semelhante à que se tem com a utilização do googlemaps no navegador.

A seguir temos mais um exemplo de visualização de uma determinada região no leaflet, porém agora será utilizado o arquivo shapefile do Distrito Federal, disponível no site do IBGE. Depois de baixar o arquivo e salvá-lo no seu Working Directory atual, o primeiro passo é atribuir o arquivo à um novo objeto, aqui denominado df_shp:

library(raster)
library(sp)
df_shp <- readOGR(dsn = "df_setores_censitarios", layer = "53SEE250GC_SIR")

# Criação do mapa com leaflet
df_shp@proj4string <- CRS("+init=epsg:4326") # reprojeta
df_leaf <- leaflet(data = df_shp) %>% addTiles()%>%
	addPolygons(fill = FALSE, weight = 1, stroke = TRUE, color = "#03F")%>%
	addLegend("bottomright", colors = "#03F", labels = "Distrito Federal")

df_leaf

O código acima segue o mesmo raciocínio do criado para o mapa de Londres, porém com algumas configurações a mais. O arquivo .shp foi inserido diretamente na função leaflet e na função addPolygons foram incluídos os argumentos fill, weight, stroke e color, que representam respectivamente se o interior dos polígonos devem receber alguma cor, a espessura da linha de contorno, se as linhas dos polígonos devem ser coloridas e qual a cor escolhida. A função addLegend cria uma legenda para o mapa. Para mais detalhes sobre funções, basta rodar o seguinte comando: ?nomedafunção.