--- title: "Geographic Data Collection and Spatial data" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Geographic Data Collection and Spatial data} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, message = FALSE, warning = FALSE, echo = TRUE, comment = "#>" ) ``` `KoboToolbox` allows the collection of spatial data through three questions types: **geopoint**, **geotrace** and **geoshape**. **Geopoint:**
The geopoint question type captures a single geographic coordinate (latitude and longitude) including altitude and accuracy. This is useful for marking locations, such as homes, schools, or water sources. **Geotrace:**
The geotrace question type collects a series of connected geographic coordinates, forming a line. This can be used to map routes, paths, or boundaries. **Geoshape:**
A geoshape question type captures a series of geographic coordinates that form a closed polygon. This is useful for defining areas, such as land parcels, agricultural fields, or protected zones. To utilize these data types, we need to parse them into a GIS friendly format. `robotoolbox` uses [Well-Known Text (WKT)](https://libgeos.org/specifications/wkt/), a standard markup language for representing vector geometry, to represent points (`geopoint`), lines (`geotrace`) and polygons (`geoshape`). ## Spatial data The following form provides a simple demonstration of how `robotoolbox` maps spatial field types. ```{r setup, echo = FALSE} library(robotoolbox) library(dplyr) library(sf) library(mapview) mapview::mapviewOptions( fgb = FALSE, basemaps = c( "Esri.WorldImagery", "Esri.WorldShadedRelief", "OpenTopoMap", "OpenStreetMap"), layers.control.pos = "topright") ``` ```{r asset_list, echo = FALSE} l <- asset_list ``` ### Survey questions |name |type |label | |:-------------------|:--------|:------------------------------| |point |geopoint |Record a location | |point_description |text |Describe the recorded location | |line |geotrace |Record a line | |line_description |text |Describe the recorded line | |polygon |geoshape |Record a polygon | |polygon_description |text |Describe the recorded polygon | The form includes three spatial type columns: `point`, `line` and `polygon`. ### Loading the project The aforementioned form, named `Spatial data`, was uploaded to the server. You can load it from the `asset_list` of assets. ```{r, eval = FALSE} library(robotoolbox) library(dplyr) asset_list <- kobo_asset_list() uid <- filter(asset_list, name == "Spatial data") |> pull(uid) asset <- kobo_asset(uid) asset ``` ```{r, echo = FALSE} asset <- asset_spatial asset ``` We have a single submission, where we recorded one location using a `geopoint` question, mapped a portion of a road using a `geotrace` question, and outlined a stadium using a `geoshape`` question. ### Extracting the data From the assets, we can proceed to extract the submissions. ```{r, eval = FALSE} df <- kobo_data(asset) glimpse(df) ``` ```{r, echo = FALSE} df <- data_spatial glimpse(df) ``` We can see that we have all of our three columns `point`, `line` and `polygon`. For each of them, we have a corresponding WKT column. ```{r} pull(df, point) pull(df, point_wkt) ``` For `geopoint` types, `robotoolbox` also offers columns for latitude, longitude, altitude, and precision. ```{r} df |> select(starts_with("point_")) ``` The `line` column, derived from the `geotrace` question, has a corresponding `line_wkt` column. ```{r} pull(df, line) pull(df, line_wkt) ``` Lastly, `polygon_wkt` is the WKT column derived from the `geoshape` question labeled `polygon`. ```{r} pull(df, polygon) pull(df, polygon_wkt) ``` Now that we understand how `robotoolbox` stores spatial question types, we can convert these columns into spatial objects suitable for spatial data analysis. ## Geopoint The standard approach to manipulate spatial vector data in `R` involves using the `sf` package. `sf` stands for Simple Features and it extends a `data.frame` by adding a geometry list-column. It's a spatially enabled `data.frame`. It provides an interface to the popular [GDAL](https://gdal.org/), [GEOS](https://libgeos.org/), [PRØJ](https://proj.org/) and [S2](https://s2geometry.io/) libraries. It can be used to efficiently manipulate and visualize spatial vector data. Creating an `sf` object from a text column that contains [`WKT`](https://libgeos.org/specifications/wkt/) characters is straightforward. The `sf::st_as_sf` function can be used to turn the `data.frame` with a `WKT` column into an `sf` object. ```{r} point_sf <- st_as_sf(data_spatial, wkt = "point_wkt", crs = 4326) mapview(point_sf) ``` ## Geotrace We can also transform a `data.frame` with a column from a `geotrace` question to an `sf` object with a `LINESTRING` geometry. The `WKT` column is named `line_wkt`. ```{r} line_sf <- st_as_sf(data_spatial, wkt = "line_wkt", crs = 4326) mapview(line_sf) ``` ## Geoshape The column `polygon_wkt` can be used to create an `sf` polygon object. It's a simple closed polygon. ```{r} poly_sf <- st_as_sf(data_spatial, wkt = "polygon_wkt", crs = 4326) mapview(poly_sf) ``` Not only does `robotoolbox` rely on the `sf` package, but it also leverages other packages from the same ecosystem to provide robust spatial data analysis for `KoboToolbox` users. You can learn a lot about the `sf` packages and spatial data analysis with R from the excellent [Geocomputation with R](https://r.geocompx.org/) book and through the extensive `sf` [package documentation](https://r-spatial.github.io/sf/).