Everything you need for modern geospatial applications β from fast map services to spatial AI.
Full WMS implementation that renders map tiles from your PostGIS vector data. Multi-layer compositing, transparent backgrounds, and configurable output formats.
# WMS GetMap request
GET /wms?
SERVICE=WMS&
REQUEST=GetMap&
LAYERS=parcels,roads&
BBOX=106.7,-6.3,106.9,-6.1&
WIDTH=512&
HEIGHT=512&
FORMAT=image/webp&
CQL_FILTER=zone='residential'
β 512x512 WebP rendered
Query, filter, and edit vector features directly. Full transactional support (WFS-T) with atomic operations, streaming responses for large datasets, and cursor-based pagination.
# WFS GetFeature with filtering
GET /wfs?
SERVICE=WFS&
REQUEST=GetFeature&
TYPENAMES=parcels&
CQL_FILTER=area > 500&
COUNT=100&
OUTPUTFORMAT=application/json
# WFS-T: Insert a new feature
POST /wfs
<Insert>...</Insert>
β 100 features returned
Serve vector tiles directly from PostGIS for client-side rendering with MapLibre GL JS, Mapbox GL, or OpenLayers. Smaller payloads, crisp rendering at any zoom, and dynamic client-side styling.
# MVT tile request
GET /tiles/parcels/14/13358/8185.pbf
# MapLibre GL source config
{
"type": "vector",
"tiles": [
"/tiles/parcels/{z}/{x}/{y}.pbf"
]
}
β Protobuf tile served
Serve raster data via WMS, WCS, and a dedicated tile API directly from Cloud Optimized GeoTIFFs. Point sampling, band statistics, and built-in colormaps β no pre-tiling or raster database required.
# Raster tile API
GET /api/v1/raster/elevation/tiles/
14/13358/8185?colormap=terrain
# Point sampling
GET /api/v1/raster/elevation/point?
lon=106.85&lat=-6.2
β { "value": 847.3, "unit": "m" }
# Band statistics
GET /api/v1/raster/elevation/statistics
β { "min": 0, "max": 3042, "mean": 612 }
Import spatial data directly through the web UI or API. Embedded GDAL means no external tools needed β upload your file and it lands in PostGIS, registered and ready to serve.
# Upload via REST API
POST /api/v1/import/upload
Content-Type: multipart/form-data
file: parcels.gpkg
# Server auto-detects layers
{
"layers": [
{ "name": "parcels", "features": 12450 },
{ "name": "roads", "features": 3200 }
]
}
β Imported 15,650 features in 4.2s
No SLD, no XML. Style your layers with clean JSON. Zoom-dependent properties, rule-based classification, categorized and graduated themes β all with live updates, no server restart needed.
// JSON style with zoom stops
{
"rules": [{
"filter": "zone = 'residential'",
"fill": {
"color": "#4ade80",
"opacity": 0.6
},
"stroke": {
"width": {
"stops": [[10, 0.5], [16, 2]]
}
},
"label": {
"field": "name",
"size": 12
}
}]
}
Filter features across WMS, WFS, and styles using Common Query Language. Attribute comparisons, pattern matching, spatial predicates β all parsed as a safe AST to prevent injection.
# Attribute filtering
population > 1000000
zone = 'residential' AND area < 500
name LIKE 'North%'
type IN ('primary', 'secondary')
# Spatial filtering
BBOX(106.7, -6.3, 106.9, -6.1)
INTERSECTS(POLYGON((
106.8 -6.2, 106.9 -6.2,
106.9 -6.1, 106.8 -6.1,
106.8 -6.2
)))
# Combined
zone = 'commercial' AND
BBOX(106.7, -6.3, 106.9, -6.1)
Full implementation of the modern OGC API family β REST/JSON endpoints alongside classic WMS/WFS. Features, Tiles, Coverages, Records, and Processes (Enterprise) with OpenAPI documentation.
# OGC API Features β query with CQL2
GET /ogc/collections/parcels/items?
filter=area > 500&
bbox=106.7,-6.3,106.9,-6.1&
limit=50
# OGC API Tiles
GET /ogc/collections/parcels/tiles/
WebMercatorQuad/14/13358/8185
# Conformance + OpenAPI
GET /ogc/conformance
GET /ogc/api
β Full OGC API compliance
Built-in SpatioTemporal Asset Catalog (STAC v1.1.0) for discovering and searching your raster and vector layers. Cross-collection search with spatial, temporal, and free-text filters.
# STAC catalog root
GET /stac/
# Search across collections
POST /stac/search
{
"bbox": [106.7, -6.3, 106.9, -6.1],
"datetime": "2024-01-01/..",
"collections": ["raster"]
}
# Browse collection items
GET /stac/collections/vector/items
β Compatible with STAC Browser & PySTAC
JWT authentication with HTTP-only cookies β immune to XSS token theft. Layer-level permissions, role-based access control, audit logging, and OWASP Top 10 compliance built in from day one.
# Layer permission levels
View β Read-only (WMS, WFS Get)
Edit β Read + Write (WFS-T)
Owner β Full control
# Security headers
Strict-Transport-Security
X-Content-Type-Options
X-Frame-Options
Content-Security-Policy
# OWASP compliance
β SQL injection: parameterized queries
β CQL injection: AST parsing
β XSS: HTTP-only cookies
β Memory safety: Rust
Automatic tile and query caching with configurable TTLs. Community uses in-memory LRU (moka), Enterprise adds disk, Redis, and Redis Cluster backends. ETags for capabilities, smart cache keys for tiles.
# Cache hierarchy
Browser Cache (HTTP headers)
β cache miss
CDN/Proxy Cache
β cache miss
Tile Cache (moka / Redis)
β cache miss
Query Cache (feature results)
β cache miss
PostGIS (spatial index)
# config.toml
[cache.tile]
backend = "memory"
max_entries = 10000
ttl_seconds = 3600
Three-tier caching for maximum performance at any scale. Scales horizontally with shared caching across nodes.
WMS, MVT, COG, OGC API
Per-node
Shared
Persistent, node-local
PostGIS + tiny-skia
No JVM, no Python runtime, no external dependencies to manage. Single binary, sub-second startup, and efficient concurrent request handling via Tokio.
# Supported platforms
Linux x86_64 glibc 2.28+
macOS arm64 Apple Silicon
WSL2 x86_64 Windows + WSL
# Just run it
$ ./geovertix serve
β WMS available at /wms
β WFS available at /wfs
β MVT available at /tiles
β API available at /api/v1
β Server ready
# Or as a daemon
$ ./geovertix serve # daemonizes
$ ./geovertix stop # graceful stop
$ ./geovertix restart # zero-downtime
Extend GeoVertix with licensed plugins for geoprocessing, AI, 3D visualization, and more. Each plugin is a separate signed binary managed by the distributed task dispatcher.
Server-side spatial analysis on your PostGIS layers. Buffer, clip, union, intersect, dissolve, and more β all executed as async jobs with progress reporting and output layer registration.
# Buffer a layer by 500 meters
POST /api/v1/process
{
"operation": "geoprocess.buffer",
"params": {
"layer_id": "abc-123",
"distance": 500,
"unit": "meters"
}
}
β Job submitted β task_id: "def-456"
β Output layer registered as "roads_buffer_500m"
Serve pre-trained ONNX models for real-time and batch geospatial AI. Pixel classification, object detection, interactive segmentation (SAM), and location embeddings β all from a model registry with hot-reload.
# Real-time classification tile
GET /api/v1/inference/tiles/
lulc-unet/14/13358/8185
?layer_id=satellite_rgb
# Interactive SAM segmentation
POST /api/v1/inference/segment
{
"model": "sam-vit-b",
"prompts": [
{"type": "point",
"x": 106.85, "y": -6.2}
]
}
β Polygon returned (encoder cached)
Describe what you want in plain language. The GeoAI agent translates your request into the right spatial operation with the right parameters β no GIS expertise required. Powered by a local LLM (Ollama) for complete data privacy.
# Chat with GeoAI
User: "Find all buildings within
200 meters of the river"
GeoAI: I'll run this in 2 steps:
1. Buffer "rivers" by 200m
2. Clip "buildings" to the buffer
[Confirm] [Cancel]
User: [Confirm]
β Step 1/2: Buffer complete
β Step 2/2: Clip complete
β 1,247 buildings found
Full 3D pipeline from import to interactive viewing. IFC (BIM) models get a dedicated Three.js viewer with component browser and can be placed on the map with full transform controls. CityGML becomes 3D Tiles, and point clouds stream as COPC with browser-side LOD.
# Import IFC model (auto-converts to GLB)
POST /api/v1/process
{
"operation": "store.import_ifc",
"params": { "source": "building.ifc" }
}
# Place model on map with transform
PUT /3d/{layer_id}/anchor
{
"lon": 106.822, "lat": -6.195,
"heading": 45, "scale": 1.0
}
# Query IFC components
GET /api/v1/layers/{id}/ifc/tree
GET /api/v1/layers/{id}/ifc/components?type=IfcWall
β 3D model placed and browsable
Point cloud data stored in COPC format with native CRS preservation. The browser streams tiles via HTTP range requests with LAZ decompression and on-the-fly CRS reprojection for accurate 3D visualization at any scale.
# Import point cloud (auto-converts to COPC)
POST /api/v1/process
{
"operation": "store.import_pointcloud",
"params": {
"source": "survey.las",
"source_srs": "EPSG:32748"
}
}
# Stream as 3D Tiles (PNTS format)
GET /lidar/{layer_id}/3dtiles/tileset.json
GET /lidar/{layer_id}/info
β Point cloud streaming in native CRS
Serve seismic, ground-penetrating radar (GPR), and sonar profile data as tiled amplitude images with navigation track overlays. Optimized for subsurface exploration and geophysical survey visualization.
# Import seismic profile
POST /api/v1/process
{
"operation": "store.import_profile",
"params": {
"source": "survey_line_01.segy"
}
}
# Serve profile tiles + navigation
GET /profile/{layer_id}/tiles/{z}/{x}/{y}
GET /profile/{layer_id}/navigation
β Profile data ready for visualization
Ingest NetCDF and GRIB climate datasets, compute zonal statistics against vector boundaries, detect anomalies, and analyze trends over time. Results are written back to the spatial database for further analysis and visualization.
# Run zonal statistics
POST /api/v1/process
{
"operation": "climate.zonal_stats",
"params": {
"climate_layer": "temperature_2025",
"zones_layer": "districts",
"variable": "tas"
}
}
β Zonal statistics computed
Serve raster and vector tiles from collections of sharded MBTiles files. Each collection is a directory of SQLite databases partitioned by zoom-16 grid cells, registered as a raster layer in the database.
# List tile collections
GET /mbtiles/collections
# Enable a collection as a map layer
POST /mbtiles/collections/{name}/enable
# Serve tiles directly
GET /mbtiles/{z}/{x}/{y}.png
β Tile collection serving
S3-compatible storage with built-in data conversion pipelines. Export layers to S3, import from S3, and convert between spatial formats. Bundled with SeaweedFS for self-hosted object storage.
# Export a layer to S3
POST /api/v1/process
{
"operation": "store.export_layer",
"params": {
"layer_id": "abc-123",
"format": "gpkg",
"bucket": "exports"
}
}
β parcels.gpkg uploaded to s3://exports/
β Download URL generated (24h expiry)
Access 220+ QGIS Processing algorithms as server-side operations. The plugin runs QGIS headless inside a container β no desktop installation needed. QGIS native and GDAL processing toolbox available via REST API.
# Run QGIS hillshade algorithm
POST /api/v1/process
{
"operation": "qgis.native:hillshade",
"params": {
"INPUT": "dem_layer",
"Z_FACTOR": 1.0,
"AZIMUTH": 315,
"V_ANGLE": 45
}
}
β Hillshade computed
β COG output registered as raster layer
Download the Community Edition or contact us for Enterprise pricing