Data
10,000 synthetic points, matching CSV, GeoPackage and provenance metadata. Use the same keys in every check.
data/municipal-assets.geojson ↓Synthetic data · Downloadable code · ES / EN
Follow 10,000 fictional municipal assets from a file to an API, a map service and a viewer. The package brings together data, configurations, exercises and local results so you can repeat the checks and understand each component’s limits.
No registration. Local use. Fictional data near Medellín; it does not represent real inventories, people or infrastructure.
01
GeoJSON / CSV / QGIS
Identifiers, attributes and coordinates you can inspect.
02
PostGIS
Loading, spatial index, roles and acceptance queries.
03
GeoServer / pygeoapi
WMS images, WFS features and OGC API collections.
04
MapLibre / TCO
Local viewer, dependency inventory and budget.
You do not need every service installed to explore the example. Start with the file and viewer, then choose the pygeoapi CSV path or the container stack. The instructions explain prerequisites, local passwords and cleanup commands.
10,000 synthetic points, matching CSV, GeoPackage and provenance metadata. Use the same keys in every check.
data/municipal-assets.geojson ↓A starter project for exploring assets, categories and forms. Review it in your QGIS version.
qgis/municipal-assets.qgs ↓Schema, constraints, permissions and initial load, plus acceptance and export queries.
sql/01-init.sql ↓SLD styling and publication script; WMS/WFS requests and a locally generated map response.
geoserver/assets.sld ↓CSV and PostGIS configurations, pinned dependencies, OpenAPI generation and repeatable measurement.
pygeoapi/config-csv.yml ↓CSV worksheets for dependencies, acceptance and TCO. Supply your own figures and responsibilities before deciding.
worksheets/migration-audit.csv ↓The ZIP also contains a MapLibre viewer with local assets, data and measurement scripts, Compose, ES/EN instructions, licenses and the file manifest.
Each query had 5 warmup requests and 30 measured requests, one at a time, over local HTTP without TLS. Timing includes reading the complete response. p50 is the median; p95 uses nearest rank. Caches were not cleared and other development processes were active.
These figures describe one lab run. WMS returns images while WFS/OGC API returns features: these timings cannot rank products. They do not estimate production capacity or savings against ArcGIS.
2026-09-23 · Darwin 25.6.0 · arm64 · Python 3.13.12 · Werkzeug 3.1.8
| Query | p50 (ms) | p95 (ms) | Response (bytes) | Errors |
|---|---|---|---|---|
| Page of 10 features | 37.55 | 58.65 | 3,311 | 0 / 30 |
| Page of 100 features | 37.32 | 53.17 | 23,498 | 0 / 30 |
| Spatial filter, limit 100 | 109.37 | 126.8 | 23,717 | 0 / 30 |
| District filter, limit 10 | 11.42 | 12.26 | 3,365 | 0 / 30 |
2026-09-23 · Darwin 25.6.0 · arm64 · Java 17.0.20 · -Xms128m -Xmx768m
| Query | p50 (ms) | p95 (ms) | Response (bytes) | Errors |
|---|---|---|---|---|
| WFS: 10 features | 316.94 | 452.7 | 2,678 | 0 / 30 |
| WFS: 100 features | 281.57 | 374.01 | 24,930 | 0 / 30 |
| WMS: 512 × 512 image | 23.26 | 29.16 | 57,175 | 0 / 30 |

GeoServer generated this 512 × 512 image through WMS 1.1.1 using the bundled style. The grid is deliberately synthetic. It is not real asset mapping or evidence of acceptance in another client.
Open original PNG →