1 Objetivo

Vamos mostrar aqui1 como podemos utilizar como o software R para construir um mapa a partir de um conjunto de dados contendo informações espaciais. O meu primeiro mapa será baseado no conjunto de dados (doravante dataset) da esperança de vida de municípios da microrregião de Fortaleza.

OBS. 1: Apesar de ser Estatístico, não possuo muita experiência com dados geoespaciais, e apesar de ter alguma experiência prévia com o software R estou no inicio do aprendizado com dados geoespaciais no R.

OBS. 2: De forma alguma o que estou fazendo aqui é um substituto para softwares de GIS, como o QGIS. Eu mesmo estou no início de minha jornada no aprendizado do QGIS. O que quero mostrar aqui é que o R é uma ferramenta muito, muito poderosa que faz um número imenso de análises em muitas áreas de conhecimento além de Estatística. Na área de Análise Espacial, como não poderia deixar de ser, o R nos oferece múltiplas possibilidades. Eu pretendo explorar, até onde conseguir (em profundidade - leia-se nível de dificuldade, e em extensão - leia-se leque de possibilidades), estas possibilidades.

OBS. 3: Para visualizar os códigos criados no R, basta clicar nos botões “Code” que aparecem à direita . Para ocultar, basta clicar no botão “Hide”

2 Partindo para a ação

setwd("D:\\PANDORA\\backup_pen_2017-02-27\\R\\geospatial")
library(tidyverse)
## Loading tidyverse: ggplot2
## Loading tidyverse: tibble
## Loading tidyverse: tidyr
## Loading tidyverse: readr
## Loading tidyverse: purrr
## Loading tidyverse: dplyr
## Conflicts with tidy packages ----------------------------------------------
## filter(): dplyr, stats
## lag():    dplyr, stats
library(ggmap)
library(viridis)
## Loading required package: viridisLite

Este é um dataset de aprendizado e de tamanho pequeno, logo é viável construí-lo “from scratch” como abaixo. Em geral, vamos obter a fonte de dados de um BD Geográfico, e precisaremos de métodos para a importação dos dados.

municipio <- c("Aquiraz", "Caucaia", "Eusebio", "Fortaleza", "Guaiuba",
               "Itaitinga", "Maracanau", "Maranguape", "Pacatuba")
esp_vida <- c(67.48, 70.83, 67.48, 69.63, 69.87, 67.48, 70.59, 69.16, 70.89)
esp_fortaleza <- tibble(Municipio = municipio, Esperanca = esp_vida)

Obtivemos as coordenadas geográficas (long,lat) dos municípios em questão pesquisando “coordenada MUNICÍPIO X” no google, e construímos os vetores abaixo:

long <- c(-38.3885,-38.6563,-38.4513,-38.5434,-38.6378,
          -38.529,-38.626,-38.6819,-38.6161)
lat <- c(-3.90254,-3.73454,-3.89029,-3.71839,-4.04185,
         -3.9721,-3.87821,-3.89065,-3.98436)
esp_fortaleza <- esp_fortaleza %>%
  mutate(long=long, lat=lat)
knitr::kable(esp_fortaleza)
Municipio Esperanca long lat
Aquiraz 67.48 -38.3885 -3.90254
Caucaia 70.83 -38.6563 -3.73454
Eusebio 67.48 -38.4513 -3.89029
Fortaleza 69.63 -38.5434 -3.71839
Guaiuba 69.87 -38.6378 -4.04185
Itaitinga 67.48 -38.5290 -3.97210
Maracanau 70.59 -38.6260 -3.87821
Maranguape 69.16 -38.6819 -3.89065
Pacatuba 70.89 -38.6161 -3.98436

3 Obtendo as coordenadas do centro médio aritmético e ponderado:

  • Centro médio aritmético:
CMA <- esp_fortaleza %>%
  summarize(cma_long=mean(long), cma_lat=mean(lat))
  • Centro médio aritmético ponderado:
CMP <- esp_fortaleza %>%
  summarize(cmp_long=sum(long*Esperanca)/sum(Esperanca),
            cmp_lat=sum(lat*Esperanca)/sum(Esperanca))

4 Construção do mapa

De posse do Banco de Dados Geográfico (no nosso exemplo, o dataset esp_fortaleza), podemos agora construir o mapa contendo estas informações. Basicamente, faremos a superposição da camada de dados sobre um mapa da região baixado do google maps via API. O R, com o uso do pacote ggmap, faz o donwload do mapa centrado no CMA, com um dado nível de zoom. Após isso, utilizamos nosso conhecimento em construção de gráficos no estilo ggplot, que implementa no R uma “gramática de gráficos”, que resulta em gráficos estruturados e muito, mas muito bem construídos e com aparência profissional. “Just enough talk”… partamos para a ação:

Os comandos abaixo fazem o download do mapa centrado nas coordenadas do CMA e com parâmetro ‘zoom’ de 11, e constroem a camada de dados sobre os mapas previamente baixados. A escala vai de zoom=3 (continente) até zoom=21 (building). Vamos explorar todas as possibilidades do tipo de mapa, usando todas as opções do parâmetro maptype2:

4.1 Mapas do Goggle:

  • Mapa “terrain” (default):
fort_map <- get_map(location = CMA, zoom=11, maptype = "terrain")
## Map from URL : http://maps.googleapis.com/maps/api/staticmap?center=-3.890326,-38.570033&zoom=11&size=640x640&scale=2&maptype=terrain&language=en-EN&sensor=false
ggmap(fort_map) +
  geom_point(aes(x=long,y=lat, color=Esperanca),
             size = 4, data = esp_fortaleza) +
  scale_color_viridis() +
  geom_text(aes(x=long,y=lat, label=Municipio), 
            nudge_y=0.014, data = esp_fortaleza) +
  annotate("point", x=-38.57003, y=-3.890326,size=2.5, col="red",
           alpha=0.8) +
  annotate("text", x=-38.54, y=-3.9,
           label = "CMA", col="red") +
  annotate("point", x=-38.5715, y=-3.889931,size=2.5, col="blue",
           alpha=0.8) +
  annotate("text", x=-38.595, y=-3.9,
           label = "CMP", col="blue") +
  ggtitle("Meu 1º mapa no R") +
  theme(plot.title = element_text(hjust=0.5))

rm(fort_map)
  • Mapa “satellite”:
fort_map <- get_map(location = CMA, zoom=11,
                       maptype = "satellite")
## Map from URL : http://maps.googleapis.com/maps/api/staticmap?center=-3.890326,-38.570033&zoom=11&size=640x640&scale=2&maptype=satellite&language=en-EN&sensor=false
ggmap(fort_map) +
  geom_point(aes(x=long,y=lat, color=Esperanca),
             size = 4, data = esp_fortaleza) +
  scale_color_viridis() +
  geom_text(aes(x=long,y=lat, label=Municipio), 
            nudge_y=0.014, data = esp_fortaleza) +
  annotate("point", x=-38.57003, y=-3.890326,size=2.5, col="red",
           alpha=0.8) +
  annotate("text", x=-38.54, y=-3.9,
           label = "CMA", col="red") +
  annotate("point", x=-38.5715, y=-3.889931,size=2.5, col="blue",
           alpha=0.8) +
  annotate("text", x=-38.595, y=-3.9,
           label = "CMP", col="blue") +
  ggtitle("Meu 1º mapa no R") +
  theme(plot.title = element_text(hjust=0.5))

rm(fort_map)
  • Mapa “roadmap”:
fort_map <- get_map(location = CMA, zoom=11,maptype = "roadmap")
## Map from URL : http://maps.googleapis.com/maps/api/staticmap?center=-3.890326,-38.570033&zoom=11&size=640x640&scale=2&maptype=roadmap&language=en-EN&sensor=false
ggmap(fort_map) +
  geom_point(aes(x=long,y=lat, color=Esperanca),
             size = 4, data = esp_fortaleza) +
  scale_color_viridis() +
  geom_text(aes(x=long,y=lat, label=Municipio), 
            nudge_y=0.014, data = esp_fortaleza) +
  annotate("point", x=-38.57003, y=-3.890326,size=2.5, col="red",
           alpha=0.8) +
  annotate("text", x=-38.54, y=-3.9,
           label = "CMA", col="red") +
  annotate("point", x=-38.5715, y=-3.889931,size=2.5, col="blue",
           alpha=0.8) +
  annotate("text", x=-38.595, y=-3.9,
           label = "CMP", col="blue") +
  ggtitle("Meu 1º mapa no R") +
  theme(plot.title = element_text(hjust=0.5))

rm(fort_map)
  • Mapa “hybrid”:
fort_map <- get_map(location = CMA, zoom=11,maptype = "hybrid")
## Map from URL : http://maps.googleapis.com/maps/api/staticmap?center=-3.890326,-38.570033&zoom=11&size=640x640&scale=2&maptype=hybrid&language=en-EN&sensor=false
ggmap(fort_map) +
  geom_point(aes(x=long,y=lat, color=Esperanca),
             size = 4, data = esp_fortaleza) +
  scale_color_viridis() +
  geom_text(aes(x=long,y=lat, label=Municipio), 
            nudge_y=0.014, data = esp_fortaleza) +
  annotate("point", x=-38.57003, y=-3.890326,size=2.5, col="red",
           alpha=0.8) +
  annotate("text", x=-38.54, y=-3.9,
           label = "CMA", col="red") +
  annotate("point", x=-38.5715, y=-3.889931,size=2.5, col="blue",
           alpha=0.8) +
  annotate("text", x=-38.595, y=-3.9,
           label = "CMP", col="blue") +
  ggtitle("Meu 1º mapa no R") +
  theme(plot.title = element_text(hjust=0.5))

rm(fort_map)

4.2 Mapa do https://www.openstreetmap.org:

fort_map <- get_map(location = CMA, zoom=11, source = "osm")
ggmap(fort_map) +
  geom_point(aes(x=long,y=lat, color=Esperanca),
             size = 4, data = esp_fortaleza) +
  scale_color_viridis() +
  geom_text(aes(x=long,y=lat, label=Municipio), 
            nudge_y=0.014, data = esp_fortaleza) +
  annotate("point", x=-38.57003, y=-3.890326,size=2.5, col="red",
           alpha=0.8) +
  annotate("text", x=-38.54, y=-3.9,
           label = "CMA", col="red") +
  annotate("point", x=-38.5715, y=-3.889931,size=2.5, col="blue",
           alpha=0.8) +
  annotate("text", x=-38.595, y=-3.9,
           label = "CMP", col="blue") +
  ggtitle("Meu 1º mapa no R") +
  theme(plot.title = element_text(hjust=0.5))
rm(fort_map)

4.3 Mapas do http://maps.stamen.com/#terrain/:

  • Mapa “terrain”:
fort_map <- get_map(location = CMA, zoom=11,maptype = "terrain",
                    source="stamen")
ggmap(fort_map) +
  geom_point(aes(x=long,y=lat, color=Esperanca),
             size = 4, data = esp_fortaleza) +
  scale_color_viridis() +
  geom_text(aes(x=long,y=lat, label=Municipio), 
            nudge_y=0.014, data = esp_fortaleza) +
  annotate("point", x=-38.57003, y=-3.890326,size=2.5, col="red",
           alpha=0.8) +
  annotate("text", x=-38.54, y=-3.9,
           label = "CMA", col="red") +
  annotate("point", x=-38.5715, y=-3.889931,size=2.5, col="blue",
           alpha=0.8) +
  annotate("text", x=-38.595, y=-3.9,
           label = "CMP", col="blue") +
  ggtitle("Meu 1º mapa no R") +
  theme(plot.title = element_text(hjust=0.5))
rm(fort_map)
  • Mapa “watercolor”:
fort_map <- get_map(location = CMA, zoom=11,maptype = "watercolor",
                    source="stamen")
ggmap(fort_map) +
  geom_point(aes(x=long,y=lat, color=Esperanca),
             size = 4, data = esp_fortaleza) +
  scale_color_viridis() +
  geom_text(aes(x=long,y=lat, label=Municipio), 
            nudge_y=0.014, data = esp_fortaleza) +
  annotate("point", x=-38.57003, y=-3.890326,size=2.5, col="red",
           alpha=0.8) +
  annotate("text", x=-38.54, y=-3.9,
           label = "CMA", col="red") +
  annotate("point", x=-38.5715, y=-3.889931,size=2.5, col="blue",
           alpha=0.8) +
  annotate("text", x=-38.595, y=-3.9,
           label = "CMP", col="blue") +
  ggtitle("Meu 1º mapa no R") +
  theme(plot.title = element_text(hjust=0.5))

rm(fort_map)
  • Mapa “toner”:
fort_map <- get_map(location = CMA, zoom=11,maptype = "toner",
                    source="stamen")
ggmap(fort_map) +
  geom_point(aes(x=long,y=lat, color=Esperanca),
             size = 4, data = esp_fortaleza) +
  scale_color_viridis() +
  geom_text(aes(x=long,y=lat, label=Municipio), 
            nudge_y=0.014, data = esp_fortaleza) +
  annotate("point", x=-38.57003, y=-3.890326,size=2.5, col="red",
           alpha=0.8) +
  annotate("text", x=-38.54, y=-3.9,
           label = "CMA", col="red") +
  annotate("point", x=-38.5715, y=-3.889931,size=2.5, col="blue",
           alpha=0.8) +
  annotate("text", x=-38.595, y=-3.9,
           label = "CMP", col="blue") +
  ggtitle("Meu 1º mapa no R") +
  theme(plot.title = element_text(hjust=0.5))

rm(fort_map)

5 Alguns detalhes do mapa

A camada de dados são pontos (geom_point) juntamente com labels (geom_text). A cor é uma “estética”, no sentido que define uma escala que varia com a esperança de vida. Quanto menor, mais escura é a cor, e quanto mais clara, maior.3

Além disso, temos dois pontos não pertencentes ao dataset, CMP e CMA, que são estatísticas derivadas dos dados. Precisamos calcular tais coordenadas, e depois plotá-los (através dos comandos annotate(…)).

6 Conclusões

O mapa resultante está “puro”, inacabado, sem rosa-dos-ventos e outras construções. À medida que meus conhecimentos forem aumentando, o meu mapa será aperfeiçoado.

Críticas construtivas são muito bem-vindas, quem quiser entrar em contato para trocar ideias, estou à disposição.

um grande abraço a todos.


  1. Este relatório em formato HMTL foi totalmente feito no R, através do pacote markdown. Ao escrever, dentro do R com este pacote instalado, vários formatos de arquivo são possíveis ao se renderizar o código-fonte: HTML, PDF, .doc/docx, apresentação em slides. A grande vantagem de se escrever um arquivo markdown é que todas as análises, tabelas e gráficos podem ser organizados em um único documento dinâmico, que pode ser alterado facilmente mudando-se apenas o código-fonte do seu arquivo markdown. Experimente! Leia mais sobre o markdown em http://rmarkdown.rstudio.com/index.html

  2. Exceto o tipo terrain-background, que por algum motivo que não consegui identificar resultou em um erro

  3. A paleta de cores escolhida, viridis, é uma paleta consagrada no campo de visualização de dados, e é oriunda do monumental pacote construtor de gráficos https://matplotlib.org/ da igualmente monumental linguagem de programação https://www.python.org/. É interessante notar que estas paletas viridis também estão disponíveis no QGIS.