diff --git a/CRAN-SUBMISSION b/CRAN-SUBMISSION new file mode 100644 index 0000000..a793ec8 --- /dev/null +++ b/CRAN-SUBMISSION @@ -0,0 +1,3 @@ +Version: 0.3.0 +Date: 2024-07-05 14:30:23 UTC +SHA: f3d74e25fa88bb6a82d53e1390d00ffa543972fd diff --git a/README.Rmd b/README.Rmd index 4ed7610..a125fd7 100644 --- a/README.Rmd +++ b/README.Rmd @@ -13,7 +13,7 @@ knitr::opts_chunk$set( ) ``` -# arcgislayers +# arcgislayers diff --git a/README.md b/README.md index 0f1e48b..41045ac 100644 --- a/README.md +++ b/README.md @@ -1,285 +1,320 @@ - - - - -# arcgislayers - - - -[![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/license/apache-2-0) -[![R-CMD-check](https://github.com/R-ArcGIS/arcgislayers/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/R-ArcGIS/arcgislayers/actions/workflows/R-CMD-check.yaml) -[![Lifecycle: stable](https://img.shields.io/badge/lifecycle-stable-brightgreen.svg)](https://lifecycle.r-lib.org/articles/stages.html#stable) -[![](https://cranlogs.r-pkg.org/badges/arcgislayers)](https://cran.r-project.org/package=arcgislayers) - - -The goal of `{arcgislayers}` is to provide an R interface to the [ArcGIS REST API](https://developers.arcgis.com/rest/). - -## Installation - -It is recommend you install and use the metapackage `{arcgis}`. You can install the development version of arcgis like so: - -``` r -remotes::install_github("r-arcgis/arcgis", dependencies = TRUE) -``` - -## Usage - -### Creating a simple feature object from an ArcGIS FeatureLayer - - -```r -library(arcgis) -#> Attaching core arcgis packages: -#> → arcgisutils v0.2.0.9000 -``` - -`arc_open()` takes a URL to create a reference to a remote ArcGIS layer, server, or table. The function can return any of the following classes (corresponding to different ArcGIS service types): - - - `FeatureLayer` - - `Table` - - `FeatureServer` - - `ImageServer` - - `MapServer` - - `GroupLayer` - -For example, you can create a `FeatureLayer` object based on a Feature Server URL: - - -```r -furl <- "https://services.arcgis.com/P3ePLMYs2RVChkJx/ArcGIS/rest/services/USA_Counties_Generalized_Boundaries/FeatureServer/0" - -county_fl <- arc_open(furl) - -county_fl -#> -#> Name: USA Counties - Generalized -#> Geometry Type: esriGeometryPolygon -#> CRS: 4326 -#> Capabilities: Query,Extract -``` - -You can then use `arc_select()` to query the feature layer object and return an `sf` object. - -If no arguments are provided to `arc_select()` the entire feature layer is returned in memory as an `sf` object. - - -```r -arc_select(county_fl) -#> -Iterating ■■■■■■■■■■■■■■■■ 50% | ETA: 2s - -#> Simple feature collection with 3143 features and 12 fields -#> Geometry type: MULTIPOLYGON -#> Dimension: XY -#> Bounding box: xmin: -178.2176 ymin: 18.92179 xmax: -66.96927 ymax: 71.40624 -#> Geodetic CRS: WGS 84 -#> First 10 features: -#> OBJECTID NAME STATE_NAME STATE_FIPS FIPS SQMI POPULATION -#> 1 1 Autauga County Alabama 01 01001 604.37 58805 -#> 2 2 Baldwin County Alabama 01 01003 1633.14 231767 -#> 3 3 Barbour County Alabama 01 01005 904.52 25223 -#> 4 4 Bibb County Alabama 01 01007 626.17 22293 -#> 5 5 Blount County Alabama 01 01009 650.63 59134 -#> 6 6 Bullock County Alabama 01 01011 625.14 10357 -#> 7 7 Butler County Alabama 01 01013 777.88 19051 -#> 8 8 Calhoun County Alabama 01 01015 612.27 116441 -#> 9 9 Chambers County Alabama 01 01017 603.11 34772 -#> 10 10 Cherokee County Alabama 01 01019 599.98 24971 -#> POP_SQMI STATE_ABBR COUNTY_FIPS Shape__Area Shape__Length -#> 1 97.3 AL 001 0.1489034 1.884137 -#> 2 141.9 AL 003 0.4044891 3.678276 -#> 3 27.9 AL 005 0.2224307 2.218514 -#> 4 35.6 AL 007 0.1577359 1.852453 -#> 5 90.9 AL 009 0.1675296 2.067456 -#> 6 16.6 AL 011 0.1557273 2.006250 -#> 7 24.5 AL 013 0.1927305 1.769462 -#> 8 190.2 AL 015 0.1523369 2.149825 -#> 9 57.7 AL 017 0.1531136 1.637226 -#> 10 41.6 AL 019 0.1527217 1.794142 -#> geometry -#> 1 MULTIPOLYGON (((-86.82067 3... -#> 2 MULTIPOLYGON (((-87.97309 3... -#> 3 MULTIPOLYGON (((-85.74337 3... -#> 4 MULTIPOLYGON (((-87.41986 3... -#> 5 MULTIPOLYGON (((-86.96799 3... -#> 6 MULTIPOLYGON (((-85.4114 32... -#> 7 MULTIPOLYGON (((-86.44912 3... -#> 8 MULTIPOLYGON (((-85.79353 3... -#> 9 MULTIPOLYGON (((-85.58963 3... -#> 10 MULTIPOLYGON (((-85.41657 3... -``` -### Filtering using `where` or `filter_geom` arguments - -You can also use the `fields` argument to select columns or the `where` argument to subset rows. - -For example, using a character vector of column names for `fields` and a simple SQL where clause for `where` you can select counties with population greater than 1,000,000: - - -```r -arc_select( - county_fl, - fields = c("state_abbr", "population"), - where = "population > 1000000" -) -#> Simple feature collection with 49 features and 2 fields -#> Geometry type: MULTIPOLYGON -#> Dimension: XY -#> Bounding box: xmin: -158.2674 ymin: 21.24986 xmax: -71.02671 ymax: 47.77552 -#> Geodetic CRS: WGS 84 -#> First 10 features: -#> STATE_ABBR POPULATION geometry -#> 1 AZ 4420568 MULTIPOLYGON (((-111.0425 3... -#> 2 AZ 1043433 MULTIPOLYGON (((-110.4522 3... -#> 3 CA 1682353 MULTIPOLYGON (((-121.4721 3... -#> 4 CA 1165927 MULTIPOLYGON (((-122.3076 3... -#> 5 CA 1008654 MULTIPOLYGON (((-120.6636 3... -#> 6 CA 10014009 MULTIPOLYGON (((-118.1067 3... -#> 7 CA 3186989 MULTIPOLYGON (((-117.509 33... -#> 8 CA 2418185 MULTIPOLYGON (((-116.0824 3... -#> 9 CA 1585055 MULTIPOLYGON (((-121.6652 3... -#> 10 CA 2181654 MULTIPOLYGON (((-117.7832 3... -``` - -For `FeatureLayer` and `Table` objects, and sometimes `ImageServer`s, the `list_fields()` function can be helpful to check available attributes and build a `where` query: - - -```r -list_fields(county_fl) -#> name type alias sqlType -#> 1 OBJECTID esriFieldTypeOID OBJECTID sqlTypeOther -#> 2 NAME esriFieldTypeString Name sqlTypeOther -#> 3 STATE_NAME esriFieldTypeString State Name sqlTypeOther -#> 4 STATE_FIPS esriFieldTypeString State FIPS sqlTypeOther -#> 5 FIPS esriFieldTypeString FIPS sqlTypeOther -#> 6 SQMI esriFieldTypeDouble Area in square miles sqlTypeOther -#> 7 POPULATION esriFieldTypeInteger 2020 Total Population sqlTypeOther -#> 8 POP_SQMI esriFieldTypeDouble People per square mile sqlTypeOther -#> 9 STATE_ABBR esriFieldTypeString State Abbreviation sqlTypeOther -#> 10 COUNTY_FIPS esriFieldTypeString County FIPS sqlTypeOther -#> 11 Shape__Area esriFieldTypeDouble Shape__Area sqlTypeDouble -#> 12 Shape__Length esriFieldTypeDouble Shape__Length sqlTypeDouble -#> nullable editable domain defaultValue length -#> 1 FALSE FALSE NA NA NA -#> 2 TRUE TRUE NA NA 50 -#> 3 TRUE TRUE NA NA 20 -#> 4 TRUE TRUE NA NA 2 -#> 5 TRUE TRUE NA NA 5 -#> 6 TRUE TRUE NA NA NA -#> 7 TRUE TRUE NA NA NA -#> 8 TRUE TRUE NA NA NA -#> 9 TRUE TRUE NA NA 2 -#> 10 TRUE TRUE NA NA 3 -#> 11 TRUE FALSE NA NA NA -#> 12 TRUE FALSE NA NA NA -#> description -#> 1 -#> 2 {"value":"The name of the county.","fieldValueType":"nameOrTitle"} -#> 3 {"value":"The name for the state in which the county is located.","fieldValueType":"nameOrTitle"} -#> 4 {"value":"The code (two-digit number) for the state in which the county is located.","fieldValueType":"uniqueIdentifier"} -#> 5 {"value":"The combined state and county codes. County codes begin with 001 for each state; use the combined code (five-digit number) to uniquely identify a county in the country.","fieldValueType":"uniqueIdentifier"} -#> 6 {"value":"The area of the county in square miles using the North America Albers Equal Area Conic projection.","fieldValueType":"measurement"} -#> 7 {"value":"The 2020 population of the county.","fieldValueType":"countOrAmount"} -#> 8 {"value":"The 2020 population of the county per square mile.","fieldValueType":"measurement"} -#> 9 {"value":"The two-letter abbreviation for the state in which the county is located.","fieldValueType":"uniqueIdentifier"} -#> 10 {"value":"The code (three-digit number) for the county.","fieldValueType":"uniqueIdentifier"} -#> 11 -#> 12 -``` - -You can also provide a `bbox`, `sfc`, or `sfg` object to the `filter_geom` argument to perform a spatial filter. If the `sfc` object contains more than one geometry, the object is combined with `sf::st_union()`. See documentation for more (`?arc_select`). - - -```r -nc <- sf::st_read(system.file("shape/nc.shp", package="sf")) -#> Reading layer `nc' from data source -#> `/Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library/sf/shape/nc.shp' -#> using driver `ESRI Shapefile' -#> Simple feature collection with 100 features and 14 fields -#> Geometry type: MULTIPOLYGON -#> Dimension: XY -#> Bounding box: xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965 -#> Geodetic CRS: NAD27 - -arc_select( - county_fl, - filter_geom = sf::st_bbox(nc[1,]) -) -#> Simple feature collection with 6 features and 12 fields -#> Geometry type: MULTIPOLYGON -#> Dimension: XY -#> Bounding box: xmin: -82.0477 ymin: 35.98946 xmax: -80.83795 ymax: 36.80746 -#> Geodetic CRS: WGS 84 -#> OBJECTID NAME STATE_NAME STATE_FIPS FIPS SQMI POPULATION -#> 1 1890 Alleghany County North Carolina 37 37005 236.26 10888 -#> 2 1892 Ashe County North Carolina 37 37009 429.38 26577 -#> 3 1982 Watauga County North Carolina 37 37189 313.32 54086 -#> 4 1984 Wilkes County North Carolina 37 37193 756.33 65969 -#> 5 2471 Johnson County Tennessee 47 47091 302.69 17948 -#> 6 2855 Grayson County Virginia 51 51077 445.57 15333 -#> POP_SQMI STATE_ABBR COUNTY_FIPS Shape__Area Shape__Length -#> 1 46.1 NC 005 0.06140165 1.231232 -#> 2 61.9 NC 009 0.11428581 1.442112 -#> 3 172.6 NC 189 0.08142272 1.287674 -#> 4 87.2 NC 193 0.19911944 1.984232 -#> 5 59.3 TN 091 0.07960385 1.290607 -#> 6 34.4 VA 077 0.11578917 1.945424 -#> geometry -#> 1 MULTIPOLYGON (((-81.2397 36... -#> 2 MULTIPOLYGON (((-81.47258 3... -#> 3 MULTIPOLYGON (((-81.80605 3... -#> 4 MULTIPOLYGON (((-81.02037 3... -#> 5 MULTIPOLYGON (((-81.74091 3... -#> 6 MULTIPOLYGON (((-81.34512 3... -``` - -### Creating a `SpatRaster` from an ArcGIS ImageServer - -A `SpatRaster` object from the `{terra}` package can be extracted from an `ImageServer` using `arc_raster()`. - -`arc_raster()` will extract the area defined by `xmin`, `ymin`, `xmax`, and `ymax`. You can optionally specify the `width` and `height` of the resultant image. Use `format` to define what type of image is returned. - - -```r -img_url <- "https://landsat2.arcgis.com/arcgis/rest/services/Landsat/MS/ImageServer" - -landsat <- arc_open(img_url) - -res <- arc_raster( - landsat, - xmin = -71, ymin = 43, - xmax = -67, ymax = 47.5, - bbox_crs = 4326, - width = 500, height = 500 -) - -terra::plotRGB(res, 4, 3, 2, scale = max(landsat[["maxValues"]])) -``` - -plot of chunk unnamed-chunk-8 - -## Authorization and publication - -Authorization is not required for reading any public data sources. - -Workflows that require authorization include: - - - interacting with [non-public](https://doc.arcgis.com/en/arcgis-online/share-maps/share-items.htm) services, - - publishing a new service (the authorized user must also have [publishing privileges](https://doc.arcgis.com/en/arcgis-online/administer/roles.htm)), and - - modifying or deleting any existing service (the authorized user must also have [edit access](https://doc.arcgis.com/en/arcgis-online/manage-data/manage-editing-hfl.htm) to the service). - -### Accessing non-public data - -The same functions for reading public ArcGIS Online and Enterprise services (such as `arc_open()`,`arc_read()`,`arc_select()`,`arc_raster()`, etc.) can be used to read data from non-public services by using the `token` argument. -For more information on tokens and authorization functions, see the [authorization article](https://r.esri.com/r-bridge-site/location-services/connecting-to-a-portal.html). - -### Publishing and modifying services from R - -The package includes functions to publish data to an ArcGIS Portal: - -- `add_item()`: Creates a new FeatureCollection from a `sf` or `data.frame` object -- `publish_item()`: Publishes an existing FeatureLayer -- `publish_layer()`: is a higher level wrapper around both `add_item()` and `publish_item()` - -There are also functions to add or modify data including `add_features()`, `update_features()`, and `delete_features()`. For a more detailed guide to adding, updating, and deleting features, view the tutorial on the [R-ArcGIS Bridge website](https://r.esri.com/r-bridge-site/location-services/workflows/add-delete-update.html). - -These functions all require authorization since data cannot be published or modified anonymously in ArcGIS Online and ArcGIS Enterprise. + + + +# arcgislayers + + + +[![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/license/apache-2-0) +[![R-CMD-check](https://github.com/R-ArcGIS/arcgislayers/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/R-ArcGIS/arcgislayers/actions/workflows/R-CMD-check.yaml) +[![Lifecycle: +stable](https://img.shields.io/badge/lifecycle-stable-brightgreen.svg)](https://lifecycle.r-lib.org/articles/stages.html#stable) +[![](https://cranlogs.r-pkg.org/badges/arcgislayers)](https://cran.r-project.org/package=arcgislayers) + + +The goal of `{arcgislayers}` is to provide an R interface to the [ArcGIS +REST API](https://developers.arcgis.com/rest/). + +## Installation + +It is recommend you install and use the metapackage `{arcgis}`. You can +install the development version of arcgis like so: + +``` r +remotes::install_github("r-arcgis/arcgis", dependencies = TRUE) +``` + +## Usage + +### Creating a simple feature object from an ArcGIS FeatureLayer + +``` r +library(arcgis) +#> Attaching core arcgis packages: +#> → arcgisutils v0.3.0 +#> → arcgislayers v0.3.0 +#> → arcgisgeocode v0.1.3 +#> → arcgisplaces v0.1.0 +``` + +`arc_open()` takes a URL to create a reference to a remote ArcGIS layer, +server, or table. The function can return any of the following classes +(corresponding to different ArcGIS service types): + +- `FeatureLayer` +- `Table` +- `FeatureServer` +- `ImageServer` +- `MapServer` +- `GroupLayer` + +For example, you can create a `FeatureLayer` object based on a Feature +Server URL: + +``` r +furl <- "https://services.arcgis.com/P3ePLMYs2RVChkJx/ArcGIS/rest/services/USA_Counties_Generalized_Boundaries/FeatureServer/0" + +county_fl <- arc_open(furl) + +county_fl +#> +#> Name: USA Counties - Generalized +#> Geometry Type: esriGeometryPolygon +#> CRS: 4326 +#> Capabilities: Query,Extract +``` + +You can then use `arc_select()` to query the feature layer object and +return an `sf` object. + +If no arguments are provided to `arc_select()` the entire feature layer +is returned in memory as an `sf` object. + +``` r +arc_select(county_fl) +#> Simple feature collection with 3143 features and 12 fields +#> Geometry type: POLYGON +#> Dimension: XY +#> Bounding box: xmin: -178.2176 ymin: 18.92179 xmax: -66.96927 ymax: 71.40624 +#> Geodetic CRS: WGS 84 +#> First 10 features: +#> OBJECTID NAME STATE_NAME STATE_FIPS FIPS SQMI +#> 1 1 Autauga County Alabama 01 01001 604.37 +#> 2 2 Baldwin County Alabama 01 01003 1633.14 +#> 3 3 Barbour County Alabama 01 01005 904.52 +#> 4 4 Bibb County Alabama 01 01007 626.17 +#> 5 5 Blount County Alabama 01 01009 650.63 +#> 6 6 Bullock County Alabama 01 01011 625.14 +#> 7 7 Butler County Alabama 01 01013 777.88 +#> 8 8 Calhoun County Alabama 01 01015 612.27 +#> 9 9 Chambers County Alabama 01 01017 603.11 +#> 10 10 Cherokee County Alabama 01 01019 599.98 +#> POPULATION POP_SQMI STATE_ABBR COUNTY_FIPS Shape__Area +#> 1 1970-01-01 11:20:05 97.3 AL 001 0.1489034 +#> 2 1970-01-03 11:22:47 141.9 AL 003 0.4044891 +#> 3 1970-01-01 02:00:23 27.9 AL 005 0.2224307 +#> 4 1970-01-01 01:11:33 35.6 AL 007 0.1577359 +#> 5 1970-01-01 11:25:34 90.9 AL 009 0.1675296 +#> 6 1969-12-31 21:52:37 16.6 AL 011 0.1557273 +#> 7 1970-01-01 00:17:31 24.5 AL 013 0.1927305 +#> 8 1970-01-02 03:20:41 190.2 AL 015 0.1523369 +#> 9 1970-01-01 04:39:32 57.7 AL 017 0.1531136 +#> 10 1970-01-01 01:56:11 41.6 AL 019 0.1527217 +#> Shape__Length geometry +#> 1 1.884137 POLYGON ((-86.82067 32.3473... +#> 2 3.678276 POLYGON ((-87.97309 31.1648... +#> 3 2.218514 POLYGON ((-85.74337 31.6262... +#> 4 1.852453 POLYGON ((-87.41986 33.0117... +#> 5 2.067456 POLYGON ((-86.96799 33.8604... +#> 6 2.006250 POLYGON ((-85.4114 32.15551... +#> 7 1.769462 POLYGON ((-86.44912 31.9712... +#> 8 2.149825 POLYGON ((-85.79353 33.5634... +#> 9 1.637226 POLYGON ((-85.58963 32.7313... +#> 10 1.794142 POLYGON ((-85.41657 34.0869... +``` + +### Filtering using `where` or `filter_geom` arguments + +You can also use the `fields` argument to select columns or the `where` +argument to subset rows. + +For example, using a character vector of column names for `fields` and a +simple SQL where clause for `where` you can select counties with +population greater than 1,000,000: + +``` r +arc_select( + county_fl, + fields = c("state_abbr", "population"), + where = "population > 1000000" +) +#> Simple feature collection with 49 features and 2 fields +#> Geometry type: POLYGON +#> Dimension: XY +#> Bounding box: xmin: -158.2674 ymin: 21.24986 xmax: -71.02671 ymax: 47.77552 +#> Geodetic CRS: WGS 84 +#> First 10 features: +#> STATE_ABBR POPULATION geometry +#> 1 AZ 1970-02-20 22:56:08 POLYGON ((-111.0425 33.4759... +#> 2 AZ 1970-01-12 20:50:33 POLYGON ((-110.4522 31.7360... +#> 3 CA 1970-01-20 06:19:13 POLYGON ((-121.4721 37.4777... +#> 4 CA 1970-01-14 06:52:07 POLYGON ((-122.3076 37.8917... +#> 5 CA 1970-01-12 11:10:54 POLYGON ((-120.6636 36.2787... +#> 6 CA 1970-04-26 17:40:09 POLYGON ((-118.1067 33.7475... +#> 7 CA 1970-02-06 16:16:29 POLYGON ((-117.509 33.50848... +#> 8 CA 1970-01-28 18:43:05 POLYGON ((-116.0824 33.4258... +#> 9 CA 1970-01-19 03:17:35 POLYGON ((-121.6652 38.1692... +#> 10 CA 1970-01-26 01:00:54 POLYGON ((-117.7832 33.9507... +``` + +For `FeatureLayer` and `Table` objects, and sometimes `ImageServer`s, +the `list_fields()` function can be helpful to check available +attributes and build a `where` query: + +``` r +list_fields(county_fl) +#> name type alias sqlType +#> 1 OBJECTID esriFieldTypeOID OBJECTID sqlTypeOther +#> 2 NAME esriFieldTypeString Name sqlTypeOther +#> 3 STATE_NAME esriFieldTypeString State Name sqlTypeOther +#> 4 STATE_FIPS esriFieldTypeString State FIPS sqlTypeOther +#> 5 FIPS esriFieldTypeString FIPS sqlTypeOther +#> 6 SQMI esriFieldTypeDouble Area in square miles sqlTypeOther +#> 7 POPULATION esriFieldTypeInteger 2020 Total Population sqlTypeOther +#> 8 POP_SQMI esriFieldTypeDouble People per square mile sqlTypeOther +#> 9 STATE_ABBR esriFieldTypeString State Abbreviation sqlTypeOther +#> 10 COUNTY_FIPS esriFieldTypeString County FIPS sqlTypeOther +#> 11 Shape__Area esriFieldTypeDouble Shape__Area sqlTypeDouble +#> 12 Shape__Length esriFieldTypeDouble Shape__Length sqlTypeDouble +#> nullable editable domain defaultValue length +#> 1 FALSE FALSE NA NA NA +#> 2 TRUE TRUE NA NA 50 +#> 3 TRUE TRUE NA NA 20 +#> 4 TRUE TRUE NA NA 2 +#> 5 TRUE TRUE NA NA 5 +#> 6 TRUE TRUE NA NA NA +#> 7 TRUE TRUE NA NA NA +#> 8 TRUE TRUE NA NA NA +#> 9 TRUE TRUE NA NA 2 +#> 10 TRUE TRUE NA NA 3 +#> 11 TRUE FALSE NA NA NA +#> 12 TRUE FALSE NA NA NA +#> description +#> 1 +#> 2 {"value":"The name of the county.","fieldValueType":"nameOrTitle"} +#> 3 {"value":"The name for the state in which the county is located.","fieldValueType":"nameOrTitle"} +#> 4 {"value":"The code (two-digit number) for the state in which the county is located.","fieldValueType":"uniqueIdentifier"} +#> 5 {"value":"The combined state and county codes. County codes begin with 001 for each state; use the combined code (five-digit number) to uniquely identify a county in the country.","fieldValueType":"uniqueIdentifier"} +#> 6 {"value":"The area of the county in square miles using the North America Albers Equal Area Conic projection.","fieldValueType":"measurement"} +#> 7 {"value":"The 2020 population of the county.","fieldValueType":"countOrAmount"} +#> 8 {"value":"The 2020 population of the county per square mile.","fieldValueType":"measurement"} +#> 9 {"value":"The two-letter abbreviation for the state in which the county is located.","fieldValueType":"uniqueIdentifier"} +#> 10 {"value":"The code (three-digit number) for the county.","fieldValueType":"uniqueIdentifier"} +#> 11 +#> 12 +``` + +You can also provide a `bbox`, `sfc`, or `sfg` object to the +`filter_geom` argument to perform a spatial filter. If the `sfc` object +contains more than one geometry, the object is combined with +`sf::st_union()`. See documentation for more (`?arc_select`). + +``` r +nc <- sf::st_read(system.file("shape/nc.shp", package="sf")) +#> Reading layer `nc' from data source +#> `/Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/library/sf/shape/nc.shp' +#> using driver `ESRI Shapefile' +#> Simple feature collection with 100 features and 14 fields +#> Geometry type: MULTIPOLYGON +#> Dimension: XY +#> Bounding box: xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965 +#> Geodetic CRS: NAD27 +``` + +``` r + +arc_select( + county_fl, + filter_geom = sf::st_bbox(nc[1,]) +) +#> Simple feature collection with 6 features and 12 fields +#> Geometry type: POLYGON +#> Dimension: XY +#> Bounding box: xmin: -82.0477 ymin: 35.98946 xmax: -80.83795 ymax: 36.80746 +#> Geodetic CRS: WGS 84 +#> OBJECTID NAME STATE_NAME STATE_FIPS FIPS SQMI +#> 1 1890 Alleghany County North Carolina 37 37005 236.26 +#> 2 1892 Ashe County North Carolina 37 37009 429.38 +#> 3 1982 Watauga County North Carolina 37 37189 313.32 +#> 4 1984 Wilkes County North Carolina 37 37193 756.33 +#> 5 2471 Johnson County Tennessee 47 47091 302.69 +#> 6 2855 Grayson County Virginia 51 51077 445.57 +#> POPULATION POP_SQMI STATE_ABBR COUNTY_FIPS Shape__Area Shape__Length +#> 1 1969-12-31 22:01:28 46.1 NC 005 0.06140165 1.231232 +#> 2 1970-01-01 02:22:57 61.9 NC 009 0.11428581 1.442112 +#> 3 1970-01-01 10:01:26 172.6 NC 189 0.08142272 1.287674 +#> 4 1970-01-01 13:19:29 87.2 NC 193 0.19911944 1.984232 +#> 5 1969-12-31 23:59:08 59.3 TN 091 0.07960385 1.290607 +#> 6 1969-12-31 23:15:33 34.4 VA 077 0.11578917 1.945424 +#> geometry +#> 1 POLYGON ((-81.2397 36.36549... +#> 2 POLYGON ((-81.47258 36.2344... +#> 3 POLYGON ((-81.80605 36.1046... +#> 4 POLYGON ((-81.02037 36.0350... +#> 5 POLYGON ((-81.74091 36.3919... +#> 6 POLYGON ((-81.34512 36.5729... +``` + +### Creating a `SpatRaster` from an ArcGIS ImageServer + +A `SpatRaster` object from the `{terra}` package can be extracted from +an `ImageServer` using `arc_raster()`. + +`arc_raster()` will extract the area defined by `xmin`, `ymin`, `xmax`, +and `ymax`. You can optionally specify the `width` and `height` of the +resultant image. Use `format` to define what type of image is returned. + +``` r +img_url <- "https://landsat2.arcgis.com/arcgis/rest/services/Landsat/MS/ImageServer" + +landsat <- arc_open(img_url) + +res <- arc_raster( + landsat, + xmin = -71, ymin = 43, + xmax = -67, ymax = 47.5, + bbox_crs = 4326, + width = 500, height = 500 +) + +terra::plotRGB(res, 4, 3, 2, scale = max(landsat[["maxValues"]])) +``` + + + +## Authorization and publication + +Authorization is not required for reading any public data sources. + +Workflows that require authorization include: + +- interacting with + [non-public](https://doc.arcgis.com/en/arcgis-online/share-maps/share-items.htm) + services, +- publishing a new service (the authorized user must also have + [publishing + privileges](https://doc.arcgis.com/en/arcgis-online/administer/roles.htm)), + and +- modifying or deleting any existing service (the authorized user must + also have [edit + access](https://doc.arcgis.com/en/arcgis-online/manage-data/manage-editing-hfl.htm) + to the service). + +### Accessing non-public data + +The same functions for reading public ArcGIS Online and Enterprise +services (such as +`arc_open()`,`arc_read()`,`arc_select()`,`arc_raster()`, etc.) can be +used to read data from non-public services by using the `token` +argument. For more information on tokens and authorization functions, +see the [authorization +article](https://r.esri.com/r-bridge-site/location-services/connecting-to-a-portal.html). + +### Publishing and modifying services from R + +The package includes functions to publish data to an ArcGIS Portal: + +- `add_item()`: Creates a new FeatureCollection from a `sf` or + `data.frame` object +- `publish_item()`: Publishes an existing FeatureLayer +- `publish_layer()`: is a higher level wrapper around both `add_item()` + and `publish_item()` + +There are also functions to add or modify data including +`add_features()`, `update_features()`, and `delete_features()`. For a +more detailed guide to adding, updating, and deleting features, view the +tutorial on the [R-ArcGIS Bridge +website](https://r.esri.com/r-bridge-site/location-services/workflows/add-delete-update.html). + +These functions all require authorization since data cannot be published +or modified anonymously in ArcGIS Online and ArcGIS Enterprise. diff --git a/man/figures/README-unnamed-chunk-8-1.png b/man/figures/README-unnamed-chunk-8-1.png index 20387c1..0c5697b 100644 Binary files a/man/figures/README-unnamed-chunk-8-1.png and b/man/figures/README-unnamed-chunk-8-1.png differ diff --git a/man/figures/logo.svg b/man/figures/logo.svg new file mode 100644 index 0000000..e291968 --- /dev/null +++ b/man/figures/logo.svg @@ -0,0 +1 @@ +AAA0N2p1bWIAAAAeanVtZGMycGEAEQAQgAAAqgA4m3EDYzJwYQAAADQRanVtYgAAAEdqdW1kYzJtYQARABCAAACqADibcQN1cm46dXVpZDpjNzI3ODZmMS0xMWJhLTQyMjYtODQyOC1iN2Q3ZDMwNzhhNmQAAAABp2p1bWIAAAApanVtZGMyYXMAEQAQgAAAqgA4m3EDYzJwYS5hc3NlcnRpb25zAAAAAMpqdW1iAAAAJmp1bWRjYm9yABEAEIAAAKoAOJtxA2MycGEuYWN0aW9ucwAAAACcY2JvcqFnYWN0aW9uc4GjZmFjdGlvbmtjMnBhLmVkaXRlZG1zb2Z0d2FyZUFnZW50bUFkb2JlIEZpcmVmbHlxZGlnaXRhbFNvdXJjZVR5cGV4Rmh0dHA6Ly9jdi5pcHRjLm9yZy9uZXdzY29kZXMvZGlnaXRhbHNvdXJjZXR5cGUvdHJhaW5lZEFsZ29yaXRobWljTWVkaWEAAACsanVtYgAAAChqdW1kY2JvcgARABCAAACqADibcQNjMnBhLmhhc2guZGF0YQAAAAB8Y2JvcqVqZXhjbHVzaW9uc4GiZXN0YXJ0GOJmbGVuZ3RoGUWgZG5hbWVuanVtYmYgbWFuaWZlc3RjYWxnZnNoYTI1NmRoYXNoWCBJKpXsXEjol21ChKDwAenvnjpdYN7pH45wuYtpN0s7pGNwYWRJAAAAAAAAAAAAAAACC2p1bWIAAAAkanVtZGMyY2wAEQAQgAAAqgA4m3EDYzJwYS5jbGFpbQAAAAHfY2JvcqhoZGM6dGl0bGVvR2VuZXJhdGVkIEltYWdlaWRjOmZvcm1hdG1pbWFnZS9zdmcreG1samluc3RhbmNlSUR4LHhtcDppaWQ6MDE3MWI2NDctNTYyMy00NTU3LWFjNWUtNzFkOGE5YmJjZDNjb2NsYWltX2dlbmVyYXRvcng2QWRvYmVfSWxsdXN0cmF0b3IvMjguMCBhZG9iZV9jMnBhLzAuNy42IGMycGEtcnMvMC4yNS4ydGNsYWltX2dlbmVyYXRvcl9pbmZvgb9kbmFtZXFBZG9iZSBJbGx1c3RyYXRvcmd2ZXJzaW9uZDI4LjD/aXNpZ25hdHVyZXgZc2VsZiNqdW1iZj1jMnBhLnNpZ25hdHVyZWphc3NlcnRpb25zgqJjdXJseCdzZWxmI2p1bWJmPWM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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9lkBAHkMLdKlRjf1c2LL5TY647wK2XTiGUA/3WFlvg92ZpPUeS4AsqLML/7sD8Gvr8aXfyDXteoBkOrIrwAQdrHI1XQJB7XsPx7LxPcj+IAG68Lbh4UtrNTWD/D//T3zES5WHUUte0K8XATP1aCe89lnzuB2VSUFMo/OlOwjB+hTM0gRDrXDB/ySOGIAjgGC4oslqu/wlFQW5BSc+apdd9+pJkWOMSY3oJyIF4rJhYsgPpD6EvkcYgyUhBbOQuHmNvybi5kRoDUBA3+aSdY5a7tsudolkEzlkex/BVGmAwacoEh/7tqIMEdEpN1rnTrfRBfaIkxbA7ryw0AReGAe5hoO+i0= \ No newline at end of file