From de8368727efa2393f1677c41adae23eea90d4b92 Mon Sep 17 00:00:00 2001 From: Josiah Parry Date: Mon, 13 Nov 2023 18:02:09 -0500 Subject: [PATCH] update with draft gp tool doc --- _quarto.yml | 1 + geoprocessing-tools.qmd | 120 +++++++++++++++++++++++++++++++++ images/gp-multiple-strings.png | Bin 0 -> 2039 bytes images/gp-parameter-type.png | Bin 0 -> 10366 bytes images/gp-tool-properties.png | Bin 0 -> 23623 bytes 5 files changed, 121 insertions(+) create mode 100644 geoprocessing-tools.qmd create mode 100644 images/gp-multiple-strings.png create mode 100644 images/gp-parameter-type.png create mode 100644 images/gp-tool-properties.png diff --git a/_quarto.yml b/_quarto.yml index ddd9057..4366261 100644 --- a/_quarto.yml +++ b/_quarto.yml @@ -14,6 +14,7 @@ website: text: Home - text: Packages href: packages.qmd + - geoprocessing-tools.qmd - tutorials.qmd - workflows.qmd diff --git a/geoprocessing-tools.qmd b/geoprocessing-tools.qmd new file mode 100644 index 0000000..76c54df --- /dev/null +++ b/geoprocessing-tools.qmd @@ -0,0 +1,120 @@ +--- +title: "R Geoprocessing tools" +--- + +Much like a python geoprocessing (GP) script tool, R based script tools can be created +allowing you to create GP tools and toolboxes that utilize the power of R. +The basic anatomy of an R script GP tool is like so: + +```r +tool_exec <- function(in_params, out_params) { + # do things here +} +``` + + +There _must_ be a function defined named `tool_exec()`. This is what is going +to be ran by ArcGIS Pro. + +## Input and Output Parameters + +Additionally, there must be two arguments that correspond to input +parameters and output parameters. The conventional name of +these arguments are `in_params` and `out_params`. The first argument will +_always_ refer to the input parameters and the second to the outputs. + +`in_params` and `out_params` are named lists. The elements of these lists are +determined by the **direction** of a parameter. + +![](images/gp-tool-properties.png){width=50%} + +If the direction is `Input` it will be contained in `in_params`. Likewise, +if the direction is `Output`, it will be contained in `out_params`. + +## Using parameters + +We can extract values from the `in_params` and `out_params` lists by the name +of the parameter. + +:::{.callout-caution} +The name of the parameter must match that of the **Name** column in the `Parameters` +option of the Tool Properties. _It is not_ the Label column. +::: + +For example, if we wanted to parse the `date` parameter we could write our +function like so: + +```r +tool_exec <- function(in_params, out_params) { + # fetch the date parameter + date_str <- in_params[["date"]] + + # parse it using {anytime} + clean_date <- anytime::anytime(date_str) + + # ... do additional things +} +``` + +## Parameter types + +There are number of different type of parameters that can be provided to a +geoprocessing (GP) tool. The type of parameter that is chosen determines how +that parameter will appear in the GP pane's UI. Each parameter type can be +represented by a basic scalar R type: `integer`, `double`, `character`, `logical`, or +`NULL`. + +:::{.callout-tip} +A scalar value is a vector with only a single element. +::: + + +It is incumbent upon you to take these parameter inputs and use them appropriately in R. + +| Parameter Data Type | R type | +| --------- | ------ | +| String | `character` | +| Boolean | `logical` | +| Double | `numeric` | +| Date | `character` in the format of your system e.g. `"11/17/2023 4:35:57 PM"` | +| Field | `character` the field name of a feature class | +| Folder | `character` absolute path e.g. `"C:\\Users\username\Documents"` | +| Feature Class | `character`absolute path e.g. `"C:\\Users\username\mydatabase.gdb\\feature_class` | +| Spatial Reference | `character` a string representation of the spatial reference e.g. `"PROJCS["...."]"` | + +: Data type mapping {.striped tbl-colwidths="[25,75]"} + +### Multiple Values + +When selecting the `Multiple values` check box in the parameter data type UI, users +can then provide multiple inputs of that type. + +![](images/gp-parameter-type.png) + +When this is done, each of the input values will be contained inside of a list. If you have multiple values ticked for the `String` type, you will get a list of scalar character vectors. + +**This is important** so it bears repeating! When users provide multiple values they will +be captured in R as a list of scalars. Meaning that if you have multiple `String` values +you will not get a character vector with a length greater than one. + +Take the below input for example + +![](images/gp-multiple-strings.png) + +In R we would get the `list("string 1", "string 2")` and **not** `c("string 1", "string 2")`. + +:::{.callout-tip} +To turn a list of scalars of the same type—e.g. double, integer, logical, or character—into a vector you can use `unlist()`. For example `unlist(list("string 1", "string 2"))` will give us `c("string 1", "string 2")`. +::: + + +## Common Patterns + +- Reading a Feature Class +- Converting it to an sf object +- Writing a Feature Class +- Autopopulate field drop-down using dependent parameter + +## Dependent Parameters + +- Autopopulate field drop-down using dependent parameter diff --git a/images/gp-multiple-strings.png b/images/gp-multiple-strings.png new file mode 100644 index 0000000000000000000000000000000000000000..c011428c7900cecd3ebde27ff52690eeb075f1ea GIT binary patch literal 2039 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%0A5S*PnWbs+D5~pMH~#6?@oQf90$d8# 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