---
title: "Features and points of interest"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Features and points of interest}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(collapse = TRUE, comment = "#>", fig.width = 6.5, fig.height = 5.5)
```

```{r setup}
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:

```{r, eval = FALSE}
# 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:

```{r, eval = FALSE}
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`:

```{r, eval = FALSE}
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](accessibility.html) article:

```{r, eval = FALSE}
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*.
