31 maio 2016

Importando shapefiles no R

Nenhum comentário:
Importando shapefiles no R

Shapefile é um formato de dados vetoriais geoespaciais muito utilizado em ambientes SIG. O ambiente R permite que se trabalhe com esse tipo de dados. Nesta postagem, quero demonstrar como podemos importar esse tipo de arquivo ao R em duas diferentes maneiras, a fim de plotar mapas utilizando esses dados.

Os tópicos a serem explorados neste tutorial são:

  1. Importar shapefiles e dados de interesse para o R;
  2. Verificar e limpar os dados;
  3. Preparação de variáveis a serem utilizadas no mapa;
  4. Plotar o mapa.

O que é necessário ter instalado em seu computador

  • R instalado e atualizado;
  • Pacotes ‘maptools’ e ‘rgdal’ atualizados.

Aviso importante!

Este tutorial necessita de conhecimentos básicos da linguagem por parte do usuário. Desta forma, caso você queira uma boa fonte para se iniciar na linguagem, recomendo visitar o sítio web da disciplina Preparação de dados para Análise Estatística do Programa de Pós-graduação em Ciências Biológicas (Botânica) do INPA. Lá você encontrará rica oferta de materiais para se familiarizar com o R e ser capaz de seguir este tutorial.


O passo a passo abaixo disponibilizado tenta apresentar os dados de maneira simples. Mas vejam que podemos cumprir a idéia central desta postagem com apenas três linhas.

library(maptools)
paises_shape <- readShapePoly('countries.shp')
plot(paises_shape)

Passo 01 - Estabelecer o diretório de trabalho

Tenho por costume o hábito de estabelecer o diretório de trabalho no início de todo script. Lembre-se de SEMPRE COLOCAR OS ARQUIVOS NECESSÁRIOS para rodar o tutorial DENTRO desta PASTA DE TRABALHO. ADAPTE o TEXTO ABAIXO para a SUA PASTA DE TRABALHO!!!

rm(list = ls()) #limpa a area de trabalho
#estabelece o diretorio de trabalho
setwd('/Users/ricoperdiz/Documents/DOC/PROJETO_DOC/LABOTAM/posts_blog/post_shapefile')

Passo 02 - Baixar shapefiles da web

Existem vários sítios web que disponibilizam shapefiles gratuitamente. Aqui vamos utilizar os dados disponíveis em DIVA-GIS. Clique no link abaixo para obter um arquivo ‘.zip’ contendo os shapefiles a serem utilizados neste tutorial.

Após baixá-lo, deve-se descomprimir os arquivos e colocá-los em sua pasta de trabalho.

ATENÇÃO!!! ACESSE a pasta countries_shp e retire os quatros arquivos, de extensão ‘.shp’, ‘.dbf’, ‘.shx’ e ‘.prj’. PEGUE-OS e COLOQUE-OS na pasta de trabalho. APENAS os arquivos, NÃO INCLUA a pasta countries_shp.

Passo 03 - Importar os dados para a sessão

Os dados estão dispostos em um arquivo ‘.csv’ e estão separados por tabulação e codificados em UTF-8. Baixe-o para seu computador:

Cabe ressaltar que vários formatos podem ser utilizados para importar dados ao R. Utilizo o ‘CSV’ porque é mais simples.


Passo 04 A

USANDO O PACOTE rgdal

#chama o pacote
library('rgdal')

#importa os dados para dentro da sessao
paises_shape <- readOGR(dsn = getwd(), layer = 'countries')

#cria um vetor com nomes de paises que queremos plotar no mapa
paises <- c('Brazil','Argentina','Peru','Paraguay','Ecuador','Chile','Uruguay','French Guiana','Suriname','Venezuela','Colombia','Guyana','Bolivia','Panama','Costa Rica')

#filtra os dados para uma lista de paises
dados <- paises_shape[paises_shape$NAME%in%paises,]

#apaga os dados desnecessarios do shape original
rm(paises_shape)

# DADOS DE OCORRENCIA
# chama os dados de ocorrencia de protium heptaphyllum
# obtido na base de dados do herbario virtual do NYBG
protium <- read.table("dados_phepta_aracouc.csv", header = T, as.is = T, sep = '\t', dec = '.')

############################################################
############################################################
### Vetores

#vetores de lat e long
lat <- protium$decimalLatitude
long <- protium$decimalLongitude

#vetor de amplitude
ylat <- range(lat) + c(-1,1)
xlong <- range(long) + c(-1,1)

#vetor para nomes das especies
spp <- unique(protium$Species)

#vetor de cores para utilizar no mapa
#para cada especie, uma cor
protium$cores.map <- ifelse(protium$Species == spp[1], 'red','black')
cores.map <- protium$cores.map
#cria um vetor de tamanho para cada especie
#como uma coluna de protium
#P heptaphyllum possui uma distribuicao mais ampla
#por isso atribuo um tamanho menor pra ela
protium$cex.p <- ifelse(protium$Species == spp[1], 1, 0.8)

#vetor para os simbolos pch
protium$pontos <- ifelse(protium$Species == spp[1], 21, 24)

############################################################
############################################################
### Plota os dados

plot(dados, xlim = xlong, ylim = ylat)
points(long, lat, pch = protium$pontos , col = protium$cores.map, bg = protium$cores.map, cex = protium$cex.p)
legend(max(long) - 16 , max(lat),legend = spp, pch = unique(protium$pontos), pt.bg = unique(cores.map), cex = 1, x.intersp = 0.8, text.font = 3)

Passo 04 B

USANDO O PACOTE maptools

#chama o pacote
library('maptools')

#le o shapefile e cria um objeto com esses dados
paises_shape <- readShapePoly('countries.shp')

#cria um vetor com nomes de paises que queremos plotar no mapa
paises <- c('Brazil','Argentina','Peru','Paraguay','Ecuador','Chile','Uruguay','French Guiana','Suriname','Venezuela','Colombia','Guyana','Bolivia','Panama','Costa Rica','Belize','El Salvador','Guatemala','Honduras','Nicaragua','Mexico')

#filtra os dados para uma lista de paises
dados <- paises_shape[paises_shape$NAME%in%paises,]

#apaga os dados desnecessarios do shape original
rm(paises_shape)

# DADOS DE OCORRENCIA
# chama os dados de ocorrencia de protium heptaphyllum
# obtido na base de dados do herbario virtual do NYBG
protium <- read.table("dados_phepta_aracouc.csv", header = T, as.is = T, sep = '\t', dec = '.')

############################################################
############################################################
### Vetores

#vetores de lat e long
lat <- protium$decimalLatitude
long <- protium$decimalLongitude

#vetor de amplitude
ylat <- range(lat) + c(-1,1)
xlong <- range(long) + c(-1,1)

#vetor para nomes das especies
spp <- unique(protium$Species)

#vetor de cores para utilizar no mapa
#para cada especie, uma cor
protium$cores.map <- ifelse(protium$Species == spp[1], 'red','black')
cores.map <- protium$cores.map
#cria um vetor de tamanho para cada especie
#como uma coluna de protium
#P heptaphyllum possui uma distribuicao mais ampla
#por isso atribuo um tamanho menor pra ela
protium$cex.p <- ifelse(protium$Species == spp[1], 1, 0.8)

#vetor para os simbolos pch
protium$pontos <- ifelse(protium$Species == spp[1], 21, 24)

############################################################
############################################################
### Plota os dados

plot(dados, xlim = xlong, ylim = ylat)
points(long, lat, pch = protium$pontos , col = protium$cores.map, bg = protium$cores.map, cex = protium$cex.p)
legend(max(long) - 16 , max(lat),legend = spp, pch = unique(protium$pontos), pt.bg = unique(cores.map), cex = 1, x.intersp = 0.8, text.font = 3)

Conclusão

Os comandos aqui apresentados são muito simples, há muito a se explorar em novas postagens, tanto na utilidade das funções aqui apresentadas dos dois pacotes citados (rgdal e maptools) quanto na variedade de shapefiles a serem utilizados. Deixemos para próximas postagens.

Dúvidas, sugestões, elogios, críticas, correções, favor entrar em contato via comentários. Sua opinião é sempre bem vinda.

Caso você encontre algum erro ou tenha tido problemas em rodar os comandos, ficarei muito feliz de poder consertar ou ajudar!

Tenha um bom divertimento e aprendizado!


Para saber mais: