Horizon Mapper
    INDEPENDENT RASTER ENGINE · ALPHA
    Skarve

    Your raster.
    Your polygon.
    The statistics.

    A Rust engine for polygon statistics over raster data. Read TIFF and COG directly, or prepare a lossless SKV file for repeated queries.

    Rust / Python / Node.js / CLI

    THE RASTER → POLYGON WORKFLOW01 / 03
    A polygon over a raster gridConceptual illustration. Fully covered cells can use stored summaries; boundary cells are evaluated for the polygon. This is not a source-data map.INTERIOR
    Stored interior summariesBoundary evaluation
    sumsupportmeanminmax

    Conceptual illustration · no source pixels

    MEASURED AFTER PREPARATION

    1.15–8.08×

    faster median queries than natural exactextract†

    28 scenarios. Three observations each. Native Skarve with SKV summaries was faster in every scenario median in this frozen comparison.

    One host · local files and unthrottled loopback HTTP · fresh readers, OS cache not evicted. Conversion is excluded. † Numerical policies differ.

    Read the measurement limits

    FROM SOURCE TO ANSWER

    Prepare once.
    Ask another polygon.

    SKV stores typed raster samples and summaries in one self-contained file. Eligible queries can combine stored interior summaries with raw boundary reads.

    1. 01

      Open the source

      Start with a TIFF, a Cloud Optimized GeoTIFF, or an existing SKV file.

      infuse
    2. 02

      Optionally prepare SKV

      Compile a lossless, immutable file. Keep or archive the original according to your own provenance needs.

      compile
    3. 03

      Query the polygon

      Measure a single zone or consume an ordered batch across bands and raster slices.

      carve · cleave
    THE MEASURED OUTPUTS

    Sum, fractional support, mean, minimum and maximum. A native engine with an optional exactextract compatibility backend; the benchmark below uses the native engine.

    THE NUMBERS, IN MILLISECONDS

    Inspect the comparison.

    Seven fixed lanes, 588 completed operations. The headline always uses the summary-enabled SKV lane on the same prepared object.

    Source access

    1,025 × 1,031 cells · 40 bands · analytical data

    Native Skarve + SKV summariesBest native TIFF / COG / index controlNatural exactextract†
    1 polygon / 1 band3.57× vs natural EE†
    Skarve + SKV13.12 ms
    COG + RSI6431.82 ms
    Natural exactextract†46.86 ms
    8 polygons / 1 band3.11× vs natural EE†
    Skarve + SKV24.69 ms
    COG + RSI6455.33 ms
    Natural exactextract†76.70 ms
    1 polygon / 40 bands2.73× vs natural EE†
    Skarve + SKV306.51 ms
    COG + RSI64733.89 ms
    Natural exactextract†837.36 ms
    8 polygons / 40 bands2.17× vs natural EE†
    Skarve + SKV630.61 ms
    COG + RSI641275.97 ms
    Natural exactextract†1369.90 ms

    Median milliseconds, three observations per case. Bars share a zero baseline within this view; shorter is faster. The complete table includes the observed SKV minimum and maximum.

    † Natural exactextract has its own numerical policy. This is a performance comparison across policies, not a claim of bit-identical answers. Native controls use the same declared native comparison contract. See numerical details.

    All 28 scenarios and observed ranges
    Three observations per scenario. All times in milliseconds; SKV range is observed minimum–maximum, not a confidence interval.
    Dataset / accessPolygons / bandsSKV median
    min–max
    Best native
    median
    Natural EE†
    median
    EE speedup†
    Generated 36HTTP (loopback)1 / 119.2118.2220.0038.60Tuned TIFF32.791.71×
    Generated 36Local1 / 16.286.146.3321.77Tuned COG29.084.63×
    Generated 36HTTP (loopback)8 / 126.0526.0326.2742.52Tuned TIFF40.891.57×
    Generated 36Local8 / 19.959.7910.2528.11COG + RSI25636.203.64×
    Generated 36HTTP (loopback)1 / 36152.04151.37152.42404.33Tuned TIFF254.111.67×
    Generated 36Local1 / 36144.08129.75156.06249.00Tuned TIFF248.321.72×
    Generated 36HTTP (loopback)8 / 36271.75250.66275.16479.47Tuned COG374.981.38×
    Generated 36Local8 / 36234.11228.10247.67373.19Tuned COG366.071.56×
    Generated 40HTTP (loopback)1 / 141.9341.7342.5066.90COG + RSI6451.111.22×
    Generated 40Local1 / 113.1212.4613.6331.82COG + RSI6446.863.57×
    Generated 40HTTP (loopback)8 / 170.1369.2572.3388.92Tuned TIFF80.641.15×
    Generated 40Local8 / 124.6924.6725.0655.33COG + RSI6476.703.11×
    Generated 40HTTP (loopback)1 / 40342.69335.42350.731483.75Tuned TIFF1114.013.25×
    Generated 40Local1 / 40306.51304.69307.14733.89COG + RSI64837.362.73×
    Generated 40HTTP (loopback)8 / 40691.50671.81735.161696.16Tuned COG1595.752.31×
    Generated 40Local8 / 40630.61622.46682.491275.97COG + RSI641369.902.17×
    Real 36HTTP (loopback)1 / 122.1720.7829.0230.83Tuned TIFF27.461.24×
    Real 36Local1 / 18.157.569.3516.70Tuned COG22.992.82×
    Real 36HTTP (loopback)8 / 128.7327.6730.2936.91Tuned TIFF35.251.23×
    Real 36Local8 / 111.3810.7911.5220.04COG + RSI25631.612.78×
    Real 36HTTP (loopback)1 / 36205.11204.40217.92399.78Tuned COG278.271.36×
    Real 36Local1 / 36167.05157.92170.17252.87Tuned TIFF212.311.27×
    Real 36HTTP (loopback)8 / 36313.17300.54329.41436.53Tuned COG387.501.24×
    Real 36Local8 / 36263.64263.13270.52387.53Tuned COG345.211.31×
    WorldPopHTTP (loopback)1 / 135.0033.9235.8559.69COG + RSI6452.911.51×
    WorldPopLocal1 / 111.5211.1611.6825.05COG + RSI6440.033.48×
    WorldPopHTTP (loopback)8 / 166.6664.6768.75115.27COG + RSI256201.813.03×
    WorldPopLocal8 / 123.8223.6824.4850.97COG + RSI64192.498.08×

    Enabling summaries was faster than the same-file raw ablation in 24 of 28 medians. Four local medians were slower. Download all 28 ablation medians; all control losses remain in the full report.

    PERFORMANCE WITH CONTEXT

    The costs stay visible.

    Preparation is a separate cost

    The four unchanged SKV objects took approximately 1–44 seconds to compile in historical measurements. These are not conversion timings of the current release candidate. Updates require a new immutable file.

    SKV is not always smaller

    The four SKVs total 82.21 MB; keeping their ordinary inputs brings the total to 150.08 MB. WorldPop SKV is about 22.1% larger than its natural COG control. Source and index storage is accounted separately.

    Individual losses are retained

    SKV summaries won 83 of 84 individual comparisons with natural exactextract. The remaining Real 36 / one-band / one-polygon HTTP observation was 29.02 vs 27.46 ms, or 5.68% slower.

    Earlier-build regressions remain

    A separate controlled comparison retained 2–3% batch regressions and a 5.55% retained-query slowdown against an earlier Skarve build. Those observations are separate from the main 28 scenarios.

    Measurement and numerical definitions

    Clock: source open through fully serialized and consumed results, including metadata, summaries or indexes, reads, decoding, geometry and reduction. Imports and engine creation/close are reported separately. Data preparation is outside query time.

    Environment: Ubuntu 24.04 under WSL2, AMD Ryzen 7 8745HS, one timed worker. Local or unthrottled loopback HTTP0, fresh process and reader. Input hashing can warm OS caches. This is neither a WAN nor an R2 benchmark; three observations do not establish p95 or cross-hardware confidence.

    Native contract: exact IDs, order and null shape; absolute tolerance 1e-8 + relative 1e-10 × |reference|. All 504 native observations passed. All 84 natural observations passed their declared finite five-field contract.

    Cross-policy differences: 29,244 finite field pairs and 2,076 both-null pairs, with no null-shape mismatch. 6,736 finite differences exceeded the native tolerance when applied diagnostically across policies. Maximum absolute differences: sum 0.135447025, support 0.000105156, mean 0.000005799; min/max matched here. These planar tests do not establish Horizon Mapper’s spherical-boundary or ordered-sum equivalence.

    Frozen source: d15b0bccdf87654e6e6bd221ce114fb4f129e42d. Subsequent release documentation and the Rust consumer API have not been substituted into these timings.

    Unchanged serving objects; MiB = 1,048,576 bytes. Historical complete conversion includes its component phases.
    Source familySKV MiBWith original MiBHistorical compile
    Generated 4023.5940.146.01 s
    Generated 365.509.761.10 s
    Real 3627.5954.251.49 s
    WorldPop21.7238.9744.26 s

    ONE SOURCE, AN EXPLICIT QUERY

    A small Python example.

    This example opens the prepared SKV from Skarve’s generated example fixture and requests the native backend explicitly. The polygon uses that fixture’s EPSG:3857 grid.

    It assumes the package is installed and example-data/snapshot.skv has already been compiled. Follow the source installation guide and generated-data walkthrough.

    Also available through Rust, Node.js and the CLI.

    PYTHON · PREPARED EXAMPLE FIXTURE
    from skarve import Skarve
    
    zone = {
        "type": "Polygon",
        "coordinates": [
            [[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]]
        ],
    }
    with Skarve() as engine:
        with engine.infuse("example-data/snapshot.skv") as source:
            result = source.carve(
                zone=zone, crs="EPSG:3857", bands=[0],
                metrics=["sum", "mean"], backend="native"
            )
            print(result["bands"][0]["fractional_sum"])

    BUILT BY FLORENT CHIF

    An engine. An open development process.

    Skarve is independent geospatial engineering, with a Rust core and Python, Node.js and CLI interfaces. SKV v0 remains experimental. The validated platform is Linux x86-64 on Ubuntu 24.04.

    Open source under Apache-2.0. Source-only alpha.2 is available. Build from source; registry packages and prebuilt binary downloads are not yet available.

    Used in Horizon Mapper. The qualified Belgium and France integration uses Skarve, with prepared SKV where eligible and COG fallback. The frozen benchmark above is separate from application performance and does not establish support for every country or source.

    Repository · Rust · Python · Node.js · CLI

    Horizon Mapper methodology