nominatimlite provides a lightweight interface to the Nominatim API. It supports free-form and structured address searches, reverse geocoding, amenity lookup and address lookup by OpenStreetMap object identifier. Results are returned as tibbles or sf objects.
The full site with examples and vignettes is available at https://dieghernan.github.io/nominatimlite/.
What is Nominatim?
Nominatim searches OpenStreetMap data by name and address (geocoding) and finds addresses from geographic coordinates (reverse geocoding).
Why nominatimlite?
nominatimlite accesses the Nominatim API without requiring the curl package. This makes the package useful in environments where curl is not available. API requests use base R functions instead.
Recommended packages
Related packages provide broader interfaces to geocoding services and OpenStreetMap data:
- tidygeocoder (Cambon et al. 2021): Provides an interface to geocoding services such as Nominatim, Google, TomTom and Mapbox.
- osmdata (Padgham et al. 2017): Downloads spatial data from OpenStreetMap with the Overpass API.
- arcgeocoder (Hernangómez 2024): Provides a lightweight interface for geocoding with the ArcGIS REST API service.
Usage
sf objects
Use functions with the _sf suffix to return matching results as sf objects:
library(nominatimlite)
# Search for Pizza Hut locations in California.
CA <- geo_lite_sf("California", points_only = FALSE)
pizzahut <- geo_lite_sf(
"Pizza Hut, California",
limit = 50,
custom_query = list(countrycodes = "us")
)
library(ggplot2)
ggplot(CA) +
geom_sf() +
geom_sf(data = pizzahut, col = "red")
Set points_only = FALSE to return polygon and line geometries when they are available from the Nominatim API:
sol_poly <- geo_lite_sf("Statue of Liberty, NY, USA", points_only = FALSE)
ggplot(sol_poly) +
geom_sf()
Address search and reverse geocoding
The examples in this section are adapted from the tidygeocoder package.
Use geo_lite() to perform a free-form address search:
# Create a data frame with addresses.
some_addresses <- dplyr::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 <- geo_lite(
some_addresses$addr,
lat = "latitude",
long = "longitude",
progressbar = FALSE
)By default, geo_lite() returns the query, latitude, longitude and address columns. Set full_results = TRUE to return all available fields from the Nominatim API.
| query | latitude | longitude | address |
|---|---|---|---|
| 1600 Pennsylvania Ave NW, Washington, DC | 38.89764 | -77.03655 | White House, 1600, Pennsylvania Avenue Northwest, Ward 2, Washington, District of Columbia, 20500, United States |
| 600 Montgomery St, San Francisco, CA 94111 | 37.79519 | -122.40279 | Transamerica Pyramid, 600, Montgomery Street, Financial District, South of Market, San Francisco, California, 94111, United States |
| 233 S Wacker Dr, Chicago, IL 60606 | 41.87874 | -87.63596 | Willis Tower, 233, South Wacker Drive, Financial District, Loop, Chicago, South Chicago Township, Cook County, Illinois, 60606, United States |
Use reverse_geo_lite() to find addresses from latitude and longitude coordinates. The lat and long arguments use the results from the address search above. The address argument specifies the name of the output column that contains each single-line address.
reverse <- reverse_geo_lite(
lat = lat_longs$latitude,
long = lat_longs$longitude,
address = "address_found",
progressbar = FALSE
)| address_found | lat | lon |
|---|---|---|
| White House, 1600, Pennsylvania Avenue Northwest, Downtown, Ward 2, Washington, District of Columbia, 20500, United States | 38.89764 | -77.03655 |
| 600, Montgomery Street, Financial District, South of Market, San Francisco, California, 94111, United States | 37.79541 | -122.40257 |
| SkyDeck Chicago Willis Tower, 233, South Wacker Drive, Financial District, Loop, Chicago, South Chicago Township, Cook County, Illinois, 60606, United States | 41.87850 | -87.63589 |
See the Nominatim search API documentation for additional parameters that can be passed through custom_query.
