gbd · geoservices Vector tiles
Dev only
The two ways the same archive is served: byte ranges straight off Caddy, or the in-process reader behind /vector/{z}/{x}/{y}.pbf. Both should draw the identical map — a difference is a bug in one of them. The same goes across the two tabs above: four combinations, one map.
…
… read-only — set by GEOSERVICES_DB_SCHEMA
Red cell outlines labelled with each tile's z/x/y — same idea as the raster viewer's grid, drawn from a small GeoJSON layer this page computes rather than either engine's own built-in debug view: MapLibre's showTileBoundaries bakes a byte-size figure into the label with no way to turn it off, and OpenLayers' TileDebug draws a differently sized label — and two tabs that disagreed about a debug readout would be exactly the confusion this page exists to prevent. Past the archive's own max zoom the grid keeps showing that one deepest tile, since that's the tile actually being reused while overzooming.
build id
…
zooms
…
layers
…
heights
…
fingerprint
…
map zoom
…
Styling is client-side here, so this page shows the archive rather than any theme; there is no CartoCSS/Mapnik equivalent to switch between. Zoom past the deepest archived level to see overzooming, which is what makes that ceiling affordable.
Buildings are drawn extruded — the default view is top-down, so tilt the camera (ctrl+drag, right-click drag, or the tilt button under the compass, top-left) to see it — using a height the tiles carry: the real OSM height tag first, building:levels next, and only then a coarse per-type estimate. Which one fired is the paler-vs-darker split you see, and the per-feature height_src attribute; the "heights" row above says whether the whole archive had real tags to draw from at all, or was built against a schema imported before app/osm2pgsql.style added those columns. Edit the MapLibre style below to change any of it.
Buildings are drawn flat on this tab. OpenLayers renders in 2D and has no equivalent of MapLibre's fill-extrusion, so the height the tiles carry is not drawn here and there is no tilt button — but height_src still is, as the paler-vs-darker split (est is a coarse per-type estimate, the darker shade a real height tag or building:levels). The "heights" row above still applies: it describes the archive, not the renderer. Everything else on this tab should match the MapLibre tab — any other visible difference is a bug in one of the two style files.
Client style (MapLibre layers)
edits save straight to styles/demo/vector-style.json — see the hint at the bottom of this panel for what "deploying" this means
Apply previews your edit on the map without writing anything — reload the page and it's gone. Save writes the JSON to the file above, which every viewer (including a fresh reload of this page) reads from next; there is no compile step and nothing to restart, because a MapLibre style is already what the browser reads — unlike the raster themes, which go through styles.compile_themes() and MapRegistry.load_theme(). In a real deployment this editor wouldn't exist, so shipping a style change means either committing an updated styles/demo/vector-style.json (if this demo page itself is what should change), or — the normal case — editing the MapLibre style inside whatever production client app actually consumes /vector/tiles.json; nothing on this server needs to change or restart for either.
Client style (OpenLayers) The style editor drives the MapLibre tab only. This tab's rules are hand-written OpenLayers styles in app/devtools/static/vector/olstyle.js — OpenLayers has no style document to POST, so changing them means editing that file and reloading. The colours and width stops there are a hand-kept copy of styles/demo/vector-style.json; tests/test_vector_demo_styles_match.py fails if the two drift apart.
← back to the raster devtools