4.2 Objetos complexos

Em alguns casos como, por exemplo, em arquivos de dados espaciais (shapefiles), que apresentam estruturas complexas que incluem as especificações dos polígonos, pontos ou linhas, a projeção espacial e os dados associados, exige-se um objeto que possua uma estrutura de complexidade similar.

Nestes casos, é importante que você conheça o operador @, que permite extrair elementos desses objetos. Em alguns casos você terá que usá-lo para entender o objeto ou para pegar elementos dos mesmos objetos.

A função slotNames() permite ver os elementos que podem ser extraídos com o operador @. Abaixo mostramos um exemplo através de um mapa dos municípios brasileiros. Para isso, vamos precisar baixar um arquivo (https://github.com/LABOTAM/IntroR/blob/main/dados/municipiosshape.zip). Baixe este arquivo comprimido que contem os arquivos de um único shapefile. Descomprima-o na sua pasta de trabalho e você perceberá que haverá vários arquivos associados. Para trabalhar com esses arquivos, vamos utilizar os pacotes maps (Brownrigg 2018) e rgdal (Bivand, Keitt, e Rowlingson 2020).

# vamos precisar de dois pacotes para dados espaciais
# se não tiver instalado, instale com as dependencias
# install.packages(c("maps", "rgdal"), dependencies = TRUE)
library("maps")
library("rgdal")

# agora mudem o diretorio para pasta que contem os arquivos shape
# lembre que voces podem tanto utilizar a funcao `setwd()` quanto clicar em Ferramentas/Tools na barra de opcoes do RStudio para mudar o diretorio de trabalho
dir(pattern = "shp") # lista arquivos shape na pasta
# veja o help da função para ler shapefiles
?readOGR

# le o shape file com objeto espacial no R
mp <- readOGR(dsn = "MUNICIPIOS.shp", layer = "MUNICIPIOS", encoding = "UTF-8")
plot(mp) # veja o mapa

class(mp) # é um objeto de classe SpatialPolygonsDataFrame
str(mp) # a estrutura é complexa

# tem elementos definidos por $, que interpretado diretamente, é corresponde a um data.frame que é o dado associado à cada polígono no arquivo (attribute table do shapefile).
names(mp)
mp$NOME_MUNI
dim(mp)

# tem elementos definidos por @
# ver o help da função
# ?slot
# slotNames(mp) #lista quais são esses elementos


mp@data # é o mesmo data.frame que é automaticamente reconhecido na expressão acima
dim(mp) == dim(mp@data)
names(mp) == names(mp@data)

# area do mapa dos municipios (os limites em latitude e longitude da área)
mp@bbox
plot(mp@bbox)
# adicionamos o mapa mundi sobre isso
map(add = T)

# mp@polygons define cada poligono individualmente numa lista
class(mp@polygons)
mp@polygons[[1]] # um elemento qualquer
class(mp@polygons[[1]])
str(mp@polygons[[1]])

# veja que este objeto tem vários elementos definidos por @
# slotNames(mp@polygons[[1]]) #slots desse objeto
mp@polygons[[1]]@labpt # o centroid do polígono 1 que é o municipio de:
mp@data$NOME_MUNI[1] # Chuí

# qual elemento é manaus?
gp <- grep("Manaus", mp@data$NOME_MUNI)
# pega o polígono de manaus
manaus <- mp@polygons[[gp]]
class(manaus)
str(manaus)

# plota manaus
# dev.off() #fecha dispositivos gráficos podes precisar disso
map(xlim = mp@bbox["x", ], ylim = mp@bbox["y", ])
polygon(manaus@Polygons[[1]]@coords, col = "red")
# centroides do poligono de manaus
ctro <- manaus@Polygons[[1]]@labpt
ctro[2] <- ctro[2] + 1.5 # adiciona 1.5 graus na latitude para não plotar sobre o poligono do municipio
# plota no nome
text(x = ctro[1], y = ctro[2], labels = "Manaus", cex = 0.8)

Referências

Bivand, Roger, Tim Keitt, e Barry Rowlingson. 2020. rgdal: Bindings for the Geospatial Data Abstraction Library. https://CRAN.R-project.org/package=rgdal.
Brownrigg, Ray. 2018. maps: Draw Geographical Maps. https://CRAN.R-project.org/package=maps.