What is osmnxr?
osmnxr is OSMnx for R: it downloads, models,
analyzes and visualizes street networks from OpenStreetMap. The public API
is tidyverse-friendly and returns sf objects; the
heavy graph computation (routing, metrics, simplification) runs in a
bundled Rust core.
The central object is the osm_graph: a pair of
sf tables (nodes and edges) plus metadata.
A real network
The usual entry point is a place name, which downloads from OpenStreetMap:
g <- ox_graph_from_place("Olinda, Brazil", network_type = "drive")
g <- ox_simplify(g)So this vignette runs offline, we load that exact network — the historic centre of Olinda, Brazil — from the copy bundled with the package:
g <- ox_example("olinda")
g
#>
#> ── osm_graph ───────────────────────────────────────────────────────────────────
#> 498 nodes, 1191 edges
#> Network type: "unknown"
#> Simplified: FALSE
#> CRS: "WGS 84"
plot(g)
Network statistics
ox_basic_stats(g)
#> # A tibble: 1 × 7
#> n_nodes n_edges total_length mean_length mean_out_degree self_loops circuity
#> <int> <int> <dbl> <dbl> <dbl> <int> <dbl>
#> 1 498 1191 95484. 80.2 2.39 1 1.06Routing
Snap coordinates to graph nodes, then compute the shortest path (Dijkstra, in Rust):
orig <- ox_nearest_nodes(g, x = -34.8553, y = -8.0089)
dest <- ox_nearest_nodes(g, x = -34.8505, y = -8.0125)
route <- ox_shortest_path(g, orig, dest)
length(route) # nodes along the route
#> [1] 8
route_xy <- sf::st_coordinates(g$nodes)[match(route, g$nodes$osmid), ]
plot(g, col = "grey80", lwd = 0.6)
lines(route_xy, col = "#b7410e", lwd = 3)
Where to next
- Routing and isochrones — travel time, route alternatives, service areas.
- Urban metrics — circuity, centrality, chokepoints.
- Street orientation — grid order across cities.
- Accessibility analysis — access to schools, hospitals, parks.
- Features and points of interest — download POIs and buildings.
No network needed at all? example_osm_graph() builds a
synthetic grid for quick experiments.