- 9 - Manuais workshops treinamentos e dicas
- Trabalhando com dados espaciais no R
Trabalhando com dados espaciais no R
O ODR antigo disponibiliza indicadores de desenvolvimento regional georreferenciados, isto é, associados a elementos com localização (latitude e longitude) conhecida em alguma região da superfície terrestre. Antes da divulgação na plataforma online, os dados são estruturados de acordo com um "espelho" de dados, um modelo em .xls fixo com colunas predeterminadas em que os dados só podem ser discriminados por ano e unidade geográfica. Além disso, esse modelo aceita apenas um indicador por tabela. Os dados preenchidos nessa estrutura são carregados em um banco de dados e o georreferenciamento é feito através de um comando sql.
Infere-se que a motivação para tal estrutura deve-se principalmente à necessidade de automação da etapa de georreferenciamento através de comandos do PostGIS, uma espécie de plug-in do PostgreSQL para dados espaciais. Tal ferramenta é útil, dentre inúmeras outras razões, por permitir manipulação em dados espaciais com mais rapidez e simplicidade, principalmente a operação que associa múltiplas informações a um mesmo polígono espacial (por exemplo, dados anuais de PIB para o mesmo polígono que representa o município de Campinas).
Esta página apresenta uma forma alternativa, via software R, para executar procedimentos cruciais com dados espaciais. Mais especificamente, serão apresentados comandos que executam:
- Consolidação de malha microrregional a partir dos shapefiles divulgados pelo IBGE;
- Georreferenciamento de dados microrregionais usando ferramentas do próprio R, disponíveis nos pacotes sp e maptools;
- Georreferenciamento de dados microrregionais em PostGIS, usando conexão com banco PostgreSQL via R.
Os comandos em R para exemplificação desses métodos serão disponibilizados ao longo da página. Para reproduzi-los, basta copiar os códigos e colar em um script R para então executá-los.
1 - Carregando e criando shapefiles de dados municipais
O processo de georreferenciamento consiste em associar uma informação à sua localização geográfica. Mais precisamente, a informação é associada a um elemento geográfico que pode ser
- polígono: uma sequência de pontos (coordenadas geográficas) e linhas que definem os limites de uma determinada área, que pode ser um município, UF, macrorregião, um país, etc.
- linha: sequência de pontos e linhas, não necessariamente definindo uma região delimitada
- ponto: uma coordenada geográfica, que pode ser a localização de uma ocorrência (processos pontuais) ou ter algum valor numérico associado (dados de superfície)
Nesta página serão apresentados exemplos de dados associados a polígonos, que é o caso mais comum. Vale salientar, entretanto, que os pacotes sp e maptools trabalham também com os outros tipos de dados.
Em dados municipais, o georreferenciamento é feito quando se associa a cada polígono de uma malha municipal, uma ou mais estatísticas referentes ao município que este polígono representa. No Brasil, essa associação é feita principalmente através do Código Municipal do IBGE. Uma vez que cada código IBGE identifica um polígono de um município específico, a relação é possível quando a informação tabular, não georreferenciada, utiliza esse mesmo código para identificar os municípios.
1.1 - Consolidando malha de microrregiões via R
Dados espaciais geralmente são armazenados em formato shp (e são acompanhados por arquivos auxiliares com o mesmo nome, mas em formatos diferentes). Os polígonos dos municípios brasileiros são disponibilizados ao público pelo IBGE nas malhas digitais municipais, a mais recente considerando a divisão política de 2013.
Nessa etapa, iremos executar comandos que fazem o download automático das malhas de microrregião separadas por UF e consolidá-las em um novo shapefile nacional com as microrregiões. O resultado das operações abaixo é a malha nacional de microrregiões armazenada nesse arquivo. Caso queira pular essa etapa, basta baixar e descompactar o arquivo no link e seguir para a seção 1.2.
Os dados disponibilizados contém as malhas de município, microrregião, mesorregião e macrorregião separadas por UF. Os comandos a seguir fazem o download desses arquivos e os descompacta em uma pasta de destino. É necessário instalar o pacote "RCurl" antes da execução.
# local ftp das malhas
ftp.path <- "ftp://geoftp.ibge.gov.br/malhas_digitais/municipio_2013/"
# all.files: é uma lista todos os subdiretórios do ftp acima
all.files <- getURL( ftp.path , dirlistonly = TRUE )
all.files <- scan( text = all.files , what = "character", quiet = T )
# escolher o diretório local de destino para as malhas. No arquivo escolhido, é criado o diretório "originais"
dir.malha <- choose.dir()
dir.create(file.path(dir.malha,"originais"))
dest.files <- file.path(dir.malha,"originais")
# cria arquivo temporário onde as malhas, zipadas, serão armazenadas
tf <- tempfile()
### baixando todos os arquivos no ftp
for ( curFile in all.files ){
## execução somente nos diretórios
if(!grepl("Leia",curFile)){
## endereço diretório ftp da UF
data.file <- paste0( ftp.path , curFile , "/")
## listando arquivos no diretorios
dir.files <- getURL(data.file, dirlistonly = TRUE)
dir.files <- scan( text = dir.files , what = "character", quiet = T )
## baixando cada arquivo da UF
for(arquivo in dir.files){
arquivo.web <- paste0(data.file,arquivo)
download.file( arquivo.web , tf , mode = "wb" )
## cria diretório da UF
dir.create(file.path(dest.files,curFile))
## descompactando arquivo
unzipped.files <- unzip( tf , exdir = file.path(dest.files,curFile))
Sys.sleep(3)
}
} else{
## agora sim, baixando o "leia-me"
data.file <- paste0(ftp.path,curFile)
download.file( data.file ,file.path(dest.files,curFile),mode="wb")
}
}
O objetivo agora é criar um só arquivo com a malha de microrregiões do Brasil, que está separada por UFs. Para isso será necessário:
- Carregar os shapefiles
- Concatenar os polígonos
- Salvar os polígonos unidos em um novo shapefile
Para carregar o shapefile de polígonos, o pacote maptools diponibiliza a função readShapePoly, que lê o arquivo .shp e armazena em um objeto de classe "sp". É necessário informar o nome da coluna identificadora dos polígonos no argumento "IDvar". Segundo a documentação das malhas de 2013, para as microrregiões essa coluna é "CD_GEOCMI". Os comandos abaixo carregam os shapes de microrregião do estado de São Paulo (código 35) e Rio de Janeiro (código 33). Antes de executar, é necessário instalar os pacotes sp e maptools.
library(sp)
library(maptools)
# diretório de trabalho na pasta selecionada
setwd(dest.files)
# carregando malha de microrregiões de são paulo
sp_poly <- readShapePoly("SP/35MIE250GC_SIR.shp",IDvar="CD_GEOCMI")
rj_poly <- readShapePoly("RJ/33MIE250GC_SIR.shp",IDvar="CD_GEOCMI")
Existindo dois objetos sp carregados no R, a função spRbind concatena ambos formando um novo objeto sp. Os comandos abaixo concatenam os shapes carregados anteriormente. Logo após, três mapas são plotados no R: i) Polígonos de São Paulo, ii) Polígonos do Rio de Janeiro e iii) Polígonos concatenados das duas regiões.
concat_poly <- spRbind(sp_poly,rj_poly)
# mapas
plot(sp_poly)
plot(rj_poly)
plot(concat_poly)
Polígonos de microrregiões do estado de São Paulo
Polígonos de microrregiões do estado do Rio de Janeiro
Polígonos anteriores concatenados em um só
Conhecendo a dinâmica do processo, basta executar um comando iterativo (um for) para carregar os shapefiles de cada subdiretório e concatenar em um objeto sp final, seguindo os comandos abaixo. Ao final do for, o mapa abaixo é desenhado contendo os polígonos concatenados
# for na lista de ufs. cada uf nomeia um diretorio
for (uf in lista_ufs){
## pegando os nomes dos shapes de microrregião (padrão xxMIxxxx.shp)
shape <- list.files(uf,pattern="MI.*\\.shp")
## lendo os arquivos .shp que têm o padrão acima
shp <- readShapePoly(file.path(uf,shape),IDvar="CD_GEOCMI")
## se existe 'malha_bra_prov', novo shape será concatenado nele. Caso contrário, 'malha_bra_prov' será o primeiro shape
if(exists("malha_bra_prov")){
malha_bra_prov <- spRbind(malha_bra_prov,shp)
} else{
malha_bra_prov <- shp
}
}
# renomeando shape resultante e excluindo o provisório
malha.bra.micro <- malha_bra_prov
rm(malha_bra_prov)
# vendo o mapa do Brasil
plot(malha.bra.micro,col="red")
Polígonos de microrregiões do Brasil criados no R.
Finalmente, para salvar o objeto sp e criar um novo shapefile, basta executar o comando writeShapePoly() do pacote maptools. O comando salva além da extenção .shp os arquivos .shx e .dbf.
Todo o procedimento acima pode ser realizado para as demais divisões territoriais do Brasil disponibilizadas pelo IBGE (municípios, mesorregiões e UF).
1.2 - Georreferenciando dados: relação um para um
Considere a base de População Estimada (TAB_0002.csv). Esses dados estão em formato tabular, mas queremos georreferenciar esta informação, ou seja, construir um arquivo shp que armazene não só os atributos geográficos dos polígonos (coordenadas, área, etc.), mas também os valores anuais de população.
Nesta base os códigos dos municípios estão com 6 dígitos, enquanto os polígonos são identificados pelo código IBGE a 7 dígitos. Para obter o código correto, um merge será feito com a base dtb (Divisão Territorial do Brasil, TAB_0005.csv), que contém o código a 7 dígitos. A sequência de comandos abaixo irá carregar ambas as bases, criará o código a 6 dígitos na base dtb e executará o merge entre as duas bases.
pasta.ODR <- "//MISRV54/cgma-dados/BASES_NOVO_ODR/Bases Consolidadas"
### carregando base de pop_est municipal
pop_est <- read.csv2(file.path(pasta.ODR,"TAB_0002.csv"))
### carregando base dtb (divisão territorial brasileira)
dtb <- read.csv2(file.path(pasta.ODR,"TAB_0005.csv"))
### dentro da dtb, criando codigo a 6 dígitos
dtb <- within(dtb,codigo_mun6 <- substr(codigo_mun7,1,6))
## mergeando para pegar codigo a 7 dígitos
pop_est <- merge(pop_est,dtb[c("codigo_mun6","ano","codigo_mun7")],by=c("codigo_mun6","ano"))
## transformando codigo de inteiro para character
pop_est$codigo_mun7 <- as.character(pop_est$codigo_mun7)
Agora que a base pop_est contém os mesmos códigos dos polígonos, o georreferenciamento pode ser feito. Para isso, é necessário carregar a malha municipal consolidada na seção anterior. O pacote maptools executa essa operação através da função readShapePoly:
### malha municipal de 2013:
malha.bra.mun13 <- readShapePoly(file.path("Malhas 2013","municipal","malha_bra_mun13.shp"))
A malha carregada e salva na variável malha.bra.mun13 é um objeto do tipo sp. Essa classe é um objeto com vários componentes armazenados em slots. O slot "data" armazena os atributos dos polígonos, enquanto o slot "polygons" contém as coordenadas que definem os limites de cada região, além de outros metadados como área, centróide, etc. O código abaixo exemplifica mostra a classe e os diferentes slots de dados.
[1] "SpatialPolygonsDataFrame"
attr(,"package")
[1] "sp"
> slotNames(malha.bra.mun13)
[1] "data" "polygons" "plotOrder" "bbox" "proj4string"
Uma vez que temos na workspace do R a malha municipal e a base de população estimada, o georreferenciamento da última é feita através de um merge específico do pacote sp. Para testar essa funcionalidade, faremos um filtro obtendo apenas a população de 2013.
pop_est2013 <- subset(pop_est,ano==2013)
## merge com a malha
pop_est2013_geo <- merge(malha.bra.mun13,pop_est2013,by.x="SP_ID",by.y="codigo_mun7",all.y=T)
Os comandos abaixo confirmam que trata-se de um dado espacial (classe "sp"). O comando View no slot "data" permite visualizar os atributos dos polígonos, que agora contém as informações da base "pop_est2013".
[1] "SpatialPolygonsDataFrame"
attr(,"package")
[1] "sp"
> slotNames(pop_est2013_geo)
[1] "data" "polygons" "plotOrder" "bbox" "proj4string"
> View(pop_est2013_geo@data)
A base de população georreferenciada pode ser salva em arquivo .shp. O comando writeShapePoly() do pacote sp exporta os dados para esse formato, criando também os complementos em .dbf e .shx.
{{code language="R}}
Exportando teste
writePolyShape(pop_est_sp_teste,"shape_pop_est_teste2")
{{/code}}