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
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
Convert CityGML, IFC (BIM), and point cloud data into web-viewable 3D formats. CityGML becomes 3D Tiles, IFC becomes GLB with component metadata, and point clouds become Potree octrees for streaming visualization.
# Convert CityGML to 3D Tiles
POST /api/v1/process
{
"operation": "store.convert_citygml",
"params": {
"source": "./data/city.gml"
}
}
# Serve tileset / model / point cloud
GET /3dtiles/{layer_id}/tileset.json
GET /3d/{layer_id}/model.glb
GET /potree/{layer_id}/metadata.json
β 3D content ready for visualization
Export layers and rasters to S3-compatible storage. Bundled with SeaweedFS for self-hosted object storage β no external cloud dependency required.
# 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