MyNixOS website logo
Description

Geocoding with the 'ArcGIS' REST API Service.

Lightweight interface for converting addresses into geographic coordinates and coordinates into addresses using the 'ArcGIS' REST API service <https://developers.arcgis.com/rest/geocode/api-reference/overview-world-geocoding-service.htm>. Address text can be converted to location candidates and locations can be converted into addresses. No API key is required.

arcgeocoder arcgeocoder website

CRANstatus CRANresults Downloads R-CMD-check codecov r-universe CodeFactor Project Status: Active – The project has reached a stable, usablestate and is being activelydeveloped. DOI status

The goal of arcgeocoder is to provide a lightweight interface for geocoding addresses and reverse geocoding coordinates through the ArcGIS REST API geocoding service.

The full site with examples and vignettes is available at https://dieghernan.github.io/arcgeocoder/.

Why arcgeocoder?

arcgeocoder provides a lightweight interface for geocoding and reverse geocoding with the ArcGIS REST API service. It accesses the API without depending on additional HTTP packages such as curl. In some situations, curl may not be available or accessible, so arcgeocoder uses base functions to avoid this limitation.

The interface of arcgeocoder is designed to make ArcGIS geocoding features easier to access. The API endpoints used by arcgeocoder are findAddressCandidates and reverseGeocode, which can be accessed without an API key.

Recommended packages

Other packages are more mature and provide similar features:

Installation

Install arcgeocoder from CRAN with:

install.packages("arcgeocoder")

Check the documentation for the development version in https://dieghernan.github.io/arcgeocoder/dev/.

You can install the development version of arcgeocoder with:

# install.packages("pak")
pak::pak("dieghernan/arcgeocoder")

Alternatively, you can install arcgeocoder using the r-universe:

# Install arcgeocoder in R:
install.packages(
  "arcgeocoder",
  repos = c(
    "https://dieghernan.r-universe.dev",
    "https://cloud.r-project.org"
  )
)

Usage

Geocoding and reverse geocoding

Note: examples adapted from the tidygeocoder package.

In this first example, we geocode a few addresses using the arc_geo() function. Note that arcgeocoder works without additional setup, and you do not need to provide an API key to start geocoding.

library(arcgeocoder)
library(dplyr)

# Create a data frame with addresses.
some_addresses <- tribble(
  ~name, ~addr,
  "White House", "1600 Pennsylvania Ave NW, Washington, DC",
  "Transamerica Pyramid", "600 Montgomery St, San Francisco, CA 94111",
  "Willis Tower", "233 S Wacker Dr, Chicago, IL 60606"
)

# Geocode the addresses.
lat_longs <- arc_geo(
  some_addresses$addr,
  lat = "latitude",
  long = "longitude",
  progressbar = FALSE
)

Only a few fields are returned from the geocoding service in this example, but full_results = TRUE can be used to return all data from the service.

querylatitudelongitudeaddressscorexyxminyminxmaxymaxwkidlatestWkid
1600 Pennsylvania Ave NW, Washington, DC38.89768-77.036551600 Pennsylvania Ave NW, Washington, District of Columbia, 20500100-77.0365538.89768-77.0375538.89668-77.0355538.8986843264326
600 Montgomery St, San Francisco, CA 9411137.79516-122.40273600 Montgomery St, San Francisco, California, 94111100-122.4027337.79516-122.4037337.79416-122.4017337.7961643264326
233 S Wacker Dr, Chicago, IL 6060641.87867-87.63587233 S Wacker Dr, Chicago, Illinois, 60606100-87.6358741.87867-87.6368741.87767-87.6348741.8796743264326

Table 1: Example: geocoding addresses.

To perform reverse geocoding (obtaining addresses from geographic coordinates), we can use the arc_reverse_geo() function. The arguments are similar to those in arc_geo(), but now we specify the input data columns with the x and y arguments. The data used here comes from the geocoding query above. The single-line address is returned in the column named by address.

reverse <- arc_reverse_geo(
  x = lat_longs$longitude,
  y = lat_longs$latitude,
  address = "address_found",
  progressbar = FALSE
)
xyaddress_found
-77.0365538.89768White House, 1600 Pennsylvania Ave NW, Washington, DC, 20500, USA
-122.4027337.79516Chess Ventures, 600 Montgomery St, San Francisco, CA, 94111, USA
-87.6358741.87867The Metropolitan, 233 South Wacker Drive, Chicago, IL, 60606, USA

Table 2: Example: reverse geocoding addresses.

It is also possible to search for specific locations within or near a reference area or location using category filtering. See the documentation for the arc_categories data object for more information.

In the following example, we look for food-related points of interest (POIs), such as restaurants, coffee shops and bakeries, near the Eiffel Tower in France.

library(ggplot2) # For plotting.

# Step 1: Locate the Eiffel Tower using a multi-field query.

eiffel_tower <- arc_geo_multi(
  address = "Tour Eiffel",
  city = "Paris",
  countrycode = "FR",
  langcode = "FR",
  custom_query = list(outFields = "LongLabel")
)

# Display results.
eiffel_tower |>
  select(lon, lat, LongLabel)
#> # A tibble: 1 × 3
#>     lon   lat LongLabel                                                         
#>   <dbl> <dbl> <chr>                                                             
#> 1  2.29  48.9 Tour Eiffel, 3 Rue de l'Université, 75007, 7e Arrondissement, Par…

# Use `lon` and `lat` as a reference location for `category = "Food"`.
food_eiffel <- arc_geo_categories(
  "Food",
  x = eiffel_tower$lon,
  y = eiffel_tower$lat,
  limit = 50,
  full_results = TRUE
)

# Plot by food type.
ggplot(eiffel_tower, aes(x, y)) +
  geom_point(shape = 17, color = "red", size = 4) +
  geom_point(data = food_eiffel, aes(x, y, color = Type)) +
  labs(
    title = "Food near the Eiffel Tower",
    subtitle = "Using arcgeocoder",
    color = "Type of place",
    x = "",
    y = "",
    caption = "Data from the ArcGIS REST API service"
  )

Example: Food places near the Eiffel Tower

arcgeocoder and spatial data

It is straightforward to convert arcgeocoder results to an sf object:

library(sf)

food_eiffel_sf <- st_as_sf(
  food_eiffel,
  coords = c("lon", "lat"),
  # Set the CRS of the resulting coordinates.
  crs = eiffel_tower$wkid
)

food_eiffel_sf
#> Simple feature collection with 50 features and 85 fields
#> Geometry type: POINT
#> Dimension:     XY
#> Bounding box:  xmin: 2.2899 ymin: 48.8565 xmax: 2.299326 ymax: 48.86134
#> Geodetic CRS:  WGS 84
#> # A tibble: 50 × 86
#>    q_category   q_x   q_y q_bbox_xmin q_bbox_ymin q_bbox_xmax q_bbox_ymax
#>  * <chr>      <dbl> <dbl> <lgl>       <lgl>       <lgl>       <lgl>      
#>  1 Food        2.29  48.9 NA          NA          NA          NA         
#>  2 Food        2.29  48.9 NA          NA          NA          NA         
#>  3 Food        2.29  48.9 NA          NA          NA          NA         
#>  4 Food        2.29  48.9 NA          NA          NA          NA         
#>  5 Food        2.29  48.9 NA          NA          NA          NA         
#>  6 Food        2.29  48.9 NA          NA          NA          NA         
#>  7 Food        2.29  48.9 NA          NA          NA          NA         
#>  8 Food        2.29  48.9 NA          NA          NA          NA         
#>  9 Food        2.29  48.9 NA          NA          NA          NA         
#> 10 Food        2.29  48.9 NA          NA          NA          NA         
#> # ℹ 40 more rows
#> # ℹ 79 more variables: address <chr>, score <int>, x <dbl>, y <dbl>,
#> #   Loc_name <chr>, Status <chr>, Score <int>, Match_addr <chr>,
#> #   LongLabel <chr>, ShortLabel <chr>, Addr_type <chr>, Type <chr>,
#> #   PlaceName <chr>, Place_addr <chr>, Phone <chr>, URL <chr>, Rank <int>,
#> #   AddBldg <chr>, AddNum <chr>, AddNumFrom <chr>, AddNumTo <chr>,
#> #   AddRange <chr>, Side <chr>, StPreDir <chr>, StPreType <chr>, …

ggplot(food_eiffel_sf) +
  geom_sf(aes(color = Type)) +
  coord_sf(crs = 3035)

Example: Food places near the Eiffel Tower using the sf package.

Citation

Hernangómez D (2026). arcgeocoder: Geocoding with the ArcGIS REST API Service. doi:10.32614/CRAN.package.arcgeocoder. https://dieghernan.github.io/arcgeocoder/.

A BibTeX entry for LaTeX users is

@Manual{R-arcgeocoder,
  title = {{arcgeocoder}: Geocoding with the {ArcGIS} {REST} {API} Service},
  doi = {10.32614/CRAN.package.arcgeocoder},
  author = {Diego Hernangómez},
  year = {2026},
  version = {0.4.1},
  url = {https://dieghernan.github.io/arcgeocoder/},
  abstract = {Lightweight interface for converting addresses into geographic coordinates and coordinates into addresses using the ArcGIS REST API service <https://developers.arcgis.com/rest/geocode/api-reference/overview-world-geocoding-service.htm>. Address text can be converted to location candidates and locations can be converted into addresses. No API key is required.},
}

References

Cambon, Jesse, Diego Hernangómez, Christopher Belanger, and Daniel Possenriede. 2021. “tidygeocoder: An R Package for Geocoding.” Journal of Open Source Software 6 (65): 3544. https://doi.org/10.21105/joss.03544.

Hernangómez, Diego. 2024. nominatimlite: Interface with Nominatim API Service. Version 0.2.1. https://doi.org/10.5281/zenodo.5113195.

Metadata

Version

0.4.1

License

Unknown

Platforms (79)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    uefi
    wasip1
    Windows
Show all
  • aarch64-darwin
  • aarch64-freebsd
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64-uefi
  • aarch64-windows
  • aarch64_be-none
  • arc-linux
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-linux
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • sh4-linux
  • vc4-none
  • wasm32-wasip1
  • wasm64-wasip1
  • x86_64-cygwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-uefi
  • x86_64-windows