<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>async-geotiff</title><link>https://async-geotiff-rs.pages.dev/</link><description>Recent content on async-geotiff</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Mon, 31 Aug 2026 11:56:37 +0800</lastBuildDate><atom:link href="https://async-geotiff-rs.pages.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Example HTTP API</title><link>https://async-geotiff-rs.pages.dev/docs/reference/tile-api/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://async-geotiff-rs.pages.dev/docs/reference/tile-api/</guid><description>&lt;p&gt;The HTTP API belongs to &lt;code&gt;examples/serve.rs&lt;/code&gt;; it is not part of the library’s&#10;dependency surface.&lt;/p&gt;&#10;&lt;h2 id="routes"&gt;Routes&#10;&lt;/h2&gt;&#10;&lt;div class="td-table-scroll td-table-scroll--static"&gt;&#10;&lt;table&gt;&#10; &lt;thead&gt;&#10; &lt;tr&gt;&#10; &lt;th scope="col"&gt;Method and path&lt;/th&gt;&#10; &lt;th scope="col"&gt;Purpose&lt;/th&gt;&#10; &lt;/tr&gt;&#10; &lt;/thead&gt;&#10; &lt;tbody&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;GET /tiles/{tms}/{z}/{x}/{y}.{ext}&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;Render a tile from the selected single COG.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;GET /mosaic/tiles/{tms}/{z}/{x}/{y}.{ext}&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;Render a tile from the configured mosaic or STAC source.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;GET /datasets&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;List local TIFF files discovered under &lt;code&gt;data/&lt;/code&gt;.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;GET /cache/stats&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;Return decoded-block cache statistics.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;GET /formats&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;Return output formats compiled into the server.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;GET /bounds&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;Return bounds used by the example viewers.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;GET&lt;/code&gt;, &lt;code&gt;HEAD /data/{name}&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;Serve a discovered local TIFF with range support.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;Supported TMS names are &lt;code&gt;WebMercatorQuad&lt;/code&gt; and &lt;code&gt;WorldCRS84Quad&lt;/code&gt;. Supported&#10;extensions are &lt;code&gt;png&lt;/code&gt;, feature-gated &lt;code&gt;webp&lt;/code&gt;, and feature-gated &lt;code&gt;jpg&lt;/code&gt;/&lt;code&gt;jpeg&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Requirements</title><link>https://async-geotiff-rs.pages.dev/docs/get-started/requirements/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://async-geotiff-rs.pages.dev/docs/get-started/requirements/</guid><description>&lt;h2 id="library"&gt;Library and examples&#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Rust 1.88 or newer, matching &lt;code&gt;Cargo.toml&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;The default feature set requires system &lt;code&gt;libproj&lt;/code&gt; 9.x.&lt;/li&gt;&#10;&lt;li&gt;Git is required when working from the repository.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;On macOS:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-3aeb3309-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="1"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-3aeb3309-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install proj&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;On Debian or Ubuntu:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-3aeb3309-fence-1" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="1"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-3aeb3309-fence-1-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install libproj-dev libsqlite3-dev libtiff-dev clang&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;On other platforms, install &lt;code&gt;libproj&lt;/code&gt; with the platform&amp;rsquo;s supported package&#10;manager or build without the default features. The project does not currently&#10;provide platform-specific Windows installation commands.&lt;/p&gt;</description></item><item><title>Styling and band math</title><link>https://async-geotiff-rs.pages.dev/docs/guides/styling/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://async-geotiff-rs.pages.dev/docs/guides/styling/</guid><description>&lt;p&gt;The same &lt;code&gt;TileStyle&lt;/code&gt; model serves the Rust API and the example server’s query&#10;string. Styles are validated before expensive COG reads and rendering work.&lt;/p&gt;&#10;&lt;h2 id="recipes"&gt;Common recipes&#10;&lt;/h2&gt;&#10;&lt;p&gt;Natural-color RGB from three bands:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-b5116023-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="text" data-td-line-count="1"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-b5116023-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bidx=1&amp;amp;bidx=2&amp;amp;bidx=3&amp;amp;rescale=0,3000&amp;amp;rescale=0,3000&amp;amp;rescale=0,3000&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Single-band color ramp:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-b5116023-fence-1" data-td-code data-td-code-auto-id&#10; data-td-language="text" data-td-line-count="1"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-b5116023-fence-1-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bidx=1&amp;amp;colormap_name=viridis&amp;amp;rescale=0,3000&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Percentile stretch:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-b5116023-fence-2" data-td-code data-td-code-auto-id&#10; data-td-language="text" data-td-line-count="1"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-b5116023-fence-2-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;stretch=percent&amp;amp;pc=2,98&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Average downsampling and bilinear reprojection:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-b5116023-fence-3" data-td-code data-td-code-auto-id&#10; data-td-language="text" data-td-line-count="1"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-b5116023-fence-3-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;resampling=average&amp;amp;reproject=bilinear&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="stretch"&gt;Stretch behavior&#10;&lt;/h2&gt;&#10;&lt;p&gt;For non-U8 data, the effective value range is selected in this order:&lt;/p&gt;</description></item><item><title>What is async-geotiff?</title><link>https://async-geotiff-rs.pages.dev/docs/overview/what-is-async-geotiff/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://async-geotiff-rs.pages.dev/docs/overview/what-is-async-geotiff/</guid><description>&lt;p&gt;&lt;code&gt;async-geotiff&lt;/code&gt; is a Rust library for turning Cloud-Optimized GeoTIFFs (COGs)&#10;into styled XYZ map tiles. It reads only the byte ranges needed for a tile,&#10;decodes native TIFF blocks, optionally reprojects them, applies a rendering&#10;style, and encodes the result.&lt;/p&gt;&#10;&lt;h2 id="capabilities"&gt;Core capabilities&#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Async COG access over HTTPS or any caller-configured &lt;code&gt;object_store&lt;/code&gt; backend.&lt;/li&gt;&#10;&lt;li&gt;Shared, byte-bounded caching of decoded native TIFF blocks.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;WebMercatorQuad&lt;/code&gt; (EPSG:3857) and &lt;code&gt;WorldCRS84Quad&lt;/code&gt; (EPSG:4326) tile grids.&lt;/li&gt;&#10;&lt;li&gt;U8, U16, I16, U32, I32, F32, and F64 source pixels.&lt;/li&gt;&#10;&lt;li&gt;Nearest, bilinear, cubic, cubic-spline, Lanczos, and average resampling.&lt;/li&gt;&#10;&lt;li&gt;Rescaling, colormaps, RGB composition, color formulas, and arithmetic band math.&lt;/li&gt;&#10;&lt;li&gt;PNG output, plus feature-gated WebP and JPEG output.&lt;/li&gt;&#10;&lt;li&gt;Multi-asset mosaics backed by MosaicJSON, STAC, or a custom source.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="boundaries"&gt;What the library deliberately does not own&#10;&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;No GDAL runtime.&lt;/strong&gt; TIFF I/O uses &lt;code&gt;async-tiff&lt;/code&gt; and &lt;code&gt;object_store&lt;/code&gt;. The default&#10;&lt;code&gt;proj&lt;/code&gt; feature uses the system &lt;code&gt;libproj&lt;/code&gt; library only for coordinate&#10;transformations that do not have a built-in fast path.&lt;/p&gt;</description></item><item><title>Architecture</title><link>https://async-geotiff-rs.pages.dev/docs/overview/architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://async-geotiff-rs.pages.dev/docs/overview/architecture/</guid><description>&lt;p&gt;The library separates asynchronous range I/O from CPU-heavy decode, warp,&#10;render, and encode work. Applications compose the public layers they need.&lt;/p&gt;&#10;&lt;pre class="td-mermaid-source"&gt;&lt;code class="language-mermaid"&gt;flowchart LR&#10; Client[HTTP client or Rust caller] --&amp;gt; Style[TileStyle]&#10; Client --&amp;gt; Tiler[Tiler]&#10; Tiler --&amp;gt; Grid[TileMatrixSet]&#10; Tiler --&amp;gt; Reader[CogReader]&#10; Reader --&amp;gt; Store[object_store / HTTP range reads]&#10; Reader &amp;lt;--&amp;gt; Cache[Shared BlockCache]&#10; Reader --&amp;gt; CPU[CpuLimiter &amp;#43; spawn_blocking]&#10; CPU --&amp;gt; Warp[Warp and resampling]&#10; Warp --&amp;gt; Render[Rescale / colormap / composite]&#10; Style --&amp;gt; Render&#10; Render --&amp;gt; Encode[PNG / WebP / JPEG]&#10; Encode --&amp;gt; Result[Option&amp;amp;lt;Bytes&amp;amp;gt;]&#10; Mosaic[MosaicTiler] --&amp;gt; ReaderPool[ReaderPool]&#10; ReaderPool --&amp;gt; Reader&#10; Mosaic --&amp;gt; Render&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="components"&gt;Main components&#10;&lt;/h2&gt;&#10;&lt;div class="td-table-scroll td-table-scroll--static"&gt;&#10;&lt;table&gt;&#10; &lt;thead&gt;&#10; &lt;tr&gt;&#10; &lt;th scope="col"&gt;Component&lt;/th&gt;&#10; &lt;th scope="col"&gt;Responsibility&lt;/th&gt;&#10; &lt;/tr&gt;&#10; &lt;/thead&gt;&#10; &lt;tbody&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;CogReader&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;Open a COG, read metadata and overviews, select and stitch native blocks, and sample points or windows.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;BlockCache&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;Share decoded native blocks across readers under one byte budget; coalesce concurrent cold fetches.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;Tiler&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;Plan a tile, choose an overview, read the source window, warp when required, and render encoded bytes.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;TileStyle&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;Parse and validate titiler-style query parameters before rendering.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;MosaicTiler&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;Find assets, open readers through a pool, warp each asset, reduce overlapping pixels, and render once.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;CpuLimiter&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;Bound CPU-heavy blocking work across readers and tilers.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="tile-flow"&gt;Tile data flow&#10;&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;code&gt;TileCoord&lt;/code&gt; identifies a tile in a supported TileMatrixSet.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;Tiler&lt;/code&gt; computes the destination bounds and checks whether they intersect&#10;the source dataset.&lt;/li&gt;&#10;&lt;li&gt;It selects an overview whose ground resolution is appropriate for the&#10;requested tile.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;CogReader&lt;/code&gt; loads missing native blocks through range requests and reuses&#10;cached blocks where possible.&lt;/li&gt;&#10;&lt;li&gt;Same-CRS tiles use an affine fast path. Cross-CRS tiles use an inverse warp;&#10;EPSG:4326 ↔ EPSG:3857 has a closed-form fast path, while other pairs require&#10;the &lt;code&gt;proj&lt;/code&gt; feature.&lt;/li&gt;&#10;&lt;li&gt;The render pipeline applies nodata, scaling, optional band math, rescaling,&#10;colormaps or RGB composition, and the requested output encoder.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="concurrency"&gt;Concurrency model&#10;&lt;/h2&gt;&#10;&lt;p&gt;Tokio drives asynchronous metadata and byte-range I/O. Decode, stitch, warp,&#10;reduction, render, and encode jobs run through &lt;code&gt;spawn_blocking&lt;/code&gt; behind a&#10;semaphore. Applications can inject one &lt;code&gt;Arc&amp;lt;BlockCache&amp;gt;&lt;/code&gt; across single-COG and&#10;mosaic readers to avoid multiplying decoded-cache budgets. They can also inject&#10;one &lt;code&gt;CpuLimiter&lt;/code&gt; across non-mosaic &lt;code&gt;CogReader&lt;/code&gt;/&lt;code&gt;Tiler&lt;/code&gt; instances. Current&#10;&lt;code&gt;MosaicTiler&lt;/code&gt; uses its own internal limiter and cannot join that permit budget,&#10;so mixed traffic has no automatic process-wide CPU cap.&lt;/p&gt;</description></item><item><title>Cargo features</title><link>https://async-geotiff-rs.pages.dev/docs/reference/cargo-features/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://async-geotiff-rs.pages.dev/docs/reference/cargo-features/</guid><description>&lt;div class="td-table-scroll td-table-scroll--static"&gt;&#10;&lt;table&gt;&#10; &lt;thead&gt;&#10; &lt;tr&gt;&#10; &lt;th scope="col"&gt;Feature&lt;/th&gt;&#10; &lt;th scope="col" style="text-align: right"&gt;Default&lt;/th&gt;&#10; &lt;th scope="col"&gt;Effect&lt;/th&gt;&#10; &lt;/tr&gt;&#10; &lt;/thead&gt;&#10; &lt;tbody&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;proj&lt;/code&gt;&lt;/td&gt;&#10; &lt;td style="text-align: right"&gt;yes&lt;/td&gt;&#10; &lt;td&gt;Enables general CRS transformation through system &lt;code&gt;libproj&lt;/code&gt;.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;mosaic&lt;/code&gt;&lt;/td&gt;&#10; &lt;td style="text-align: right"&gt;yes&lt;/td&gt;&#10; &lt;td&gt;Enables &lt;code&gt;MosaicTiler&lt;/code&gt;, &lt;code&gt;MosaicSource&lt;/code&gt;, MosaicJSON, and async asset fan-out.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;webp&lt;/code&gt;&lt;/td&gt;&#10; &lt;td style="text-align: right"&gt;no&lt;/td&gt;&#10; &lt;td&gt;Enables lossless WebP encoding through &lt;code&gt;image&lt;/code&gt;.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;jpeg&lt;/code&gt;&lt;/td&gt;&#10; &lt;td style="text-align: right"&gt;no&lt;/td&gt;&#10; &lt;td&gt;Enables JPEG encoding; alpha is flattened because JPEG has no alpha channel.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;stac&lt;/code&gt;&lt;/td&gt;&#10; &lt;td style="text-align: right"&gt;no&lt;/td&gt;&#10; &lt;td&gt;Adds the STAC client and implies &lt;code&gt;mosaic&lt;/code&gt;.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;perf-tracing&lt;/code&gt;&lt;/td&gt;&#10; &lt;td style="text-align: right"&gt;no&lt;/td&gt;&#10; &lt;td&gt;Emits detailed internal timing events.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;tokio-console&lt;/code&gt;&lt;/td&gt;&#10; &lt;td style="text-align: right"&gt;no&lt;/td&gt;&#10; &lt;td&gt;Enables Tokio Console integration and implies &lt;code&gt;perf-tracing&lt;/code&gt;.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;Examples:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-7cfcfdcf-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="14"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-7cfcfdcf-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Default: projection + mosaics + PNG&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo build --release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Minimal library without general PROJ or mosaics&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo build --release --no-default-features&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Example server with all image formats&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo run --release --example serve --features webp,jpeg&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# STAC-backed mosaic demo&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo run --release --example serve --features stac&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Full verification surface&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo &lt;span class="nb"&gt;test&lt;/span&gt; --all-features --locked&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;The &lt;code&gt;serve&lt;/code&gt;, &lt;code&gt;mosaic_source&lt;/code&gt;, and &lt;code&gt;mosaic_json&lt;/code&gt; examples require the &lt;code&gt;mosaic&lt;/code&gt;&#10;feature. PNG support is always compiled.&lt;/p&gt;</description></item><item><title>Mosaics and STAC</title><link>https://async-geotiff-rs.pages.dev/docs/guides/mosaics/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://async-geotiff-rs.pages.dev/docs/guides/mosaics/</guid><description>&lt;p&gt;The default-enabled &lt;code&gt;mosaic&lt;/code&gt; Cargo feature adds &lt;code&gt;MosaicTiler&lt;/code&gt; and the&#10;&lt;code&gt;MosaicSource&lt;/code&gt; trait; applications that do not need mosaics can disable default&#10;features. Because that also disables &lt;code&gt;proj&lt;/code&gt;, use&#10;&lt;code&gt;--no-default-features --features proj&lt;/code&gt; when general CRS transformation is&#10;still required. The source maps a tile coordinate to assets; the tiler opens&#10;and warps those assets, reduces overlapping pixels, and renders the composite&#10;once.&lt;/p&gt;&#10;&lt;h2 id="mosaicjson"&gt;MosaicJSON&#10;&lt;/h2&gt;&#10;&lt;p&gt;Run the embedded example or pass a MosaicJSON file:&lt;/p&gt;</description></item><item><title>Quick start</title><link>https://async-geotiff-rs.pages.dev/docs/get-started/quick-start/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://async-geotiff-rs.pages.dev/docs/get-started/quick-start/</guid><description>&lt;h2 id="run"&gt;Clone and run&#10;&lt;/h2&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-ac605d5a-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="4"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-ac605d5a-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/mapseekai/async-geotiff-rs.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; async-geotiff-rs&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;COG_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://raw.githubusercontent.com/cogeotiff/rio-tiler/0b08b7f35a8b639cee2f35a0cb565034f7b55bfd/tests/fixtures/cog.tif&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo run --release --example serve -- &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$COG_URL&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;The pinned 800 KiB &lt;code&gt;rio-tiler&lt;/code&gt; fixture is a public, range-capable COG intended&#10;for tests and first-run verification. Replace it with your own COG after the&#10;smoke test. The server listens on &lt;code&gt;127.0.0.1:8080&lt;/code&gt; by default and prints the&#10;available viewer and tile URLs when startup completes.&lt;/p&gt;</description></item><item><title>Example server configuration</title><link>https://async-geotiff-rs.pages.dev/docs/reference/runtime-configuration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://async-geotiff-rs.pages.dev/docs/reference/runtime-configuration/</guid><description>&lt;p&gt;These variables configure &lt;code&gt;cargo run --example serve&lt;/code&gt;. They are example-server&#10;contracts, not global library configuration.&lt;/p&gt;&#10;&lt;div class="td-table-scroll td-table-scroll--static"&gt;&#10;&lt;table&gt;&#10; &lt;thead&gt;&#10; &lt;tr&gt;&#10; &lt;th scope="col"&gt;Variable&lt;/th&gt;&#10; &lt;th scope="col"&gt;Default&lt;/th&gt;&#10; &lt;th scope="col"&gt;Meaning&lt;/th&gt;&#10; &lt;/tr&gt;&#10; &lt;/thead&gt;&#10; &lt;tbody&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;ASYNC_GEOTIFF_BIND&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;&lt;code&gt;127.0.0.1:8080&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;Socket address for the HTTP server.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;ASYNC_GEOTIFF_BLOCK_CACHE_MB&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;&lt;code&gt;512&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;Shared decoded-block cache capacity in MiB; must be positive.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;ASYNC_GEOTIFF_MAX_DECODE_TASKS&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;available parallelism&lt;/td&gt;&#10; &lt;td&gt;Maximum concurrent decode/stitch CPU jobs; must be positive.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;ASYNC_GEOTIFF_MAX_TILE_TASKS&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;available parallelism&lt;/td&gt;&#10; &lt;td&gt;Maximum concurrent tile warp/render CPU jobs; must be positive.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;ASYNC_GEOTIFF_PREFETCH_RING&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;Number of native-block rings prefetched around a read; &lt;code&gt;0&lt;/code&gt; disables it.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;ASYNC_GEOTIFF_SLOW_TILE_MS&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;unset&lt;/td&gt;&#10; &lt;td&gt;Emit a slow-tile warning above this positive millisecond threshold.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;ASYNC_GEOTIFF_MOSAIC&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;unset&lt;/td&gt;&#10; &lt;td&gt;Path to a MosaicJSON file loaded at startup.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;ASYNC_GEOTIFF_STAC_URL&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;unset&lt;/td&gt;&#10; &lt;td&gt;Fixed STAC API URL; requires the &lt;code&gt;stac&lt;/code&gt; feature and the next two variables.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;ASYNC_GEOTIFF_STAC_COLLECTION&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;unset&lt;/td&gt;&#10; &lt;td&gt;Fixed STAC collection ID.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;ASYNC_GEOTIFF_STAC_ASSET_KEY&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;unset&lt;/td&gt;&#10; &lt;td&gt;Fixed STAC COG asset key.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;ASYNC_GEOTIFF_TOKIO_CONSOLE&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;off&lt;/td&gt;&#10; &lt;td&gt;Enable Tokio Console with &lt;code&gt;1&lt;/code&gt;, &lt;code&gt;true&lt;/code&gt;, &lt;code&gt;yes&lt;/code&gt;, or &lt;code&gt;on&lt;/code&gt; when compiled with &lt;code&gt;tokio-console&lt;/code&gt;.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;RUST_LOG&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;&lt;code&gt;async_geotiff=debug,warn&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;Standard tracing filter for the example server.&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;&lt;code&gt;ASYNC_GEOTIFF_MOSAIC&lt;/code&gt; and the STAC configuration are mutually exclusive. All&#10;three STAC variables must be supplied together.&lt;/p&gt;</description></item><item><title>Library usage</title><link>https://async-geotiff-rs.pages.dev/docs/get-started/library-usage/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://async-geotiff-rs.pages.dev/docs/get-started/library-usage/</guid><description>&lt;p&gt;The repository currently sets &lt;code&gt;publish = false&lt;/code&gt;, so another local project uses&#10;a path dependency while developing. Create the application next to the clone,&#10;then replace the relative path if your directories differ:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-6795ac54-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="4"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-6795ac54-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Starting inside the async-geotiff-rs checkout:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ..&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo new async-geotiff-demo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; async-geotiff-demo&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-6795ac54-fence-1" data-td-code data-td-code-auto-id&#10; data-td-language="toml" data-td-line-count="3"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-6795ac54-fence-1-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;dependencies&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;async-geotiff&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;../async-geotiff-rs&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;tokio&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;features&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;macros&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;rt-multi-thread&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;To avoid the system &lt;code&gt;libproj&lt;/code&gt; dependency while retaining the mosaic APIs used&#10;by the example server, set &lt;code&gt;default-features = false, features = [&amp;quot;mosaic&amp;quot;]&lt;/code&gt; on&#10;the path dependency. General CRS transformations will then be unavailable.&lt;/p&gt;</description></item><item><title>Production operation</title><link>https://async-geotiff-rs.pages.dev/docs/guides/production/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://async-geotiff-rs.pages.dev/docs/guides/production/</guid><description>&lt;h2 id="cache"&gt;Share one cache&#10;&lt;/h2&gt;&#10;&lt;p&gt;The default decoded-block cache budget is 512 MiB. A server with many readers&#10;should inject the same &lt;code&gt;Arc&amp;lt;BlockCache&amp;gt;&lt;/code&gt; into every reader and mosaic. Give&#10;each distinct COG a stable source ID so cache entries cannot collide.&lt;/p&gt;&#10;&lt;p&gt;This budget covers resident decoded blocks in the cache, not total process&#10;RSS. In-flight compressed bytes, decode and warp buffers, encoded responses,&#10;reader metadata, and mosaic reducer state are additional memory. In particular,&#10;&lt;code&gt;Median&lt;/code&gt; retains every contributing image until reduction completes.&lt;/p&gt;</description></item></channel></rss>