Skip to content
GEOSAT

Synthetic data · Downloadable code · ES / EN

A lab to test your Open GIS migration

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.

One dataset, several usage contracts

  1. 01

    Files and editing

    GeoJSON / CSV / QGIS

    Identifiers, attributes and coordinates you can inspect.

  2. 02

    Shared data

    PostGIS

    Loading, spatial index, roles and acceptance queries.

  3. 03

    Services

    GeoServer / pygeoapi

    WMS images, WFS features and OGC API collections.

  4. 04

    Consumers and decisions

    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.

What is in the package

PostGIS

Schema, constraints, permissions and initial load, plus acceptance and export queries.

sql/01-init.sql

GeoServer

SLD styling and publication script; WMS/WFS requests and a locally generated map response.

geoserver/assets.sld

The ZIP also contains a MapLibre viewer with local assets, data and measurement scripts, Compose, ES/EN instructions, licenses and the file manifest.

What ran and what still needs testing

Observed local execution

  • GeoJSON → GeoPackage conversion: geometries, attributes, identifiers and spatial index checked with GDAL. 6 checks
  • pygeoapi 0.24.0 · CSV · 11 passing checks; pagination, filters, identifiers and error responses.
  • GeoServer 2.28.5 · Shapefile · 8 passing checks; WMS/WFS, pagination, filtering and anonymous administration denied.
  • 210 measured requests in total, with samples and environment published. The image below is an actual GetMap response.

Validation required in your environment

  • The Docker/PostGIS stack was not executed in this environment. Verify startup, SQL roles, queries and service connections.
  • The QGIS project requires opening, visual review and editing checks. It is not presented as a QGIS screenshot or a QField test.
  • Outside this run: concurrent users, TLS, corporate identity, high availability, ArcGIS clients and production data.

Local results, with the method visible

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.

pygeoapi · CSV

2026-09-23 · Darwin 25.6.0 · arm64 · Python 3.13.12 · Werkzeug 3.1.8

Queryp50 (ms)p95 (ms)Response (bytes)Errors
Page of 10 features37.5558.653,3110 / 30
Page of 100 features37.3253.1723,4980 / 30
Spatial filter, limit 100109.37126.823,7170 / 30
District filter, limit 1011.4212.263,3650 / 30
View complete samples, queries and checks (JSON)

GeoServer · Shapefile

2026-09-23 · Darwin 25.6.0 · arm64 · Java 17.0.20 · -Xms128m -Xmx768m

Queryp50 (ms)p95 (ms)Response (bytes)Errors
WFS: 10 features316.94452.72,6780 / 30
WFS: 100 features281.57374.0124,9300 / 30
WMS: 512 × 512 image23.2629.1657,1750 / 30
View complete samples, queries and checks (JSON)
Lab WMS response: a grid of fictional assets rendered with green, amber and red symbols.

An actual service response

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

From the exercise to your real workflow

  1. 1. Repeat the example without changing the data. If it fails, record version, request, response and the difference from the expected result.
  2. 2. Use an authorized, bounded copy of your data. Compare identifiers, geometries, attributes, rules and consumers.
  3. 3. Add permissions, restoration, volume and editing checks where your workflow requires them. A successful GET does not validate a complete migration.
  4. 4. Complete the inventory and budget. Preserve a rollback path and the ArcGIS components you still need.

Calculate total cost and sensitivity using your figures →