Spend less time
waiting on rasters.
Skarve is a fast, open-source engine for measuring raster data inside polygons. For the repeated questions behind your maps, notebooks and spatial applications.
Built in Rust. Use it from Python, Node.js or the CLI.
- Sum
- 4,981.3
- Mean
- 57.92
- Cell coverage
- 86.0
Including the fraction of each cell along the boundary.
Why Skarve
A new polygon shouldn’t mean starting over.
How many people live inside this catchment? What is the average rainfall across that region? The area changes. The raster often doesn’t.
Skarve gives you sums, means, minimums and maximums for the areas you care about. Open a TIFF or Cloud Optimized GeoTIFF directly. For repeated queries, prepare an SKV: a lossless snapshot designed for this kind of work.
SKV keeps the raster values alongside reusable summaries. Where a query allows it, Skarve combines summaries for the interior and reads individual cells along the boundary.
How the SKV format worksTIFF / COGQuery an area
TIFF / COGSKVKeep querying
Release alpha.4 · 24 September 2026
How fast is it?
In this test, SKV with summaries beat the fastest native TIFF/COG control in 16 of 16 scenarios. Explore the workload closest to yours.
What we tested: two synthetic rasters generated for Skarve’s test suite—513 × 519 cells with 36 bands, and 1,025 × 1,031 cells with 40 bands. These are generated test data, not real-world datasets.
1,025 × 1,031 cells · 40 bandsMedian query time · shorter is faster
Three measurements per configuration. Query time excludes SKV preparation. The exactextract comparison uses a different numerical policy, not bit-identical results.
All seven configurations for this selection
| Configuration | Median | Observed range |
|---|---|---|
| Tuned COG | 3,756.15 ms | 3,432.33 ms–4,191.24 ms |
| COG + RSI256 | 3,412.93 ms | 3,369.70 ms–3,483.43 ms |
| COG + RSI64 | 2,415.34 ms | 2,282.41 ms–2,747.19 ms |
| SKV without summaries | 2,477.63 ms | 2,303.68 ms–2,610.49 ms |
| Skarve + SKV summaries | 1,618.03 ms | 1,417.41 ms–1,898.86 ms |
| Tuned TIFF | 5,901.58 ms | 5,724.42 ms–5,908.29 ms |
| exactextract (natural policy) | 4,583.00 ms | 3,997.53 ms–4,610.23 ms |
Test conditions, trade-offs and full results
The setup. Published alpha.4 on one Ubuntu 24.04.4 Linux x86-64 host, with 2 vCPUs and 4 GB RAM. Two rasters, four polygon/band workloads, local files and unthrottled loopback HTTP. Seven configurations per scenario, three fresh-worker observations each: 336/336 operations passed.
The clock. Source open through fully consumed results. Raster generation, TIFF/COG preparation, indexing, SKV compilation, imports and installation are outside query time. OS caches were not evicted. Loopback is not a WAN or Cloudflare R2 test.
The trade-offs. Summaries beat the same SKV with summaries disabled in 10 of 16 scenarios; the raw path was faster in the others. SKV is not always smaller than its source. Native configurations share a numerical contract; natural exactextract has its own policy. This is not a claim of bit-identical answers or a prediction for your data.
All 16 comparisons
| Raster / access | Polygons / bands | SKV summaries | SKV raw | Best control | exactextract |
|---|---|---|---|---|---|
| 36-band rasterLoopback HTTP | 1 / 1 | 41.84 ms | 36.68 ms | 78.76 msTuned TIFF | 80.84 ms |
| 36-band rasterLocal | 1 / 1 | 15.73 ms | 13.36 ms | 47.83 msTuned TIFF | 57.96 ms |
| 36-band rasterLoopback HTTP | 8 / 1 | 65.76 ms | 62.80 ms | 88.35 msTuned TIFF | 97.86 ms |
| 36-band rasterLocal | 8 / 1 | 25.56 ms | 25.74 ms | 62.75 msCOG + RSI256 | 93.59 ms |
| 36-band rasterLoopback HTTP | 1 / 36 | 478.78 ms | 345.42 ms | 747.14 msTuned TIFF | 505.48 ms |
| 36-band rasterLocal | 1 / 36 | 380.43 ms | 268.44 ms | 453.54 msTuned COG | 464.63 ms |
| 36-band rasterLoopback HTTP | 8 / 36 | 593.00 ms | 637.95 ms | 1,187.62 msTuned COG | 1,150.48 ms |
| 36-band rasterLocal | 8 / 36 | 542.24 ms | 641.18 ms | 842.50 msCOG + RSI256 | 1,063.41 ms |
| 40-band rasterLoopback HTTP | 1 / 1 | 74.66 ms | 147.61 ms | 117.68 msCOG + RSI64 | 99.60 ms |
| 40-band rasterLocal | 1 / 1 | 29.58 ms | 41.18 ms | 80.17 msCOG + RSI64 | 95.01 ms |
| 40-band rasterLoopback HTTP | 8 / 1 | 171.79 ms | 168.95 ms | 204.11 msTuned TIFF | 213.80 ms |
| 40-band rasterLocal | 8 / 1 | 67.23 ms | 108.73 ms | 121.32 msCOG + RSI256 | 204.85 ms |
| 40-band rasterLoopback HTTP | 1 / 40 | 1,019.96 ms | 1,184.60 ms | 2,831.83 msTuned TIFF | 2,208.92 ms |
| 40-band rasterLocal | 1 / 40 | 928.36 ms | 1,065.95 ms | 1,492.69 msCOG + RSI64 | 1,829.08 ms |
| 40-band rasterLoopback HTTP | 8 / 40 | 1,798.23 ms | 2,765.86 ms | 4,406.39 msTuned COG | 4,793.43 ms |
| 40-band rasterLocal | 8 / 40 | 1,618.03 ms | 2,477.63 ms | 2,415.34 msCOG + RSI64 | 4,583.00 ms |
Try Skarve
Bring your own raster.
Start with a file and a polygon. You don’t need an SKV to make your first query.
pkg-config, GDAL and libdeflate development files first. Prebuilt binaries are not yet available. Windows and macOS are not yet qualified. Installation guide ↗pip install --pre skarve-engine==0.1.1a4System prerequisites and CLI names
Python requires 3.10+; Node.js requires 20+. Use a Python virtual environment. After installing Rust and your language runtime, install the Ubuntu build dependencies:
sudo apt-get update && sudo apt-get install --no-install-recommends build-essential pkg-config libgdal-dev libdeflate-dev python3-venv python3-devPython installs the skarve CLI. Cargo installs raster-engine. A first source build takes minutes; the measurement notes record installation times separately from query times.
A first query in Python
Use your own raster.tif and area.geojson. The area must be a GeoJSON Polygon or Feature in the same coordinate system as the raster; this example does not reproject it.
It reads the first band and asks the native engine for a sum and mean. Replace the TIFF path with a prepared SKV later—the query stays the same.
Read the walkthroughimport json
from skarve import Skarve
with open("area.geojson", encoding="utf-8") as file:
area = json.load(file)
zone = area["geometry"] if area.get("type") == "Feature" else area
with Skarve() as engine:
with engine.infuse("raster.tif") as raster:
result = raster.carve(
zone=zone, bands=[0],
metrics=["sum", "mean"], backend="native",
)
print(result["bands"][0]["fractional_sum"])Built by Florent Chif
Made for Horizon Mapper.
Open for your next project.
Skarve grew out of work on Horizon Mapper, where choosing another area on a map means asking another question of the data. It is now a standalone engine you can use in your own applications.
Open source under Apache-2.0. Still in alpha, with an experimental SKV format and an open development process.
The qualified Belgium and France integration uses Skarve with SKV where eligible and COG fallback. Application performance is separate from the benchmark above.