Live & Production-Ready

Geospatial raster data,
pixel-perfect at scale.

Query elevation values from 100 GB+ GeoTIFF and COG datasets via a simple REST API or directly through your AI assistant using MCP. Sub-second reads. Pay-per-query.

Terminal — GeoRaster API
$ curl "https://api.geospatialsystem.com/query?
   lat=-33.8688&lon=151.2093&
   dataset_id=file1_elevation"
\
   -H "X-API-Key: grk_xxxxxxxx"
{
  "dataset": "file1_elevation",
  "lat": -33.8688,
  "lon": 151.2093,
  "value": 42.7,
  "units": "metres",
  "nodata": false,
  "elapsed_ms": 18.4
}
10+
Raster Datasets
~1TB
Total Data Served
<30ms
Median Query Time (COG)
99.9%
Uptime SLA
// Available Datasets

What's in the catalogue

All datasets are stored as Cloud Optimised GeoTIFFs (COG), enabling sub-second random pixel access without loading the entire file. Spatial metadata is always one API call away.

file1_elevation
Elevation — Tile 1
Resolution: 1 m · CRS: GDA2020 · ~100 GB
● Online
file2_elevation
Elevation — Tile 2
Resolution: 1 m · CRS: GDA2020 · ~100 GB
● Online
file3_elevation → file10_elevation
Elevation — Tiles 3–10
Resolution: 1 m · CRS: GDA2020 · ~800 GB total
● Online
— coming soon —
Slope, Aspect, Canopy Height…
Additional derived datasets in progress.
⧖ Planned
// REST API

Two ways to query

Every endpoint accepts an X-API-Key header. GET is great for quick browser tests and simple integrations; POST supports JSON bodies and batch queries up to 100 points.

bash — HTTPS GET GET
# Single point — simplest form
curl -s "https://api.geospatialsystem.com/query?\
  lat=-33.8688\
  &lon=151.2093\
  &dataset_id=file1_elevation" \
  -H "X-API-Key: grk_YOUR_KEY"

# Specific band
curl -s "https://api.geospatialsystem.com/query?\
  lat=-27.47\
  &lon=153.02\
  &dataset_id=file2_elevation\
  &band=1" \
  -H "X-API-Key: grk_YOUR_KEY"

# List all datasets
curl "https://api.geospatialsystem.com/datasets" \
  -H "X-API-Key: grk_YOUR_KEY"

# Dataset spatial metadata
curl "https://api.geospatialsystem.com/datasets/file1_elevation" \
  -H "X-API-Key: grk_YOUR_KEY"
bash — curl POST (JSON) POST
# Single point — POST JSON body
curl -s -X POST \
  "https://api.geospatialsystem.com/query" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: grk_YOUR_KEY" \
  -d '{
    "lat": -33.8688,
    "lon": 151.2093,
    "dataset_id": "file1_elevation",
    "band": 1
  }'

# Batch — up to 100 points in one request
curl -s -X POST \
  "https://api.geospatialsystem.com/query/batch" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: grk_YOUR_KEY" \
  -d '{"queries": [
    {"lat":-33.87,"lon":151.21,"dataset_id":"file1_elevation"},
    {"lat":-27.47,"lon":153.02,"dataset_id":"file2_elevation"},
    {"lat":-37.81,"lon":144.96,"dataset_id":"file3_elevation"}
  ]}'
Python — requests Python SDK example
import requests

BASE  = "https://api.geospatialsystem.com"
HEADS = {"X-API-Key": "grk_YOUR_KEY"}

# Single GET
r = requests.get(f"{BASE}/query", headers=HEADS, params={
    "lat": -33.8688, "lon": 151.2093,
    "dataset_id": "file1_elevation"
})
print(r.json())  # {"value": 42.7, "units": "metres", ...}

# Batch POST
points = [
    {"lat": -33.87, "lon": 151.21, "dataset_id": "file1_elevation"},
    {"lat": -27.47, "lon": 153.02, "dataset_id": "file2_elevation"},
]
r = requests.post(f"{BASE}/query/batch",
                  headers=HEADS, json={"queries": points})
for result in r.json()["results"]:
    print(result["value"], result["units"])
// Architecture

Built for production at scale

Every layer of the stack is chosen for throughput, reliability, and minimal egress cost.

🗂
Cloud Optimised GeoTIFF
COG internal tiling and overviews mean only the relevant byte range is read — no full 100 GB scan for a single pixel.
FastAPI + Gunicorn Workers
Async Python with multiple uvicorn workers. Scales horizontally behind Nginx. Open file handles are LRU-cached for speed.
🔑
Built-in API Key Auth
No AWS API Gateway needed. Keys are stored in SQLite, validated in-process, and attached to per-key rate limits and audit logs.
🤖
MCP for AI Agents
FastMCP exposes the same data as tools consumable by Claude, Cursor, VS Code Copilot, and any MCP-compatible LLM workflow.
📦
Nginx Caching Layer
GET responses are cached by Nginx for 1 hour. Identical queries served at memory speed — zero Python overhead.
📈
AWS-Ready Scaling Path
Store TIFs on S3, use GDAL's /vsis3/ virtual filesystem. Add EC2 Auto Scaling, CloudFront, and RDS when you outgrow SQLite.
// Model Context Protocol

Talk to your data in plain English

Add GeoRaster as an MCP tool in Claude Desktop, Cursor, or any compatible client. Ask "What is the elevation at Sydney Harbour?" and the AI queries the API for you.

1

Install conda environment

conda env create -f environment.yml
Installs rasterio, FastMCP, and all dependencies.

2

Add to claude_desktop_config.json

Point the "georaster" server entry at mcp_server.py with DATA_DIR set to your raster folder.

3

Restart Claude Desktop

The 🌐 GeoRaster MCP tools appear automatically in the tool panel.

4

Ask anything

"What is the elevation at these 5 coordinates?" — Claude calls batch_query and returns a formatted table.

json — claude_desktop_config.json MCP Config
{
  "mcpServers": {
    "georaster": {
      "command": "/opt/conda/envs/georaster/bin/python",
      "args": ["/opt/georaster/mcp/mcp_server.py"],
      "env": {
        "DATA_DIR": "/data/rasters"
      }
    }
  }
}

// Remote server (SSE transport)
{
  "mcpServers": {
    "georaster-remote": {
      "url": "https://api.geospatialsystem.com/mcp/sse",
      "transport": "sse"
    }
  }
}
// Pricing

Simple, usage-based pricing

Start free. Scale as you grow. No surprise bills.

Free
$0
forever
  • 1,000 queries / month
  • 60 req / minute
  • All datasets
  • GET + POST
  • Community support
Get Free Key
Enterprise
Custom
annual contract
  • Unlimited queries
  • Custom rate limits
  • Private deployment
  • Custom datasets
  • Dedicated support
  • SLA 99.9%
Contact Us