Introduction to rmapzen

Introduction

rmapzen is a client for any implementation of the Mapzen API. Though Mapzen itself has gone out of business, rmapzen can be set up to work with any provider who hosts Mapzen’s open-source software, including geocode.earth, Nextzen, and NYC GeoSearch from NYC Planning Labs. For more information, see https://www.mapzen.com/documentation/. The project is available on github as well as CRAN.

rmapzen provides access to the following Mapzen API services:

  • Search: Structured and unstructured search and geocoding, reverse geocoding, and autocomplete.
  • Vector Tiles: Basemap vector data.
  • Isochrone: Calculation of areas reachable from a specified locations.

Set-up

rmapzen works with API providers who implement the Mapzen API. In order to specify provider information (such as URL and API key), use mz_set_host. There are custom set-up functions for the following providers:

  • geocode.earth, for search services. Use the function mz_set_search_host_geocode.earth
  • Nextzen, for vector tiles. Use the function mz_set_tile_host_nextzen.
  • NYC GeoSearch, for search services using New York City’s Property Address Directory. Use mz_set_search_host_nyc_geosearch.

As of this writing, there are no public providers offering the Mapzen isochrone service.

Vector tile service

rmapzen provides an interface to Mapzen’s vector tiles service. Tile requests can be specified using the x, y, zoom coordinates of the tile service, as well as with a lat/long bounding box. Multiple tiles are stitched together and returned as an object of class mz_vector_tiles. See ?mz_vector_tiles. The sample data set ca_tiles contains zoomed out vector tile data for all of California as well as parts of neighboring states.

ca_tiles
#> Mapzen vector tile data
#> Layers: (count of features in parentheses)
#>     water (144)
#>     buildings (0)
#>     places (28)
#>     transit (10)
#>     pois (30)
#>     boundaries (22)
#>     roads (308)
#>     earth (4)
#>     landuse (176)

Each element of a vector tile response includes point, line, and/or polygon data for an individual map layer, and has class mapzen_vector_layer. Like other response types, the mapzen_vector_layer can be converted to sf objects for further processing, using the generic function as_sf

# points of interest
as_sf(ca_tiles$pois)
#> Registered S3 method overwritten by 'geojsonsf':
#>   method        from   
#>   print.geojson geojson
#> Simple feature collection with 30 features and 11 fields
#> Geometry type: POINT
#> Dimension:     XY
#> Bounding box:  xmin: -123.536 ymin: 32.009 xmax: -112.58 ymax: 48.808
#> Geodetic CRS:  WGS 84
#> # A tibble: 30 × 12
#>    kind          protect_class area     operator `name:de` source min_zoom tier 
#>    <chr>         <chr>         <chr>    <chr>    <chr>     <chr>  <chr>    <chr>
#>  1 national_park 2             1377580… United … <NA>      opens… 5.58     1    
#>  2 national_park 2             2035390… United … <NA>      opens… 5.29     1    
#>  3 national_park 2             2132460… United … National… opens… 3.6      1    
#>  4 national_park 2             2543010… United … <NA>      opens… 5.13     1    
#>  5 national_park 2             2552470… United … Sequoia-… opens… 5.13     1    
#>  6 national_park 2             2740480… United … National… opens… 5.08     1    
#>  7 national_park 2             2812880… United … Kings-Ca… opens… 5.06     1    
#>  8 national_park 2             4671080… United … Joshua-T… opens… 4.7      1    
#>  9 national_park 2             4858760… United … Yosemite… opens… 4.67     1    
#> 10 national_park 2             7790180… United … Olympic-… opens… 4.33     1    
#> # ℹ 20 more rows
#> # ℹ 4 more variables: osm_relation <chr>, name <chr>, id <chr>,
#> #   geometry <POINT [°]>

sf conversion

Any object returned by a Mapzen service can be converted to the appropriate sf object using the generic as_sf, for easy interoperability with other packages. You can also convert most objects directly to data frames, allowing for use within tidy pipelines:

library(dplyr)
library(sf)
as_sf(oakland_public) %>%
    select(name, confidence, region, locality, neighbourhood)
#> Simple feature collection with 25 features and 5 fields
#> Geometry type: POINT
#> Dimension:     XY
#> Bounding box:  xmin: -122.2854 ymin: 37.73742 xmax: -122.1749 ymax: 37.84632
#> Geodetic CRS:  WGS 84
#> # A tibble: 25 × 6
#>    name       confidence region locality neighbourhood             geometry
#>    <chr>           <dbl> <chr>  <chr>    <chr>                  <POINT [°]>
#>  1 Oakland P…      0.926 Calif… Oakland  Shafter       (-122.2625 37.83824)
#>  2 Oakland P…      0.926 Calif… Oakland  Rockridge        (-122.2511 37.84)
#>  3 Lakeview …      0.664 Calif… Oakland  <NA>           (-122.249 37.80919)
#>  4 Golden Ga…      0.663 Calif… Oakland  Gaskill       (-122.2822 37.83937)
#>  5 Brookfiel…      0.663 Calif… Oakland  South Stoneh… (-122.1886 37.73742)
#>  6 West Oakl…      0.663 Calif… Oakland  Ralph Bunche  (-122.2854 37.81296)
#>  7 Elmhurst …      0.663 Calif… Oakland  Webster       (-122.1749 37.75154)
#>  8 Montclair…      0.663 Calif… Oakland  Montclair     (-122.2141 37.83204)
#>  9 Main Bran…      0.663 Calif… Oakland  Civic Center  (-122.2638 37.80101)
#> 10 Latin Ame…      0.663 Calif… Oakland  St. Elizabeth (-122.2225 37.78354)
#> # ℹ 15 more rows

Accessor methods

Currently, the following methods are available to pull out commonly used pieces of a response:

  • mz_coordinates (only available for search results): extracts lat/lon coordinates from search results, and returns them as a data.frame.
  • mz_bbox: returns the bounding box of an object as a data.frame with columns min_lon, min_lat, max_lon, and max_lat.
mz_bbox(ca_tiles)
#> # A tibble: 1 × 4
#>   min_lon min_lat max_lon max_lat
#> *   <dbl>   <dbl>   <dbl>   <dbl>
#> 1    -135    32.0   -112.    48.9