Imagery
Imagery
Street-level imagery and road map-features (signs, signals, crossings) for a point, bounding box, or route corridor — sourced from the Navvo imagery network.
Scope required: imagery
bbox parameter here is minLng,minLat,maxLng,maxLat (west, south, east, north). Image/feature coordinates are GeoJSON [lng, lat]. JSON responses carry caching metadata (cacheStatus, cachedAt, refreshedAt) and sourceAttributionRequired: true — Navvo imagery attribution is mandatory when you display imagery. Requested bounding boxes and result counts are capped server-side based on zoom.GET /imagery/mapillary
Street-level image points within a bounding box.
Query parameters
minLng,minLat,maxLng,maxLat, e.g. 35.9,31.9,35.95,31.96.{
"provider": "navvo",
"configured": true,
"available": true,
"bbox": "35.922500,31.929500,35.932500,31.939500",
"images": [
{
"id": "498763215480123",
"thumb_256_url": "https://…/256.jpg",
"computed_geometry": { "type": "Point", "coordinates": [35.9281, 31.9344] },
"captured_at": 1700000000000,
"sequence": "j1UNvFYGJqcMLi2Zay7l9n"
}
],
"cacheStatus": "fresh",
"sourceAttributionRequired": true
}
When the imagery network is not configured: configured:false, available:false, images:[].
GET /imagery/nearest-image
The closest street-level image to a point, plus nearby images and a client token for the Navvo imagery viewer.
Query parameters
{
"available": true,
"image": {
"id": "498763215480123",
"thumb_1024_url": "https://…/1024.jpg",
"captured_at": "2023-11-14T22:13:20.000Z",
"sequence_id": "j1UNvFYGJqcMLi2Zay7l9n",
"computed_geometry": { "type": "Point", "coordinates": [35.9051, 31.9649] }
},
"nearby": [ /* up to 11 more, same shape */ ],
"clientToken": "MLY|…",
"sourceAttributionRequired": true
}
clientToken is a Navvo imagery viewer token for use with the client-side Navvo imagery viewer. available:false when no token is configured or no images are found.
GET /imagery/sequence
All images of a Navvo imagery sequence in capture order (for street-view playback).
Query parameters
Returns up to 150 images per call: { sequenceId, count, fetched, orderedImageIds, images, … }.
GET /imagery/map-features
Road map features (signs, signals, crossings) in a bbox, as a normalized list plus a GeoJSON FeatureCollection. Same bbox/zoom/limit params as /imagery/mapillary.
Each feature is normalized with a category (one of traffic_light, speed_limit, stop, yield, no_entry, turn_restriction, pedestrian_crossing, parking, other).
{
"provider": "navvo",
"available": true,
"features": [ { "id": "112233", "object_value": "regulatory--stop--g1", "category": "stop", "geometry": { "type": "Point", "coordinates": [35.9277, 31.9602] } } ],
"geojson": { "type": "FeatureCollection", "features": [ /* … camelCase properties … */ ] },
"sourceAttributionRequired": true
}
POST /imagery/map-features/corridor
Map features along a route corridor — build a padded box around a polyline and return the features inside it.
Request body
[lng, lat] pairs. (Provide this orpolyline.)"lng,lat;lng,lat;…".180.15.{ "coordinates": [[35.90, 31.95], [35.91, 31.96]], "widthMeters": "120" }
Returns 201 with the same shape as /imagery/map-features, plus a corridor block (bbox, widthMeters, points).
GET /imagery/mapillary-tiles/{z}/{x}/{y}
Navvo imagery coverage vector tile endpoint (MVT/protobuf) — where street-level imagery exists. Source-layers: sequence (LineString, the coverage lines, zoom 6–14), image (Point, individual photos, zoom 14), and overview (Point, low-zoom dots, zoom 0–5). Source max zoom is 14 (overzoom for z15+). Returns binary (application/x-protobuf) with cache headers and x-navvo-* cache metadata. 503 if the imagery network isn't configured, 502 if unreachable (a stale cached tile is served when available).
sequence layer as a line layer to show "street view available" coverage (Navvo uses green #05CB63).GET /imagery/sign-tiles/{z}/{x}/{y}
Navvo traffic-sign vector tile endpoint (MVT/protobuf) — every detected traffic sign as a point. Source-layer traffic_sign (Point, available at zoom 14, source max zoom 14 with overzoom for z15+). Each feature's value property holds the sign type in {category}--{name}--{group} form (e.g. regulatory--stop--g1, warning--curve-left--g1, regulatory--maximum-speed-limit-50--g1; categories: regulatory, warning, information, complementary). Render as a symbol layer with icon-image driven by value for the official sign icons. Same binary response, cache headers, and 503/502 behaviour as the coverage tiles.
regulatory--stop--g1..g10, ≈90 maximum-speed-limit variants, etc.). For a driver-friendly UI, collapse them into a handful of options by matching substrings of value — e.g. all --stop-- → "Stop", all speed-limit → "Speed limits", all warning-- → "Warnings". Filter the symbol layer with a style expression like ["case", [">=", ["index-of", "--stop--", ["get", "value"]], 0], true, false].GET /imagery/point-tiles/{z}/{x}/{y}
Navvo map-point vector tile endpoint (MVT/protobuf) — detected road points & objects (street lights, CCTV cameras, traffic cones, road markings, manholes, benches, etc.) as points. Source-layer point (Point, available at zoom 14, source max zoom 14 with overzoom for z15+). Each feature's value property holds the object type as object--{name}, marking--{name}, or construction--{name} (e.g. object--street-light, object--cctv-camera, object--traffic-cone, marking--discrete--crosswalk-zebra). Render as a symbol layer with icon-image: ["get", "value"] so each object shows its own icon (a crosswalk marking and a lane-arrow marking render distinct icons), gated to a higher minzoom (≈15) to keep the map clean. Same binary response, cache headers, and 503/502 behaviour as the coverage tiles.
value), not flat circles. Some point values carry an orientation suffix (object--traffic-light--general-upright-front / -side / -back); if you keep per-value icons, fall back to the orientation-stripped base name (…--general-upright) when the exact icon is missing.value substring (object--street-light → "Street lights", marking-- → "Road markings", construction-- / object--traffic-cone → "Roadwork & cones", object--cctv-camera → "CCTV cameras"). For finer control, expose sub-options per group (e.g. Road markings → Crosswalks / Lane arrows / Give-way lines / Stop lines) and build the layer filter from the union of the selected sub-matchers — when a whole group is selected, use its broad matcher so variants without a dedicated sub still show.GET /imagery/kartaview
An optional additional imagery-source connector placeholder — currently returns { "configured": false, "images": [] }.
Signs & points database (ours-first) — /signs/*
Navvo persists every sign/point it surfaces into its own database and serves them ours-first: the platform reads from its DB, and only falls back to the imagery network to ingest a tile it hasn't seen yet (after which that area is served purely from Navvo — no upstream dependency). Admins have full control over the saved records (hide / edit / delete), and those edits are never overwritten by re-ingest.
GET /signs/features
Returns the saved signs + points in a bounding box as a GeoJSON FeatureCollection.
On a first-seen area Navvo ingests the covering tiles, then serves from its DB.
| Query | Description |
|---|---|
bbox | minLng,minLat,maxLng,maxLat (required) |
kinds | comma list of sign,point (default both) |
Each feature: geometry is a Point; properties carry value (e.g. regulatory--no-entry--g1), a stable key, kind (sign|point), and a brand-neutral src (navvo|admin). Render with a symbol layer (icon-image: ["get","value"]). Hidden/removed records are never returned.
maximum-speed-limit-{n} signs from this endpoint, project them onto the active route (cumulative distance along the shape), and display the last one the driver has passed — it carries forward until the next speed sign, and the final sign persists to the route's end. So a street with 60 → 80 → 100 limits steps up as each sign is passed. Outside navigation, fall back to the nearest speed-limit sign.POST /signs/report
Submit a correction for a sign (e.g. wrong or no longer there). Admins review and approve/reject; an approved report hides that sign for everyone.
{ "key": "sign:regulatory--no-entry--g1:31.95807:35.88645", "value": "regulatory--no-entry--g1", "lat": 31.95807, "lng": 35.88645, "reason": "not-there", "note": "removed during roadworks" }
Per-user disregards — GET/POST/DELETE /me/sign-disregards (auth)
A signed-in rider can disregard a specific sign: it's hidden from their map and ignored by routing for them only (system-wide data is untouched). POST { key, value, lat, lng } to add; DELETE /me/sign-disregards/:idOrKey to restore; GET lists them.
POST /routing/plan accepts an optional disregard: string[] (the rider's disregarded keys) and returns a signConstraints block ({ applied, noEntryCount, source: "navvo-signs" }). No-entry / prohibition signs within ~28 m of the planned route become routing exclusions so blocked roads drop out of route options (Navvo routes first, then snaps constraints to the actual corridor — a no-entry sign on a parallel side street the route never uses does not affect it) — except the rider's own disregards. If excluding them leaves no route, Navvo retries without the constraints so routing never fails.