Aplicação
Para a aplicação será reproduzido o exemplo do TBEP R Training. Para isso, serão instalados os pacotes sf
e mapview
.
options(repos = list(CRAN="http://cran.rstudio.com/"))
options("install.lock"=FALSE)
install.packages(c('sf','mapview'))
library(sf)
library(mapview)
library(ggplot2)
install.packages("tidyverse")
#library(tidyverse)
O shapefile “sgdat.shp” são dados da cobertura de algas marinhas em Tampa Bay em 2016. As “features” são as linhas do vetor e os “fields” são as colunas, ou melhor, atributos (“OBJECT ID” e “FLUCCS”). O SGR do arquivo é WGS 84. A coluna “geometry” armazena os dados espaciais (longitude e latitude).
Esse é o passo a passo de como importar um shapefile. Porém, muitas vezes não possuímos um shapefile e queremos criar um a partir de um dataframe. Para isso, é necessário que o dataframe inclua as coordenadas geográficas (longitude e latitude) e que tenhamos conhecimento do SGR. O dataframe ´fishdat´ possui as características dos peixes encontrados e o statloc apresenta a localização deles. O passo a passo será realizado abaixo.
# dados da presença de peixes em Tampa Bay
<- read.csv("Data/fishdat.csv")
fishdat
#localização geográfica dos peixes
<- read.csv("Data/statloc.csv") statloc
# estrutura dos dados
str(fishdat)
## 'data.frame': 2844 obs. of 12 variables:
## $ OBJECTID : int 1550020 1550749 1550750 1550762 1550828 1550838 1550842 1551131 1551311 1551335 ...
## $ Reference : chr "TBM1996032006" "TBM1996032004" "TBM1996032004" "TBM1996032207" ...
## $ Sampling_Date: chr "1996-03-20" "1996-03-20" "1996-03-20" "1996-03-22" ...
## $ yr : int 1996 1996 1996 1996 1996 1996 1996 1996 1996 1996 ...
## $ Gear : int 300 22 22 20 160 300 300 300 300 22 ...
## $ ExDate : chr "2018-04-12 10:27:38" "2018-04-12 10:25:23" "2018-04-12 10:25:23" "2018-04-12 10:25:23" ...
## $ Bluefish : int 0 0 0 0 0 0 0 0 0 0 ...
## $ Common.Snook : int 0 0 0 0 0 0 0 0 0 0 ...
## $ Mullets : int 0 0 0 0 0 0 0 0 0 0 ...
## $ Pinfish : int 0 54 0 80 0 0 0 0 1 1 ...
## $ Red.Drum : int 0 0 1 0 4 0 0 0 0 0 ...
## $ Sand.Seatrout: int 1 0 0 0 0 1 5 66 0 0 ...
str(statloc)
## 'data.frame': 2173 obs. of 3 variables:
## $ Reference: chr "TBM1996032006" "TBM1996032004" "TBM1996032207" "TBM1996042601" ...
## $ Latitude : num 27.9 27.9 27.9 28 27.9 ...
## $ Longitude: num -82.6 -82.6 -82.5 -82.7 -82.6 ...
Para isso, utilizaremos a função st_as_sf()
para transformar o dataframe em um objeto sf. Primeiramente, precisamos juntar os dois datasets (fishdat e statloc) e dizer qual coluna que possui os dados da geometria (latitude e longitude). Além disso, é necessário dizer qual o SGR e, além disso, precisamos garantir que ambos datasets possuam o mesmo SGR. Por enquanto, podemos fazer um “chute calibrado” que é o WGS84.
#juntando os dois dataframes
library(dplyr)
<- left_join(fishdat,statloc,by="Reference")
joindata
#criando o objeto de dados espaciais
<- st_as_sf(joindata, coords=c('Longitude','Latitude'), crs = st_crs(sgdat))
joindata
#tipo de objeto sf
str(joindata)
## Classes 'sf' and 'data.frame': 2844 obs. of 13 variables:
## $ OBJECTID : int 1550020 1550749 1550750 1550762 1550828 1550838 1550842 1551131 1551311 1551335 ...
## $ Reference : chr "TBM1996032006" "TBM1996032004" "TBM1996032004" "TBM1996032207" ...
## $ Sampling_Date: chr "1996-03-20" "1996-03-20" "1996-03-20" "1996-03-22" ...
## $ yr : int 1996 1996 1996 1996 1996 1996 1996 1996 1996 1996 ...
## $ Gear : int 300 22 22 20 160 300 300 300 300 22 ...
## $ ExDate : chr "2018-04-12 10:27:38" "2018-04-12 10:25:23" "2018-04-12 10:25:23" "2018-04-12 10:25:23" ...
## $ Bluefish : int 0 0 0 0 0 0 0 0 0 0 ...
## $ Common.Snook : int 0 0 0 0 0 0 0 0 0 0 ...
## $ Mullets : int 0 0 0 0 0 0 0 0 0 0 ...
## $ Pinfish : int 0 54 0 80 0 0 0 0 1 1 ...
## $ Red.Drum : int 0 0 1 0 4 0 0 0 0 0 ...
## $ Sand.Seatrout: int 1 0 0 0 0 1 5 66 0 0 ...
## $ geometry :sfc_POINT of length 2844; first list element: 'XY' num -82.6 27.9
## - attr(*, "sf_column")= chr "geometry"
## - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA NA NA NA NA NA NA NA NA ...
## ..- attr(*, "names")= chr [1:12] "OBJECTID" "Reference" "Sampling_Date" "yr" ...
#checando SGR
st_crs(joindata)
## Coordinate Reference System:
## User input: WGS 84
## wkt:
## GEOGCRS["WGS 84",
## DATUM["World Geodetic System 1984",
## ELLIPSOID["WGS 84",6378137,298.257223563,
## LENGTHUNIT["metre",1]]],
## PRIMEM["Greenwich",0,
## ANGLEUNIT["degree",0.0174532925199433]],
## CS[ellipsoidal,2],
## AXIS["latitude",north,
## ORDER[1],
## ANGLEUNIT["degree",0.0174532925199433]],
## AXIS["longitude",east,
## ORDER[2],
## ANGLEUNIT["degree",0.0174532925199433]],
## ID["EPSG",4326]]
st_crs(sgdat)
## Coordinate Reference System:
## User input: WGS 84
## wkt:
## GEOGCRS["WGS 84",
## DATUM["World Geodetic System 1984",
## ELLIPSOID["WGS 84",6378137,298.257223563,
## LENGTHUNIT["metre",1]]],
## PRIMEM["Greenwich",0,
## ANGLEUNIT["degree",0.0174532925199433]],
## CS[ellipsoidal,2],
## AXIS["latitude",north,
## ORDER[1],
## ANGLEUNIT["degree",0.0174532925199433]],
## AXIS["longitude",east,
## ORDER[2],
## ANGLEUNIT["degree",0.0174532925199433]],
## ID["EPSG",4326]]
Caso seja necessário modificar a projeção, utiliza-se a função `st_transform()
. Nesse caso, não precisamos modificar já que o shapefile (sgdat) tem o mesmo SGR do que estamo querendo criar.
Agora, iniciaremos a análise geoespacial dos dados. Inicialmente, iremos dar uma olhada geral para entender qual os dados que estamos lidando.
O padrão é que a função ´plot()´ plote todas as feições. Para plotar somente a geometria, utiliza-se st_geometry()
.
plot(st_geometry(joindata))
plot(joindata)
plot(sgdat)
Conforme observamos o shapefile “sgdat” com os dados das algas marinhas e o “joindata” com os dados do posicionamento de peixes, é possível verificar que existem áreas de intersecção entre ambos. Para analisar novamente, iremos plotar somente a geometria de ambos:
plot(joindata$geometry)
plot(sgdat$geometry)
Vamos filtrar somente os dados dos peixes do ano de 2016:
<- joindata %>%
filt_data filter(yr == 2016)
plot(st_geometry(filt_data))
Agora, verificaremos quantos peixes foram vistos nos mesmos locais em que encontraram-se algas marinhas em 2016. Ou seja, iremos selecionar as localizações que possuem ambos dados. Para isso, iremos utilizar o código abaixo:
<- filt_data[sgdat, ]
fish_crop
plot(fish_crop$geometry)
O que foi realizado até agora é somente a intersecção da geometria de ambos datasets. Portanto, agora realizaremos a intersecção de ambos dados, incluindo atributos:
<- st_intersection(filt_data, sgdat)
fish_int
plot(st_geometry(fish_int))
View(fish_int)
É possível utilizar ferramentas do tidyverse
. Abaixo, iremos fazer a soma de todos os Pinfish foram pegos em 2016:
<- fish_int %>%
fish_cnt group_by(FLUCCS) %>%
summarise(
cnt = sum(Pinfish)
)
fish_cnt
## Simple feature collection with 2 features and 2 fields
## Geometry type: MULTIPOINT
## Dimension: XY
## Bounding box: xmin: -82.7182 ymin: 27.82623 xmax: -82.53237 ymax: 28.02418
## Geodetic CRS: WGS 84
## # A tibble: 2 × 3
## FLUCCS cnt geometry
## <chr> <int> <MULTIPOINT [°]>
## 1 9113 1559 ((-82.53352 27.92907), (-82.53617 27.91043), (-82.53535 27.91212…
## 2 9116 4766 ((-82.55893 27.96612), (-82.5588 27.96633), (-82.55797 27.96632)…
Além de realizar a soma nos atributos numéricos (quantidade de Pinfish), também é realizada nos atributos geométricos (latitude e longitude). Conforme apresentado na tabela anterior, existe uma maior quantidade de Pinfishs em áreas onde existe maior quantidade de algas marinhas (FLUCCS=9116). É possível realizar um gráfico em relação às duas categorias de cobertura de algas marinhas (´9113´: desigual, ´9116´: contínua).
ggplot(fish_cnt, aes(x = FLUCCS, y = cnt)) +
geom_bar(stat = 'identity', fill='navyblue')
Agora será realizada a confecção de mapas. Utilizaremos os pacotes ggplot2
inicialmente:
ggplot() +
geom_sf(data = sgdat, fill = 'green') +
geom_sf(data = joindata)
Agora, para criar um mapa interativo para selecionar e dar zoom nos dados, utilizaremos o pacote mapview
:
mapview(sgdat, col.regions = 'green') +
mapview(joindata, zcol = 'Gear')