SAUDAÇÕES!

Seja bem vindo à página do professor Pedro Albuquerque. Para saber mais sobre meu currículo, disciplinas ministradas e interesses de pesquisa, navegue no menu disponível no topo da página.
Mostrando postagens com marcador Mapas temáticos.. Mostrar todas as postagens
Mostrando postagens com marcador Mapas temáticos.. Mostrar todas as postagens

quinta-feira, 15 de dezembro de 2016

Mapas Temáticos usando o R - Parte 2.


Como continuação do post Mapas Temáticos usando o R, mostraremos aqui como é possível unir informações pontuais (Point Process) e dados regionais (Lattice Data) além de unir esses dados com o Google maps.

O primeiro passo é a obtenção da malha (shapefile) e dos dados (DadosMapa.csv) para o processo de georeferenciamento.

O primeiro passo é invocar as bibliotecas necessárias bem como definir o Working Directory no qual o arquivo DadosMapa.csv está e também a pasta Shapes

#Limpa o Working Directory
rm(list=ls())
#Define working directory
setwd("C:\\Blog\\ExemploMapas")
#Invoca os pacotes necessários
library(RColorBrewer)
library(maptools)
library(rgdal)
library(rgeos)
library(RgoogleMaps)
library(sp)
library(spdep)
library(ggmap)
library(plyr)
library(Hmisc)

Em seguida, importamos para o R os dados e a malha de interesse:

#Importa os dados
dados<-read.csv("DadosMapa.csv")
#Lê os shapefiles que estão na pasta Shapes dentro do working directory
sfn <- readOGR("Shapes","11MUE250GC_SIR",verbose = FALSE) 
Uma vez lidos os dados e malhas, é preciso saber qual a região devemos importar do GoogleMaps, para isso fazemos:
#Bounding box a ser utilizada no ggmap
b <- bbox(sfn)
#Cria uma variável ID para o georeferenciamento
sfn@data$id <- rownames(sfn@data)
#Define a projeção (Shapefile)
sfn <- spTransform(sfn, CRS("+proj=longlat +datum=WGS84"))
#Cria um SpatialPointsDataFrame com as latitudes e longitudes dos dados
spdf <- SpatialPointsDataFrame(coords=dados[,c("Longitude","Latitude")], data=dados)
#Define a projeção para os pontos
proj4string(spdf) <-CRS("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0")
#Trasnforma o objeto espacial em um objeto que pode ser lido pelo ggplot2
sfn.df <- fortify(sfn, region="CD_GEOCMU")
#Substring a variável ID para ficar com 6 dígitos (ignora o dígito verificador)
sfn.df$V007<-substr(sfn.df$id,1,6)
#Left Join do CSV com o Shapefile
sfn.df<-merge(sfn.df,dados,by="V007",all.x=T)
#Ordena os dados
sfn.df<-sfn.df[order(sfn.df$order), ] 
Finalmente, após a união dos dados com o Shapefile podemos construir o mapa. Para isso passamos como argumento do ggmap a bounding box obtida nos passos anteriores e definimos também as cores, escalas, títulos do mapa:
#Aumenta ou diminui a Bounding Box (aumenta em 1%)
bbox <- ggmap::make_bbox(sfn.df$long, sfn.df$lat, f = 0.1)
#Escolhe as cores
myPalette <- colorRampPalette(rev(brewer.pal(11, "Spectral")))
#Obtêm o mapa do Google Maps (Existem outras possibilidades...)
map <- get_map(location=bbox, source='google', maptype = 'terrain', color='bw')
#Constrói o mapa:
map <- ggmap(map, base_layer=ggplot(data=sfn.df, aes(x=long, y=lat)), 
             extent = "normal", maprange=FALSE)
map <- map + geom_polygon(data=sfn.df,aes(x = long, y = lat, group = group, fill=Valor), alpha = .6)  
map <- map +   geom_path(aes(x = long, y = lat, group = group),
                         data = sfn.df, colour = "grey50", alpha = .7, size = .4, linetype=2)  
map <- map + coord_equal() 
map <- map + scale_fill_gradientn(colours = myPalette(4))
map<-map+  geom_point(aes(x=Longitude, y=Latitude),color="black", size=1,
                      alpha = 0.70,
                      data=spdf@data)
map<-map +  ggtitle("Postos SINE") +  labs(x="Longitude",y="Latitude") 
#Plota o mapa
plot(map)
Pode-se ainda definir outras bases para o shapefile, alguns exemplos são apresentados a seguir:
##Pode-se trocar o código:
map <- get_map(location=bbox, source='google', maptype = 'terrain', color='bw')
##Do bloco anterior, por algum desses outros:
#map <- get_map(location=bbox, source='osm', color='bw'))
#map <- get_map(location=bbox, source='stamen', color='watercolor'))
#map <- get_map(location=bbox, source='stamen', color='toner'))
#map <- get_map(location=bbox, source='stamen', color='terrain'))
#map <- get_map(location = bbox, source = 'google', maptype = 'terrain')
#map <- get_map(location = bbox, source = 'google', maptype = 'satellite')
#map <- get_map(location = bbox, source = 'google', maptype = 'roadmap')
#map <- get_map(location = bbox, source = 'google', maptype = 'hybrid')

segunda-feira, 15 de agosto de 2016

Mapas Temáticos usando o R.


Mapas Temáticos são muito utilizados na etapa de Análise Espacial Exploratória, a qual tem por principal objetivo apresentar visualmente a existência de algum possível padrão espacial.

O objetivo desse post é apresentar como é possível construir Mapas Temáticos usando o R.

O primeiro passo é a obtenção de uma malha digital. Usualmente, uma malha digital é um conjunto de pelo menos três arquivos com o mesmo nome, mas extensões diferentes (*.dbf,*.shx,*.shp). Essa malha nada mais é do que as delimitações geográficas do mapa de interesse. Por exemplo, suponha que desejamos construir um Mapas Temático para os municípios brasileiros, precisamos então da malha municipal.

O principal repositório de malhas digitais no Brasil é do IBGE. Nesse link (ftp://geoftp.ibge.gov.br/malhas_digitais/) podemos obter as mais diversas malhas digitais. Nesse exercício trabalharemos com a malha municipal de 2005.

O código a seguir lê a malha digital (55mu2500pc) e cria uma outra malha somente com o contorno das Unidades da Federação:

#Limpa o Workspace
rm(list=ls())
#Chama a biblioteca
library(ggplot2)
library(rgdal)
library(plyr)
library(rgeos)
#Carrega o objeto SpatialPolygon
br <- readOGR(dsn = ".", "55mu2500pc", verbose=FALSE)
#Faz o dissolve para as UF's
UF <- gUnaryUnion(br, id = br@data$UF)
UF <- fortify(UF, region="UF")
Em seguida, precisamos obter um conjunto de dados que desejamos plotar no mapa. Esse conjunto deve possuir pelo menos uma variável identificada pelo Código do Município também presente na malha 55mu2500pc. Vamos usar como exercício os dados do IpeaData (basta pesquisar no campo Regional pelo tema "Número de homicídios" ou baixe o arquivo aqui.).
#Lê os dados
all_content <- readLines("ipeadata.csv")
#Pula o nome das colunas
skip_first = all_content[-1]
#Lê os dados
indice<- read.csv2(textConnection(skip_first), header = TRUE, stringsAsFactors = FALSE)
#Transforma o NA em zero
indice[is.na(indice)] <- 0
#Corrige o nome dos municípios enconding
indice[,3]<-iconv(indice[,3], "UTF-8", "LATIN2")
indice<-indice[,-9]
colnames(indice)<-c("Sigla","Codigo","Mun","C2005","C2006","C2007","C2008","C2009")

#Renomeia as colunas
indice$GEOCODIGO<-as.character(indice$Codigo)
#Indice de Criminalodade em 2005
indice$Indice<-indice$C2005/sum(indice$C2005)
#Cria as categorias
indice$Categorias1<-cut(indice$Indice,c(0, 0.25,0.50,0.75,1),
                     labels=c('<0.25','0.25|-0.50','0.50|-0.75','>=0.75'))
#Categorias por quartil
breaks<-c(quantile(indice$Indice, probs = seq(0, 1, by = 0.25)))
breaks[1]<-breaks[2]-1e-5
indice$Categorias2<-cut(indice$Indice, breaks=breaks, 
  labels=c("1º Quartil","2º Quartil","3º Quartil","4º Quartil"),
  include.lowest=TRUE)
Agora é preciso unir os dados com a malha:
#Faz o merge com os dados
br@data$id <- rownames(br@data)
#Caso o código tenha apenas 6 dígitos: br@data$IBGE<-substr(br@data$GEOCODIGO,1,6)
br@data   <- join(br@data, indice, by="GEOCODIGO")
#Cria o objeto para ggplot2
br.df <- fortify(br)
br.df <- join(br.df,br@data, by="id")
Em seguida fazemos o mapa:
#Define as cores do mapa
library(RColorBrewer)
myPalette <- colorRampPalette(brewer.pal(11, "Spectral"))
#Faz o mapa
Map <- ggplot(br.df, aes(long, lat)) + geom_polygon(aes(group = group, fill = Categorias2)) + 
  coord_equal() + labs(x = "Longitude", y = "Latitude", fill = "Criminalidade\nRegional") + 
  ggtitle("Índice:\n Criminalidade Regional") + 
  geom_polygon(data=UF, aes(group=group), alpha=1,colour="black", fill=NA, size=0.5)
Map
Caso deseje fazer o mapa com o valor numérico também é possível usar o argumento scale_fill_gradientn:
#Faz o mapa
Map2 <- ggplot(br.df, aes(long, lat)) + geom_polygon(aes(group = group, fill = Indice)) + 
  coord_equal() + labs(x = "Longitude", y = "Latitude", fill = "Criminalidade\nRegional") + 
  ggtitle("Índice:\n Criminalidade Regional") + 
  scale_fill_gradientn(colours = myPalette(4))+
  geom_polygon(data=UF, aes(group=group), alpha=1,colour="black", fill=NA, size=0.5)
Map2

sábado, 29 de setembro de 2012

QGIS - Aplicações em geomarketing - Parte 3.


Nesse post mostrarei como elaborar mapas temáticos no Quantum Gis.

Mapas temáticos são úteis quando deseja-se apresentar geograficamente variáveis oriundas de algum banco de dados.

Para o exercício contido aqui é importante que o leitor tenha reproduzido os exercícios dos posts anteriores (Parte 1 e Parte 2), assim a compreensão será completa.

Elaborando mapas temáticos.

Para executar esse exercício faça o download da malha digital de columbus. No arquivo Dados Columbus.zip os principais itens são:

  • Columbus.shp
  • Dados.dbf

Lembrando que para trabalhar com mapas no formato digital é necessário pelo menos três arquivos: *.shp, *.shx e *.dbf. Todos com o mesmo nome, por exemplo, Columbus.shp, Columbus.shx e Columbus.dbf.

Além desses arquivos, pode ser interessante adicionar a tabela do mapa outras variáveis. No caso da malha Columbus.shp a tabela com os dados chama-se Dados.dbf.

O Quantum Gis aceita a importação de arquivos em diversos formatos, o mais comum é o formato *.dbf.

Isso não é uma restrição a sua análise, já que softwares como Excel, Access, Open Office, SPSS, SAS, R, etc. são capazes de converter suas bases nativas para o formato *.dbf.

Particularmente, o software que eu mais gosto para fazer esse tipo de conversão é o StatTransfer (o problema é que ele não é gratuito).

Realizando o JOIN entre as tabelas do mapa e base de dados.


Para realizar a união (join) entre os dados (Dados.dbf) e a malha (Columbus.shp) é necessário inicialmente que ambos os arquivos possuam uma variável chave essa variável será responsável pela determinação de quais observações da base de dados (Dados.dbf) estarão associadas aos polígonos da malha digital (Columbus.shp).

É importante que as variáveis tenham o mesmo formato, isso é, se uma é caractere a outra variável deverá ser caractere, se é numérica, ambas devem ser numéricas. Se uma tem 6 dígitos a outra também deverá ter seis dígitos.

Graficamente, podemos representar da seguinte forma:


Uma boa prática é utilizar variáveis chave que sejam numéricas. Assim evitamos problemas com acentuação, letras maiúsculas, minúsculas, etc..

Usualmente, as principais variáveis chave são:

  • Código do município.
  • Código do setor censitário.
  • CEP.

No caso do nosso exercício, a variável chave chama-se POLYID em ambos os arquivos Dados.dbf e Columbus.shp.

Adicionando a malha no ambiente QGis.

Como demonstrado nos posts anteriores, admita que a malha já esteja projetada e adicionada no ambiente QGis.

Graficamente, devemos ter algo como:


Em seguida devemos fazer a junção (join) entre os dados (Dados.dbf) e a malha (Columbus.shp) para isso arraste o arquivo Dados.dbf para o ambiente QGis. Essa base aparecerá no campo Layers como mostrado abaixo:


Em seguida, clique com o botão direito do mouse sobre o Layer columbus e escolha a opção Properties. Na tela que surge clique na aba Joins.


Clique no botão "soma" e assim surgirá o seguinte formulário:


A variável chave em ambos os campos é POLYID. Em seguida clique no botão OK:


Finalmente, clique no botão Apply e posteriormente no botão OK. Para saber se as variáveis foram adicionadas corretamente, clique com o botão direito do mouse sobre o Layer columbus e escolha a opção Open Attribute Table. Se o procedimento foi realizado corretamente, haverá novas variáveis na base de dados do Layer columbus. Essa malha com novas variáveis pode ser salva, evitando assim a repetição de procedimento no futuro.

Pintando o mapa.

Agora, podemos visualizar a distribuição da criminalidade em Columbus, para isso, faremos um mapa temático.

O primeiro passo é clicar com o botão direito do mouse sobre o Layer columbus e escolher a opção Properties. Na tela que surge escolha a aba
Style:


Escolha então a opção Graduated:


Na caixa Column escolha a variável que desejamos representar espacialmente (aqui será a variável CRIME), na caixa Mode há algumas opções, aqui escolheremos a opção Natural Breaks (Jenks) que minimiza a variância interna em cada uma das classes. O número de classes escolhidas aqui é 5 e pintaremos o mapa na escala de laranjas:


Clique no botão Apply e posteriormente no botão OK. O resultado é o seguinte:


Para exportamos o mapa final para um formato de imagem procedemos da seguinte forma: clique no botão New Print Compose:


Na tela que surge, clicamos no botão Add New Map e com o mouse definimos onde gostaríamos que o mapa estivesse na imagem:


Usando o mouse representamos onde o mapa deverá estar:


Para adicionar a legenda, clicamos no botão Add new legend:


Novamente usando o mouse posicionamos onde a legenda deverá estar. Por fim usando a janela Item properties podemos editar as opções da legenda:


Para salvar o mapa fazemos File → Export as PDF.... É claro que você pode salvar a imagem em outros formatos também.