zz: Baixando e Consolidando Malhas do IBGE 2013

Last modified by Gustavo Basso on 2016/07/24 17:28

   O IBGE divulga ao público as malhas digitais da divisão territorial brasileira. Nessa página serão ilustrados alguns comandos em R que executam o download automático dos shapefiles (separados por UF) e que consolidam as malhas (ou, na linguagem do ArcGIS, fazem o "append" das malhas) em um novo shapefile. As malhas mais recentes consideram a divisão política de 2013.
    Os dados disponibilizados pelo IBGE contém as malhas de município, microrregião, mesorregião e macrorregião. Nessa página o foco será dado nas malhas de microrregião. Os comandos em R serão exibidos ao longo do texto que segue. Para reproduzi-los, basta copiar os códigos e colar em um script R para então executá-los. As principais funcionalidades usadas aqui estão disponíveis nos pacotes sp e maptools;. O resultado das operações abaixo é a malha nacional de microrregiões que será armazenada no novo shapefile.

1. Download de todas as malhas

Nos comandos abaixo há um looping que irá acessar cada diretório do ftp de malhas linkado acima, e fazer o download automático dos arquivos zipados em seu conteúdo. Logo após, os arquivo são descompactadas e armazenadas no diretório especificado em 'dir.malhas', que é um diretório escolhido por você em uma janela que o R irá abrir. Antes de executar, é necessário instalar o pacote "RCurl".

library(RCurl)

# 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")
  }    
 
}

2. Carregando e concatenando dois objetos sp

     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:

  1. Carregar os shapefiles
  2. Concatenar (fazer o "append") os polígonos
  3. 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. 

# criando novo 'sp' juntando são paulo e rj
concat_poly <- spRbind(sp_poly,rj_poly)

# mapas
plot(sp_poly)
plot(rj_poly)
plot(concat_poly)

poligonos_sp.png
Polígonos de microrregiões do estado de São Paulo

poligonos_rj.png
Polígonos de microrregiões do estado do Rio de Janeiro

poligonos_concat.png
Polígonos anteriores concatenados em um só

3. Carregando todas as malhas e concatenando em um só objeto sp

   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


## lista de UFs no diretório
lista_ufs <- list.dirs()[-1]

# for na lista de ufs. cada uf da listanomeia um diretorio
for (uf in lista_ufs){
 
  ## no diretório da uf, 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")

poligonos_brasil.png
Polígonos de microrregiões do Brasil consolidados no R.

4. Salvando objeto sp em novo shapefile

    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.

writePolyShape(malha.bra.micro,file.path(dir.malha,"malha_bra_mun13.shp"))

    Todo o procedimento acima pode ser realizado para as demais divisões territoriais do Brasil disponibilizadas pelo IBGE (municípios, mesorregiões e UF).

5 - Referências

  1. Pacote sp;
  2. Pacote maptools;
  3. Leia-me da malha 2013
Tags:
Created by Wesley Silva on 2015/09/10 20:26
    
This wiki is licensed under a Creative Commons 2.0 license
XWiki Enterprise 6.3 - Documentation