arcgisutils is the foundational infrastructure package that powers the R-ArcGIS Bridge Data and Location Service ecosystem. It provides sophisticated, production-ready tools for interacting with ArcGIS Online, ArcGIS Enterprise, and ArcGIS Platform via their REST APIs.
š Comprehensive Authentication:
auth_code()
,
auth_client()
)arcgisbinding
š Portal Integration:
āļø Geoprocessing Services:
arc_gp_job
) with real-time
status tracking and built-in result parsingš Esri JSON Ecosystem:
sf
integrationš ļø Developer Utilities:
arc_base_req()
,
arc_paginate_req()
){arcgisutils}
is part of the {arcgis}
metapackage, which provides the complete R-ArcGIS Bridge toolkit. For
most users, installing the metapackage is recommended:
install.packages("arcgis")
You can also install {arcgisutils}
individually from
CRAN:
install.packages("arcgisutils")
To install the development version:
::pak("r-arcgis/arcgisutils") pak
Authorization tokens are provided through the functions
auth_code()
, auth_client()
,
auth_user()
, auth_key()
, and
auth_binding()
. Additional token validation functions are
provided via refresh_token()
and
validate_or_refresh_token()
.
auth_code()
can be used for integrating into Shiny
applications, for example, to have individual users log in. We recommend
using auth_key()
for authenticating in non-interactive
environments (for example scheduled scripts or deployments).
Tokens are managed using set_arc_token()
and
unset_arc_token()
. They are fetched using
arc_token()
. set_arc_token()
can set the token
globally or set multiple named environments. Here is a minimal
example:
library(arcgisutils)
#>
#> Attaching package: 'arcgisutils'
#> The following object is masked from 'package:base':
#>
#> %||%
<- auth_key()
key set_arc_token(key)
Alternatively, tokens can be set based on a key-value pair for multiple environments:
set_arc_token("production" = prod_token, "development" = dev_token)
And fetched based on their name via
arc_token("production")
Search and discover content across your ArcGIS organization:
# Search for feature services containing "crime" data
<- search_items(
crime_items query = "crime",
item_type = "Feature Service",
max_pages = 1
)
crime_items#> # A data frame: 50 Ć 46
#> id owner created modified guid name title type
#> * <chr> <chr> <dttm> <dttm> <lgl> <chr> <chr> <chr>
#> 1 ea0cfe⦠Toro⦠2023-03-28 15:02:39 2025-01-22 18:27:48 NA Neig⦠Neig⦠Featā¦
#> 2 0a239a⦠Toro⦠2023-03-27 18:59:00 2025-08-06 14:01:27 NA Majo⦠Majo⦠Featā¦
#> 3 5e055d⦠JASo⦠2023-04-04 17:36:59 2023-09-07 19:05:06 NA <NA> Sher⦠Featā¦
#> 4 64691a⦠Temp⦠2024-01-17 20:01:43 2024-01-17 20:04:45 NA hate⦠Hate⦠Featā¦
#> 5 7c2b78⦠JASo⦠2023-04-04 17:49:30 2023-06-02 22:27:11 NA <NA> Sher⦠Featā¦
#> 6 e0992d⦠balt⦠2023-07-31 20:27:01 2025-01-22 21:21:01 NA Part⦠Part⦠Featā¦
#> 7 c749e3⦠open⦠2024-02-23 19:36:34 2025-09-04 17:08:47 NA <NA> Crim⦠Featā¦
#> 8 2cb53d⦠KASU⦠2019-12-10 19:06:39 2019-12-10 19:14:27 NA Viol⦠Viol⦠Featā¦
#> 9 30644d⦠MyCi⦠2025-03-14 14:55:06 2025-08-20 13:55:24 NA HPD_⦠HPD ⦠Featā¦
#> 10 5dc4e6⦠iwat⦠2023-06-23 22:07:21 2023-08-09 15:33:46 NA <NA> Prop⦠Featā¦
#> # ā¹ 40 more rows
#> # ā¹ 38 more variables: typeKeywords <list>, description <chr>, tags <list>,
#> # snippet <chr>, thumbnail <chr>, documentation <lgl>, extent <list>,
#> # categories <list>, spatialReference <chr>, accessInformation <chr>,
#> # classification <lgl>, licenseInfo <chr>, culture <chr>, properties <list>,
#> # advancedSettings <lgl>, url <chr>, proxyFilter <lgl>, access <chr>,
#> # size <int>, subInfo <int>, appCategories <list>, industries <list>, ā¦
# Get detailed item information for a portal item
arc_item(crime_items$id[1])
#> <PortalItem<Feature Service>>
#> id: ea0cfecdb1de416884e6b0bf08a9e195
#> title: Neighbourhood Crime Rates Open Data
#> owner: TorontoPoliceService
Always use arc_base_req()
as this will handle setting
the user agent and authorization token. The function creates a
standardized httr2
request object:
# defaults to arcgis.com
<- arc_host()
host
<- arc_base_req(host)
req
req#> <httr2_request>
#> GET https://www.arcgis.com
#> Body: empty
#> Options:
#> * useragent: "arcgisutils v0.3.3.9000"
To handle paginated services and requests use
arc_paginate_req()
to automatically handle fetching
pages.
There are also a number of utility functions for creating and parsing
Esri JSON. For example we can create an Esri FeatureSet
json string using as_esri_featureset()
directly from an
sf
object.
library(sf)
# load the NC SIDS dataset and extract centroids
# of the first few rows
<- system.file("shape/nc.shp", package = "sf") |>
nc st_read(quiet = TRUE) |>
st_centroid()
# convert to json
<- as_esri_featureset(nc[1:2, 1:3])
nc_json
::pretty_json(nc_json)
jsonify#> {
#> "geometryType": "esriGeometryPoint",
#> "spatialReference": {
#> "wkid": 4267
#> },
#> "features": [
#> {
#> "geometry": {
#> "x": -81.4982290095261,
#> "y": 36.43139560823758
#> },
#> "attributes": {
#> "AREA": 0.114,
#> "CNTY_": 1825.0,
#> "PERIMETER": 1.442
#> }
#> },
#> {
#> "geometry": {
#> "x": -81.12512977849917,
#> "y": 36.49110847237506
#> },
#> "attributes": {
#> "AREA": 0.061,
#> "CNTY_": 1827.0,
#> "PERIMETER": 1.231
#> }
#> }
#> ]
#> }
Feature set json can also be parsed using
parse_esri_json()
.
parse_esri_json(nc_json)
#> Simple feature collection with 2 features and 3 fields
#> Geometry type: POINT
#> Dimension: XY
#> Bounding box: xmin: -81.49823 ymin: 36.4314 xmax: -81.12513 ymax: 36.49111
#> Geodetic CRS: NAD27
#> AREA CNTY_ PERIMETER geometry
#> 1 0.114 1825 1.442 POINT (-81.49823 36.4314)
#> 2 0.061 1827 1.231 POINT (-81.12513 36.49111)
Additionally, sfās crs
object can be converted to a spatialReference
JSON object using validate_crs()
. Convert these to json
with yyjsonr
or jsonify
.
<- validate_crs(27700)
crs ::pretty_json(crs, unbox = TRUE)
jsonify#> {
#> "spatialReference": {
#> "wkid": 27700
#> }
#> }
The geoprocessing service framework is completely supported in
{arcgisutils}
. Here we combine the functionality of the
geoprocessing job framework with utilities such as
as_esri_featureset()
to call the Trace
DownStream Elevation Service
<- function(
trace_downstream
input_points,point_id_field = NULL,
resolution = NULL,
generalize = FALSE,
token = arc_token()
) {
# create a list of parameters
<- compact(list(
params InputPoints = as_esri_featureset(input_points),
PointIdField = point_id_field,
DataSourceResolution = resolution,
Generalize = as.character(generalize),
f = "json"
))
<- "https://hydro.arcgis.com/arcgis/rest/services/Tools/Hydrology/GPServer/TraceDownstream"
service_url $new(
arc_gp_jobbase_url = service_url,
params = params,
result_fn = parse_gp_feature_record_set,
token
) }
This new function can be called to start a new job:
# create input points
<- st_sfc(
input_points st_point(c(-159.548936, 21.955888)),
crs = 4326
)
# initialze an empty job
<- trace_downstream(
job
input_points,token = auth_user()
)
# start the job
$start()
job#> <arc_gp_job>
#> Job ID: jd9f76de1e62e4d8a877f3e6859fdb7b2
#> Status: not started
#> Resource: /TraceDownstream
#> Params:
#> ⢠InputPoints
#> ⢠Generalize
#> ⢠f
Jobs run asynchronously so we can check the status with
job$status
$status
job#> <arcgisutils::arc_job_status>
#> @ status: chr "esriJobSubmitted"
Then, when the job is complete, we can fetch the results applying the
result function which is parse_gp_feature_record_set()
in
this case.
$results
job#> $param_name
#> [1] "OutputTraceLine"
#>
#> $data_type
#> [1] "GPFeatureRecordSetLayer"
#>
#> $geometry
#> Simple feature collection with 1 feature and 6 fields
#> Geometry type: MULTILINESTRING
#> Dimension: XY
#> Bounding box: xmin: 438895 ymin: 2422310 xmax: 443325 ymax: 2428045
#> Projected CRS: NAD83 / UTM zone 4N + Unknown VCS
#> OBJECTID PourPtID Description DataResolution LengthKm
#> 1 1 1 NED 10m processed by Esri 10.0 9.489823
#> Shape_Length geometry
#> 1 9489.823 MULTILINESTRING ((443325 24...
# store and view the results
<- job$results
res
res#> $param_name
#> [1] "OutputTraceLine"
#>
#> $data_type
#> [1] "GPFeatureRecordSetLayer"
#>
#> $geometry
#> Simple feature collection with 1 feature and 6 fields
#> Geometry type: MULTILINESTRING
#> Dimension: XY
#> Bounding box: xmin: 438895 ymin: 2422310 xmax: 443325 ymax: 2428045
#> Projected CRS: NAD83 / UTM zone 4N + Unknown VCS
#> OBJECTID PourPtID Description DataResolution LengthKm
#> 1 1 1 NED 10m processed by Esri 10.0 9.489823
#> Shape_Length geometry
#> 1 9489.823 MULTILINESTRING ((443325 24...
# plot the resultant geometry
plot(st_geometry(res$geometry))
To learn more about the R-ArcGIS Bridge project visit the developer documentation.