geomermaids · GeoPQ Workbench
Open, inspect, fix and query GeoParquet. A fast native desktop app: no server, no GDAL, no accounts. Free and open source.
Download: prebuilt binaries for macOS, Windows and Linux — the macOS DMGs are signed and notarized, so it is drag-to-Applications and go. Source and issues on GitHub (MIT / Apache-2.0).
Two minutes, one real dataset: the 3.5 GB MassGIS statewide parcels — two dropped shapefiles imported and merged, optimized into a single 536 MB GeoParquet file, published to S3 and reopened in place.
Why it exists
Most GeoParquet in the wild is a raw database export that performs far below what the format allows: no spatial ordering, no bbox covering column, oversized row groups. The file opens, but nothing can be read incrementally, so every viewer chokes on it.
GeoPQ Workbench is opinionated about this on purpose. Every file you open is graded against the levers that actually matter, the scorecard explains each miss in plain language, and one click rewrites the file into a best-practice one. It doubles as a hands-on guide to the format: the same material as my GeoParquet writing cookbook, but live, against your own data.
What it does
Renders at native speed
Pure Rust with GPU pipelines (egui + wgpu): 3.75M points load in ~180 ms and pan/zoom at vsync. Memory scales with what is on screen, not with file size.
Opens everything GeoParquet
1.0, 1.1 (WKB and GeoArrow), 2.0 native GEOMETRY/GEOGRAPHY types, untagged parquet with a guessable geometry column, even bare lon/lat tables.
Datasets too heavy to draw
CORINE Land Cover is 2.4M polygons and 7.7 GB of geometry, with single features carrying more than 200,000 vertices. Where a file offers a bbox covering column, every feature is drawn from its box instead of its geometry: all of Europe in about a second and a gigabyte, not a sample of it. Zoom past the point where a feature is more than a few pixels wide and the real geometry loads for what you are looking at. The switch is by scale, so the same zoom behaves the same over a city and over open country.
Published palettes
A dataset whose classes have an official palette arrives drawn in it. CORINE is recognized from its class column and rendered from the published table, 111 is continuous urban fabric at RGB 230,0,77, with nothing read from the data. QGIS colour-map exports load too, so a dataset that ships one is styled by it.
Grid summaries
Aggregate any numeric column onto square, H3 or A5 cells, with areal apportionment so a feature spanning several cells gives each one the share it actually covers. Mean, median, sum, count or density, smoothing, focal standard deviation, morphological open and close, hillshade, and contour lines at value quantiles. 2.56M parcels to a 1 km grid in ~0.7 s.
Styling that explains itself
Seven classification methods including Jenks and head/tail breaks, an interactive legend where a click hides a class and ↻ refits the classes to what is currently in the viewport, and normalize-by-area measured on an equal-area projection rather than in degrees².
Credits where they are due
A layer that carries an attribution shows it in the map corner and in
full under File info, read from the parquet metadata or from an
ATTRIBUTION.txt beside the data, searched upwards from the
file's own folder so one notice at a repository root credits everything
under it.
Basemaps that follow the projection
Tiles are published in Web Mercator, so in any other projection each one is drawn as a mesh with its vertices projected exactly: no seams between tiles, and coastlines that still line up. Place names are pixels, though, and pixels shear, so the view is measured and a labelled style steps aside for its label-free twin once a name would visibly tilt. Carto, OpenStreetMap, OpenTopoMap and Esri imagery, with a Natural Earth coastline for the world views where the Mercator pyramid stops at ±85°. The map is framed from the file's metadata before any geometry is decoded, so the basemap downloads alongside the data instead of after it.
Quality scorecard
Seven checks against the footer alone: spatial index, spatial ordering, row groups, encoding, page index, compression, metadata. Each line explains itself.
One-click Optimize
Hilbert sort, tuned row groups, bbox covering, zstd, page indexes — output as 1.1 WKB, 1.1 GeoArrow or 2.0 native, with optional H3 or admin columns and hive/H3 partitioned output.
Remote-native
Open https:// and s3:// files in place over range
requests: a 304 MB file opens in ~1.3 s, and only the row groups under your
viewport get downloaded. A hive-partitioned s3://bucket/prefix/
or state=* glob opens as one layer, partitions loading in
parallel. The status bar shows live bandwidth, layer data and basemap
tiles counted apart, and File info reports what each layer has cost in
bytes and in range requests. Overture Maps and CORINE Land Cover are
preconfigured in the catalog browser.
SQL console
DataFusion with 24 ST_* spatial functions (including
st_transform) over every loaded layer, local or remote, with
spatial predicate pushdown into the parquet reads. Results highlight on the
map or export as new layers.
Import & merge
Pure-Rust importers for GeoPackage, Shapefile and GeoJSON — drag & drop, ESRI-flavored .prj and codepage sidecars handled. Compatible layers merge into one file on export, reprojected onto a common CRS.
Publish to S3 / R2
The Export dialog uploads the optimized file (or a hive-partitioned tree) straight to a bucket, multipart, using your AWS profiles — then anyone can open it in place by URL. Already-optimized layers publish as-is.
There are no barriers to entry either: built-in sample datasets if you have no GeoParquet at hand, and no GDAL anywhere in the stack. An in-app cookbook covers the format's versions, encodings and performance levers.
One hard dataset, start to finish: CORINE Land Cover 2018 opened straight from the catalog over HTTP, 2.4M polygons and 7.7 GB of geometry. Every feature drawn from its covering box in the official palette, zoomed until the real geometry loads, then exported to a single file with only what the viewport holds. About three and a half minutes of real time, accelerated here through the download and export steps.
Try it in two minutes
- Download your platform's build from the releases page and launch it. Nothing to configure.
- Load data. Drag & drop a
.parquetfile, or File → Open sample dataset, or point it at a URL — for instance any file from my daily OSM GeoParquet snapshots. - Open the file info to see the scorecard, then hit Export on a raw file and watch the before/after report.
Links
- Downloads: signed macOS DMGs (Apple Silicon and Intel), Windows zip, Linux tarball, all with SHA-256 checksums.
- GitHub repository: source, issues, roadmap. MIT or Apache-2.0.
- GeoParquet writing cookbook and reading cookbook: the same best practices in copy-paste form for DuckDB, GDAL and friends.
- GeoParquet for North America: free OSM snapshots to feed it with.
Found a bug, or a file it grades unfairly? Open an issue — real-world files are exactly what it is built for. And if you want help getting your organization's GeoParquet pipeline into shape, get in touch.