Assentamento/tutoriais/OrganizarDadosColetaKobo.html

1.0 MiB

<html> <head> </head>

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

#Pontos <- read.csv("training/wrangling/Coleta_Assentamento_SL_1.csv", sep=";") #para rodar com "run"
Pontos <- read.csv("data/Coleta_Assentamento_SL_1.csv", sep=";")
#colnames(Pontos)

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

Pontos_Col <- bind_cols(
  Alt_longer, 
  Long_Longer, 
  Lat_Longer, 
  Unico_Longer,
  GPS_longer
  )
## New names:
## * Ponto_Nome -> Ponto_Nome...1
## * moradia -> moradia...2
## * area -> area...3
## * value -> value...5
## * Ponto_Nome -> Ponto_Nome...6
## * ...
colnames(Pontos_Col)
##  [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.

Pontos_Colun
## # 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.

#write.csv(Pontos_Colun, file = "ColetaAssentamPontos.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

library(ggplot2)
library(ggrepel)
library(broom)
require(rgdal)
## 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.4.2 - Passar para data.frama

shp.df<-broom::tidy(shpA_SL)
## Regions defined for each Polygons

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

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

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

</html>