# Features and points of interest

    library(osmnxr)

Beyond street networks, `osmnxr` downloads any OpenStreetMap feature — amenities, building footprints, transit stops, parks, shops — as tidy `sf` points, mirroring OSMnx’s `features` module (Boeing 2025). Because these calls hit the live Overpass API, the download chunks below are not executed when the vignette is built; run them interactively.

## Tag filters

Features are selected with tags, given as a named list. Each entry is either `TRUE` (the key with any value) or a character vector of allowed values:

    # schools in a place
    ox_features_from_place("Olinda, Brazil", tags = list(amenity = "school"))

    # the amenities studied in accessibility research, in one call
    ox_features_from_place(
      "Recife, Brazil",
      tags = list(amenity = c("school", "hospital", "pharmacy", "marketplace"))
    )

    # every building footprint (key present, any value)
    ox_features_from_place("Olinda, Brazil", tags = list(building = TRUE))

    # parks and green space
    ox_features_from_place("Recife, Brazil", tags = list(leisure = "park"))

    # public transit stops
    ox_features_from_place("Recife, Brazil", tags = list(public_transport = "stop_position"))

## From a bounding box

When you already know the extent, query a bounding box (`c(xmin, ymin, xmax, ymax)` in longitude/latitude) directly:

    bbox <- c(-34.91, -8.07, -34.87, -8.04)
    pois <- ox_features_from_bbox(bbox, tags = list(amenity = c("pharmacy", "clinic")))
    pois

## A tidy result

Each call returns an `sf` of points with `osm_type`, `osm_id` and one column per tag encountered, so it composes directly with `dplyr` and `sf`:

    library(dplyr)
    pois |>
      st_drop_geometry() |>
      count(amenity, sort = TRUE)

## Combining features with a network

Features and the street network share the same CRS (EPSG:4326), so you can snap facilities to the network and analyse access. This is the bridge to the Accessibility article:

    g <- ox_graph_from_place("Olinda, Brazil", network_type = "walk") |>
      ox_simplify() |>
      ox_add_edge_travel_times()

    schools <- ox_features_from_place("Olinda, Brazil", tags = list(amenity = "school"))
    xy <- sf::st_coordinates(schools)
    nodes <- ox_nearest_nodes(g, xy[, 1], xy[, 2])

    # 15-minute walking catchment around every school
    ox_isochrone(g, nodes, cutoffs = 900, weight = "travel_time")

## References

Boeing, G. (2025). Modeling and analyzing urban networks and amenities with OSMnx. Geographical Analysis.