Edit

Cloud Optimized GeoTIFF (COG) with Custom Loader

cog15

Rendering a COG with a custom loader function.

Tiled data from a Cloud Optimized GeoTIFF (COG) can be rendered as a layer. In this example, a custom loader function is provided to handle requests with custom headers or authentication logic. The loader receives the URL, headers, and an abort signal, and must return a Response object.

main.js
import Map from 'ol/Map.js';
import {getView, withExtentCenter, withHigherResolutions} from 'ol/View.js';
import TileLayer from 'ol/layer/WebGLTile.js';
import GeoTIFF from 'ol/source/GeoTIFF.js';

const dataUrl =
  'https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/36/Q/WD/2020/7/S2A_36QWD_20200701_0_L2A/TCI.tif';

const source = new GeoTIFF({
  sources: [
    {
      url: dataUrl,
      // Use a custom loader function to control how the data is fetched.
      // The function receives the URL, request headers, and an abort signal.
      loader: (url, headers, abortSignal) => {
        // Add custom headers (e.g., authentication tokens)
        const customHeaders = {
          ...headers,
          // Example: 'Authorization': 'Bearer your-token-here',
        };

        // Optionally add custom logic (logging, retry logic, caching, etc.)

        return fetch(url, {
          headers: customHeaders,
          signal: abortSignal,
        });
      },
    },
  ],
});

const map = new Map({
  target: 'map',
  layers: [
    new TileLayer({
      source: source,
    }),
  ],
  view: getView(source, withHigherResolutions(1), withExtentCenter()),
});
index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Cloud Optimized GeoTIFF (COG) with Custom Loader</title>
    <link rel="stylesheet" href="node_modules/ol/ol.css">
    <style>
      .map {
        width: 100%;
        height: 400px;
      }
    </style>
  </head>
  <body>
    <div id="map" class="map"></div>

    <script type="module" src="main.js"></script>
  </body>
</html>
package.json
{
  "name": "cog-custom-client",
  "dependencies": {
    "ol": "10.9.0"
  },
  "devDependencies": {
    "vite": "^3.2.3"
  },
  "scripts": {
    "start": "vite",
    "build": "vite build"
  }
}