=== versions === python 3.12.0 | geopandas 1.2.0 | pyogrio 0.13.0 (GDAL 3.12.4) | shapely 2.2.0 GDAL vector-tile drivers: PMTiles=rw MVT=rw === load Part 1 GeoParquet === buildings 144,965 features 18.86 MB GeoParquet crs OGC:CRS84 places 20,727 features 1.75 MB GeoParquet crs OGC:CRS84 water 161 features 0.14 MB GeoParquet crs OGC:CRS84 hex 758 features 0.08 MB GeoParquet crs OGC:CRS84 === buildings: maximum zoom vs size (MINZOOM=12, GDAL defaults otherwise) === zooms tiles size_MB write_s largest_tile_KB 12-12 6 1.37 11.6 495 12-13 22 3.38 25.6 495 12-14 77 5.64 39.9 495 12-15 243 8.18 54.8 495 12-16 840 11.25 69.8 495 per zoom level in the z12-16 archive (compressed tile sizes): tiles total_KB mean_KB max_KB tile_width_m grid_step_m z 12 6 1368 228.0 495 6096 1.49 13 16 2008 125.5 307 3048 0.74 14 55 2260 41.1 115 1524 0.37 15 166 2543 15.3 46 762 0.19 16 597 3067 5.1 16 381 0.09 z12: 135,534 feature pieces read back (a building cut by a tile edge counts once per tile) z13: 145,961 feature pieces read back (a building cut by a tile edge counts once per tile) z14: 147,295 feature pieces read back (a building cut by a tile edge counts once per tile) z16: 153,807 feature pieces read back (a building cut by a tile edge counts once per tile) === buildings at z14 only: attributes, EXTENT and SIMPLIFICATION === variant size_MB write_s geometry only 2.12 13.8 subtype + height (used) 2.26 14.9 all 10 Part 1 columns 7.39 16.9 subtype + height, EXTENT=1024 1.79 15.5 subtype + height, SIMPLIFICATION=4 1.90 15.1 === final tilesets for the web map === file features zooms tiles size_MB write_s hex.pmtiles 758 10-13 25 0.10 0.3 water.pmtiles 161 10-14 67 0.07 0.1 buildings.pmtiles 144965 14-14 55 2.26 13.8 places.pmtiles 20727 14-14 55 0.58 2.0 total: 3.01 MB in 202 tiles (the four GeoParquet inputs are 20.8 MB) buildings.pmtiles metadata: {'name': 'Bristol buildings', 'minzoom': '14', 'maxzoom': '14', 'bounds': '-2.6606280,51.4194968,-2.5192092,51.5004229', 'format': 'pbf'} === MapLibre GL JS page === output/web/: 9 files, 4.19 MB buildings.pmtiles 2261.1 KB hex.pmtiles 96.6 KB index.html 25.9 KB lib/LICENSE-maplibre-gl.txt 6.0 KB lib/maplibre-gl.css 70.0 KB lib/maplibre-gl.js 1056.8 KB lib/pmtiles.js 20.2 KB places.pmtiles 584.1 KB water.pmtiles 65.6 KB serve it with: python serve.py then open http://localhost:8000/ === figures === wrote 01-zoom-size-tradeoff.png, 02-z14-tile-sizes.png, 03-attributes-precision.png, 04-map-overview-hexagons.png, 05-map-buildings-places.png, 06-map-popup-detail.png === Playwright: what the browser fetches === 04-map-overview-hexagons.png: zoom 12.4, 16 range requests to .pmtiles, 104 KB fetched; rendered features {"hex":743,"buildings":0,"places":0} 05-map-buildings-places.png: zoom 15.6, 10 range requests to .pmtiles, 353 KB fetched; rendered features {"hex":0,"buildings":1180,"places":1624} 06-map-popup-detail.png: zoom 17.6, 7 range requests to .pmtiles, 199 KB fetched; rendered features {"hex":0,"buildings":68,"places":207}, clicked "Bershka"