1.0 MiB
Organizando Dados ColetaKobo
Adenor Vicente Wendling e José Bran (RmierculisTime)
08/11/2020
1. Introdução
Este script tem como objetivo organizar os dados coletados (pontos de GPS) pelo Kobotool para serem usados no Qgis, na elaboração de mapas temáticos. Os dados originais provém do aplicativo kobotols https://www.kobotoolbox.org/, coletados para um trabalho de elaboração demapas temáticos da area dos assentamentos de Palmas, PR. Em cada propriedade visitada, foram coletados entre 1 a 5 pontos na área agrícola. Os dados dos pontos estão em uma linha, e sua utilização exige que estejam organizados de forma a que cada ponto (Lat, Long, Alt e número do ponto), esteja em uma coluna. Ou seja, de cada linha, deve ter de 1 a 5 novas colunas.
O script foi escrito em duas mãos. Inicialmente o Adenor fez o script, com suas possibilidades, e posteriormente o José escreveu a parte do pivot_longer. Ao final, um mapa com os pontos, para demonstra o resultado.
2. Organizar os dados coletados
2.1. Importar os dados
2.2 Renomear e selecionar colunas de interesse
Inicialmente será trabalhado com os dados: Nome (esposo e esposa), Area do imóvel, e os pontos de moradia e da coleta dos dados.
Cada ponto de coleta de solos está em 5 colunas de interesse distintas: Ponto“x”, Ponto“x”Lat, Ponto“x”Long, Ponto“x”Alt e ponto“x”GPS.
O arquivo possui algumas linhas sem informações. Esses erros ocorreram durante o período de coleta, especialmente durante os testes, e essas linhas precisam ser eliminados do arquivo. Por sorte, esses arquivos possue NA na coluna Ponto_1_Lat.
2.3. Eliminar linhas vazias
2.4. Organizar tabela
Como já foi relatado na introduão, os dados dos pontos de 1 a 5 estão na mesma linha e em colunas distintas, por estabelecimento, e é necessário que estejam em linhas separadas, porém na mesma coluna.
Para isso será utilizado o comando pivot_longer() para Alongar a tabela.
Inicialmente a tabela original será dividida em , sendo uma com as colunas com final “Unico”, outra com final “Lat”, outra com final “Long, outra última com final”Alt“e a última com fianl”GPS". Feito isso, todas serão alongadas, criando 5 tabelas, cada uma contendo uma das informações relevantes em uma única coluna. Finalmente, as cinco tabelas serão reunidas novamente.
2.4.1. divisão da tabela e 5 novas
#colnames(PontosRen)
Unico <- PontosRen%>%
select("Ponto_Nome", "moradia", "area", ends_with("Unico"))
Latitudes <- PontosRen%>%
select("Ponto_Nome", "moradia", "area",ends_with("Lat"))
Longitudes <- PontosRen%>%
select("Ponto_Nome", "moradia", "area",ends_with("Long"))
Altitudes<-PontosRen%>%
select("Ponto_Nome", "moradia", "area",ends_with("Alt"))
GPS<-PontosRen%>%
select("Ponto_Nome", "moradia", "area",ends_with("GPS"))
#View(GPS)
Temos agora cinco tabelas contendo 11 linhas e 5 colunas cada. As tabelas são: Unico, Latitudes, Longitudes, Altitudes e GPS.
2.5. Alongamento das tabelas - Adenor
Foram “alongadas” os arquivos criados acima, para ter as colunas com todos os dados necessários.
Unico_Longer <- Unico%>%
pivot_longer(cols = ends_with("Unico"),
names_to = "Set")
Lat_Longer<-Latitudes%>%
pivot_longer(cols = ends_with("Lat"),
names_to = "Lat")
Long_Longer<-Longitudes%>%
pivot_longer(cols = ends_with("Long"),
names_to="Long")
Alt_longer<-Altitudes%>%
pivot_longer(cols = ends_with("Alt"),
names_to="Alt")
GPS_longer<-GPS%>%
pivot_longer(cols = ends_with("GPS"),
names_to="GPS")
GPS_longer
## # A tibble: 55 x 5
## Ponto_Nome moradia area GPS value
## <chr> <chr> <dbl> <chr> <int>
## 1 Clauzir_ -26.35797 -51.719013333333336 1192.9 7.1 18 Ponto_1_G… 185
## 2 Clauzir_ -26.35797 -51.719013333333336 1192.9 7.1 18 Ponto_2_G… 186
## 3 Clauzir_ -26.35797 -51.719013333333336 1192.9 7.1 18 Ponto_3_G… NA
## 4 Clauzir_ -26.35797 -51.719013333333336 1192.9 7.1 18 Ponto_4_G… NA
## 5 Clauzir_ -26.35797 -51.719013333333336 1192.9 7.1 18 Ponto_5_G… NA
## 6 _Elisângela -26.36878166666667 -51.714369999999995 11… 19 Ponto_1_G… 187
## 7 _Elisângela -26.36878166666667 -51.714369999999995 11… 19 Ponto_2_G… 188
## 8 _Elisângela -26.36878166666667 -51.714369999999995 11… 19 Ponto_3_G… NA
## 9 _Elisângela -26.36878166666667 -51.714369999999995 11… 19 Ponto_4_G… NA
## 10 _Elisângela -26.36878166666667 -51.714369999999995 11… 19 Ponto_5_G… NA
## # … with 45 more rows
Temos agora 5 tabelas, sendo cada uma contendo 55 linhas e 5 colunas. O próxima passa é unir novamente essas tabelas, para que possamos ter uma tabelas com 55 linhas, e com as culunas de Lat, Long, Alt, GPS.
2.5.1. União das tabelas alongadas
## New names:
## * Ponto_Nome -> Ponto_Nome...1
## * moradia -> moradia...2
## * area -> area...3
## * value -> value...5
## * Ponto_Nome -> Ponto_Nome...6
## * ...
## [1] "Ponto_Nome...1" "moradia...2" "area...3" "Alt"
## [5] "value...5" "Ponto_Nome...6" "moradia...7" "area...8"
## [9] "Long" "value...10" "Ponto_Nome...11" "moradia...12"
## [13] "area...13" "Lat" "value...15" "Ponto_Nome...16"
## [17] "moradia...17" "area...18" "Set" "value...20"
## [21] "Ponto_Nome...21" "moradia...22" "area...23" "GPS"
## [25] "value...25"
Com esse comando, a tabela nova possuem várias colunas desnecessárias, criadas em cada pivot_longer, como segue: "" “Ponto_Nome…1” “moradia…2” “area…3”"" “Alt”
"" “value…5”"" - que é o valor de Altitude; “Ponto_Nome…6” “moradia…7” “area…8” [9] “Long” "" “value…10”"" que é o valor da Longitude; “Ponto_Nome…11” “moradia…12” “area…13” “Lat” ""“value…15” "" que é o valor de Latitude; “Ponto_Nome…16” “moradia…17” “area…18” “Set” "" “value…20” "" que é ovalor de Unico; [21] “Ponto_Nome…21” “moradia…22” “area…23” “GPS” "" “value…25” "" que é o valor do ponto de GPS. Por isso, vai mas um chunk só para eliminar essas colunas desnecessárias
2.5.2. Limpeza da tabela
Pontos_Colu <- Pontos_Col%>%
select(
Ponto_Nome...1,
moradia...2,
area...3,
value...25,
value...5,
value...10,
value...15,
value...20,
)%>%
filter(value...5>0)
Pontos_Colu
## # A tibble: 31 x 8
## Ponto_Nome...1 moradia...2 area...3 value...25 value...5 value...10
## <chr> <chr> <dbl> <int> <dbl> <dbl>
## 1 Clauzir_ -26.35797 … 18 185 1209. -51.7
## 2 Clauzir_ -26.35797 … 18 186 1152. -51.7
## 3 _Elisângela -26.368781… 19 187 1129. -51.7
## 4 _Elisângela -26.368781… 19 188 1177. -51.7
## 5 _Eva -26.356211… 17.6 182 1172. -51.7
## 6 _Eva -26.356211… 17.6 183 1172. -51.7
## 7 _Eva -26.356211… 17.6 184 1172. -51.7
## 8 _Alessandra -26.353295… 19 180 1139. -51.7
## 9 _Alessandra -26.353295… 19 181 1139 -51.7
## 10 Jair brescovo… -26.361335… 23 173 1087. -51.7
## # … with 21 more rows, and 2 more variables: value...15 <dbl>, value...20 <chr>
Da mesma forma que foram criadas várias colunas no pivot_longer, no processo de bind_cols essas colunas foram juntadas, e as de mesmo nome, foram renomeadas inconvenientemente. Lá vai mais um chunk para dar nomes de boi aos bois.
2.5.3. Renomeação das colunas
Pontos_Colun <- Pontos_Colu%>%
rename(
nome = "Ponto_Nome...1",
moradia = "moradia...2",
area = "area...3",
Ponto="value...25",
Altit = "value...5",
Longit = "value...10",
Latit = "value...15",
Unica = "value...20"
)
Finalmente, após longos atalhos, está pronta a nossa tabela, contendo uma coluna de Lat, uma para Long e uma para Alt, com as demais colunas acessóarias necessárias. Vejamos que agora temos apenas 31 linhas, e não 55 como havia acima. Isso se deu já que foram eliminadas as linhas sem dados, com o comando filter.
## # A tibble: 31 x 8
## nome moradia area Ponto Altit Longit Latit Unica
## <chr> <chr> <dbl> <int> <dbl> <dbl> <dbl> <chr>
## 1 Clauzir_ -26.35797 -51.71… 18 185 1209. -51.7 -26.4 -26.3583233333…
## 2 Clauzir_ -26.35797 -51.71… 18 186 1152. -51.7 -26.4 -26.3578066666…
## 3 _Elisângela -26.368781666666… 19 187 1129. -51.7 -26.4 -26.3692950000…
## 4 _Elisângela -26.368781666666… 19 188 1177. -51.7 -26.4 -26.3685466666…
## 5 _Eva -26.356211666666… 17.6 182 1172. -51.7 -26.4 -26.3564950000…
## 6 _Eva -26.356211666666… 17.6 183 1172. -51.7 -26.4 -26.3565766666…
## 7 _Eva -26.356211666666… 17.6 184 1172. -51.7 -26.4 -26.3561399999…
## 8 _Alessandra -26.353295000000… 19 180 1139. -51.7 -26.4 -26.3530183333…
## 9 _Alessandra -26.353295000000… 19 181 1139 -51.7 -26.4 -26.3537349999…
## 10 Jair bresco… -26.361335 -51.6… 23 173 1087. -51.7 -26.4 -26.3612016666…
## # … with 21 more rows
2.6 Pivot_longer @José
@jose: Outra opção para alongar a tabela e renomear as colunas no mesmo código que alonga a tabela é incluir os nomes da colunas que terá os valores “values_to”
Também. o filtro para eliminar células sem dado pode ser aplicado no mesmo código, aproveitando o “pippin” (%>%)
2.6.1. Pivot longer com as especificações
Foram utilizadas as mesmas tabelas criadas no chunk “Repartir_Tables”, mas com especificações na saída de cada pivot_longer, evitando criação de colunas com nomes iguais.
Unico_Longer.2 <- Unico%>%
pivot_longer(
cols = ends_with("Unico"),
names_to = "Set",
values_to = "Unica"
)%>%
filter(Unica!= "")
Unico_Longer.2
## # A tibble: 31 x 5
## Ponto_Nome moradia area Set Unica
## <chr> <chr> <dbl> <chr> <chr>
## 1 Clauzir_ -26.35797 -51.7190133… 18 Ponto_1… -26.358323333333335…
## 2 Clauzir_ -26.35797 -51.7190133… 18 Ponto_2… -26.35780666666667 …
## 3 _Elisângela -26.36878166666667 -5… 19 Ponto_1… -26.369295000000005…
## 4 _Elisângela -26.36878166666667 -5… 19 Ponto_2… -26.368546666666663…
## 5 _Eva -26.356211666666663 -… 17.6 Ponto_1… -26.356495000000002…
## 6 _Eva -26.356211666666663 -… 17.6 Ponto_2… -26.35657666666667 …
## 7 _Eva -26.356211666666663 -… 17.6 Ponto_3… -26.356139999999996…
## 8 _Alessandra -26.353295000000003 -… 19 Ponto_1… -26.35301833333333 …
## 9 _Alessandra -26.353295000000003 -… 19 Ponto_2… -26.353734999999997…
## 10 Jair brescovotes_… -26.361335 -51.691604… 23 Ponto_1… -26.361201666666663…
## # … with 21 more rows
Nesta primeira tabela foram mantidos os dados de nome, moradia e área. Nas pŕoximas tabelas esses serão eliminados com o comando select, pois, as colunas redundantes podem ser retiradas das próximas tabelas, já que parece que ao deixar padronizadas as linhas em 21 a ordem da coluna indicadora não se modifica e todas as tabelas ficam na mesma ordem
Lat_Longer.2 <- Latitudes%>%
pivot_longer(
cols = ends_with("Lat"),
names_to = "Lat",
values_to = "Latit"
)%>%
filter(Latit!= "")%>%
select(Latit)
Lat_Longer.2
## # A tibble: 31 x 1
## Latit
## <dbl>
## 1 -26.4
## 2 -26.4
## 3 -26.4
## 4 -26.4
## 5 -26.4
## 6 -26.4
## 7 -26.4
## 8 -26.4
## 9 -26.4
## 10 -26.4
## # … with 21 more rows
Long_Longer.2 <- Longitudes%>%
pivot_longer(
cols = ends_with("Long"),
names_to = "Long",
values_to = "Longit"
)%>%
filter(Longit!= "")%>%
select(Longit)
Alt_longer.2 <- Altitudes%>%
pivot_longer(
cols = ends_with("Alt"),
names_to = "Alt",
values_to = "Altit"
)%>%
filter(Altit!= "")%>%
select( Altit)
GPS_longer.2 <- GPS%>%
pivot_longer(
cols = ends_with("GPS"),
names_to = "GPS",
values_to = "Ponto"
)%>%
filter(Ponto!= "")%>%
select(Ponto)
Apresentamos apenas as tabela Lat_Longer.2, já que as outras na sequência apresentam a mesma lógica, contendo apenas uma coluna.
2.6.2. União das tabelas alongadas
Pontos_Colun.2 <-cbind(Unico_Longer.2, GPS_longer.2, Alt_longer.2, Long_Longer.2, Lat_Longer.2)
head(Pontos_Colun.2)
## Ponto_Nome moradia area
## 1 Clauzir_ -26.35797 -51.719013333333336 1192.9 7.1 18.0
## 2 Clauzir_ -26.35797 -51.719013333333336 1192.9 7.1 18.0
## 3 _Elisângela -26.36878166666667 -51.714369999999995 1122.3 5.9 19.0
## 4 _Elisângela -26.36878166666667 -51.714369999999995 1122.3 5.9 19.0
## 5 _Eva -26.356211666666663 -51.71127499999999 1172.3 7.9 17.6
## 6 _Eva -26.356211666666663 -51.71127499999999 1172.3 7.9 17.6
## Set Unica Ponto Altit
## 1 Ponto_1_Unico -26.358323333333335 -51.719701666666666 1208.8 5.0 185 1208.8
## 2 Ponto_2_Unico -26.35780666666667 -51.718289999999996 1152.5 4.9 186 1152.5
## 3 Ponto_1_Unico -26.369295000000005 -51.71320666666667 1129.4 5.8 187 1129.4
## 4 Ponto_2_Unico -26.368546666666663 -51.71499833333334 1177.1 5.1 188 1177.1
## 5 Ponto_1_Unico -26.356495000000002 -51.71152166666668 1172.3 7.8 182 1172.3
## 6 Ponto_2_Unico -26.35657666666667 -51.711666666666666 1172.3 7.0 183 1172.3
## Longit Latit
## 1 -51.71970 -26.35832
## 2 -51.71829 -26.35781
## 3 -51.71321 -26.36930
## 4 -51.71500 -26.36855
## 5 -51.71152 -26.35650
## 6 -51.71167 -26.35658
3. Salvar no Arquivo
O arquivo que queremos é um .csv. Por isso, usamos o write.csv.
4. Mapas
O mapa, além de trazar informaões espaciais da localizaão dos pontos, serve aqui muito mais para conferir a exatidão da coleta.
Com base em https://github.com/renatamuy/mapas/commit/bdcf2fec1a23b64692d735d0a3bb4a644b81dd18
4.1 Carregue os pacotes necessarios
## Loading required package: rgdal
## Loading required package: sp
## rgdal: version: 1.5-18, (SVN revision 1082)
## Geospatial Data Abstraction Library extensions to R successfully loaded
## Loaded GDAL runtime: GDAL 3.0.4, released 2020/01/28
## Path to GDAL shared files: /usr/share/gdal
## GDAL binary built with GEOS: TRUE
## Loaded PROJ runtime: Rel. 6.3.1, February 10th, 2020, [PJ_VERSION: 631]
## Path to PROJ shared files: /usr/share/proj
## Linking to sp version:1.4-4
## To mute warnings of possible GDAL/OSR exportToProj4() degradation,
## use options("rgdal_show_exportToProj4_warnings"="none") before loading rgdal.
4.1.1. Defina qual sera a area usada como base do mapa
#shpA_SL <- rgdal::readOGR(dsn=, "training/wrangling/shapefiles",
shpA_SL <- rgdal::readOGR(dsn="Qgis",
layer="Assentamento_SL",
verbose=TRUE,
stringsAsFactors=FALSE)
## OGR data source with driver: ESRI Shapefile
## Source: "/home/casa/Documentos/R/Proj/ProjPesq1/ProjetoAssentamento1/Qgis", layer: "Assentamento_SL"
## with 1 features
## It has 5 fields
## Integer64 fields read as strings: id
4.3. Mapa do município
#Palmas <- rgdal::readOGR(dsn=, "training/wrangling/shapefiles",
Palmas <- rgdal::readOGR(dsn="Qgis",
layer="Palmas",
verbose=TRUE,
stringsAsFactors=FALSE)
Palmas1<-tidy(Palmas)
## Regions defined for each Polygons
4.2 Plote o mapa usando o ggplot2 como um objeto, ainda sem desenha-lo na tela
Esse é o mapa a ser plotado, com os pontos de coleta, objeto do wranling acina.
Geral <- ggplot() + geom_polygon(data = Palmas1,
aes(x=long, y = lat, group = group),
fill = "lightgrey", color = "black") +
geom_polygon(data = shp.df,
aes(x=long, y = lat, group = group),
fill = "blue", color = "red") + #Note que voce pode mudar as cores do fundo e da borda
coord_fixed (1.1)+
labs(x="Longitude", y = "Latitude") #De nome aos eixos
Geral
Município de Palmas, PR, com destaque para o Assentamento São Lourenço
assentamento <- ggplot() +
geom_polygon(data = shp.df,
aes(x=long, y = lat, group = group),
fill = "lightgrey", color = "black") + #Note que voce pode mudar as cores do fundo e da borda
coord_fixed(1.1) + #Use isto para o mapa ficar proporcional
geom_point(data = Pontos_Colun, aes(x = Longit, y = Latit),
color = "red", #Escolha a cor dos pontos
size = 1, #Tamanho dos pontos
alpha = 0.8) + #Transparencia: quanto mais proximo de 1, menos transparente
geom_text_repel (data=Pontos_Colun, aes(x=Longit, y=Latit, label=Ponto))+ #Use isto para os rotulos dos pontos nao ficarem sobrepostos
theme_bw() +
labs(x="Longitude", y = "Latitude") + #De nome aos eixos
theme(text = element_text(size=10), #Ajuste os tamanhos das fontes
plot.title = element_text(size=10, hjust=0.5),
axis.text.x = element_text(size = 8, angle=0, hjust=1),
axis.text.y = element_text(size = 8, angle=0, vjust=1),
axis.title.x = element_text(size = 9, angle=0),
axis.title.y = element_text(size = 9, angle=90))
plot(assentamento)
Mapa do Assentamento com destaque para os Pontos de coleta de solo
referências Morkdown https://bookdown.org/yihui/rmarkdown/html-document.html#table-of-contents
https://bookdown.org/yihui/rmarkdown/ Foi escrito com base em https://raulossada.gitbooks.io/r_mapas/content/section2/s2_02_getProjection.html