Geo 3D Details
Geo 3D Details
Detailed 3D-map feature data — buildings & building parts, roads, vegetation, water, barriers, power infrastructure, and more — extracted from Navvo's map data index for the Middle East. This powers Navvo's navvo3d map scene.
Scope required: geo
geo scope is not enabled on new keys by default — request it explicitly when creating your key (scopes: { "geo": true }). See Authentication.{z}/{x}/{y} path, these endpoints return a JSON array of features, not a binary vector tile. Each feature's way geometry is a WKT string reprojected to EPSG:3857 (Web Mercator meters) — not lng/lat degrees.GET /geo/profiles/navvo3d
The static descriptor for the navvo3d profile: its id, the supported feature categories (queryNames), default format, and data source.
{
"profile": "navvo3d",
"queryNames": [
"car", "road", "building", "building_part", "barrier", "fence",
"tree", "scrub", "park", "green_area", "playground", "sports_pitch",
"vineyard", "cemetery", "fountain", "street_lamp", "power_line",
"power_pole", "power_tower", "wind_generator", "sculpture", "crane",
"water", "aerial_line"
],
"defaultFormat": "f4map-array",
"source": "Navvo map data index for the Middle East"
}
The 24 queryNames are the valid values for the category filter on the detail endpoints.
GET /geo/details/{z}/{x}/{y}
Return the 3D-detail features whose bounding boxes intersect the given XYZ tile.
Path parameters
0–22.Query parameters
building,road,tree. Unknown names are dropped; if none are valid, all 24 categories are returned.4500, clamped to 1–15000.true, applies per-category quotas so dense categories (e.g. buildings) don't crowd out sparse ones.curl -s "https://navvo.io/api/v1/geo/details/16/39102/26456?queryNames=building,road&limit=2000" \
-H "x-api-key: nvvo_YOUR_KEY"
Response
A flat JSON array of feature objects (the f4map-array format):
[
{
"queryName": "building",
"osm_id": "123456789",
"name": "City Mall",
"building": "retail",
"building:levels": "3",
"height": "14",
"roof:shape": "flat",
"z_order": 28,
"way": "POLYGON((3970123.4567 3760456.1234,3970150.1 3760460.5,3970155.2 3760430.9,3970123.4567 3760456.1234))",
"queryType": "polygon"
},
{
"queryName": "road",
"osm_id": "987654321",
"highway": "secondary",
"name": "Zahran Street",
"lanes": "4",
"z_order": 35,
"way": "LINESTRING(3969800.10 3759900.20,3969950.30 3760010.55)",
"queryType": "line"
}
]
| Field | Type | Description |
|---|---|---|
queryName | string | The matched category. |
osm_id | string | Navvo map data element id. |
| (tags) | scalar | Whitelisted map data tags (name, name:ar, highway, building, height, building:levels, roof:shape, …) spread inline. |
z_order | number | Render order. |
way | string | WKT geometry in EPSG:3857 meters (X Y order). |
queryType | string | point, line, or polygon. |
An empty array [] means no features intersect the tile. Responses set Cache-Control: public, max-age=60.
POST /geo/details/{z}/{x}/{y}
Same as the GET, but categories are supplied in the JSON body — useful for long category lists or F4Map-style payloads. Same path params; limit and balanced are query params. Returns 201 with the identical array shape.
Request body
balanced query param).queryNames is absent, categories are taken from the keys of each queries[].union object.{ "queryNames": ["building", "building_part", "road", "tree", "water"], "balanced": true }
way geometry is in Web Mercator meters (EPSG:3857). If your renderer expects lng/lat (EPSG:4326), reproject before use — or feed the meters directly into a 3D engine that works in Web Mercator world coordinates.