npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

dem-tiles

v2.1.1

Published

Decode elevation from Terrain RGB and Terrarium raster tilesets by longitude and latitude. Fork of @watergis/terrain-rgb.

Downloads

145

Readme

dem-tiles

Fork of @watergis/terrain-rgb by Jin IGARASHI, with performance improvements and additional sampling modes.

Decode elevation from Terrain RGB and Terrarium raster tile sets by longitude and latitude.

What's different from upstream

  • Median filter sampling — median elevation from a configurable pixel window, reducing noise from resampled/gdal2tiles tilesets.
  • createImageBitmap decoding — uses the browser-native createImageBitmap API instead of HTMLImageElement + Object URLs. Faster decoding, no dangling object URLs.
  • OffscreenCanvas support — uses OffscreenCanvas when available, otherwise falls back to <canvas>.
  • O(1) pixel lookup — computes RGBA byte offset directly, no intermediate Array<[r,g,b,a]> allocation.
  • In-flight request deduplication — multiple lookups on the same tile share one fetch + decode promise.
  • Batch getElevations — group coordinates by tile to minimize fetch/decode work.

Install

npm i dem-tiles

Usage

import { TerrainRGB, Terrarium } from "dem-tiles";
import { LRUCache } from "lru-cache";

const url = "https://wasac.github.io/rw-terrain/tiles/{z}/{x}/{y}.png";
const tileCache = new LRUCache<string, Uint8Array | undefined>({ max: 500 });

// Default: nearest-neighbor sampling
const trgb = new TerrainRGB(url, 512, 5, 15, false, { tileCache });
const elevation = await trgb.getElevation([30.0529622, -1.9575129], 15);

// Median filter sampling (3x3 window)
const trgbMedian = new TerrainRGB(url, 512, 5, 15, false, {
  tileCache,
  sampling: "median",
  sampleRadius: 1,
});

// Terrarium tileset
const terrarium = new Terrarium(url, 512, 5, 15, false, { tileCache });

// Batch lookup — coordinates sharing the same tile reuse one decoded buffer
const elevations = await trgb.getElevations(
  [
    [30.0529622, -1.9575129],
    [30.05297, -1.9576],
  ],
  15,
);

TMS tiles are supported by passing true as the 5th argument:

const trgb = new TerrainRGB(url, 512, 5, 15, true);

If a tile cannot be found, the method returns undefined (404s are handled gracefully). Both PNG and WebP formats are supported.

API

TerrainRGB / Terrarium

new TerrainRGB(url, tileSize, minzoom, maxzoom, tms, options?)
new Terrarium(url, tileSize, minzoom, maxzoom, tms, options?)

BaseTileOptions

| Option | Type | Default | Description | | -------------- | ------------------------------------------- | ----------- | ---------------------------------------- | | tileCache | LRUCache<string, Uint8Array \| undefined> | — | External LRU for decoded tile data | | sampling | "nearest" \| "median" | "nearest" | Pixel sampling strategy | | sampleRadius | number | 1 | Pixel radius for median window (1 = 3x3) |

Methods

  • getElevation([lng, lat], zoom)Promise<number | undefined>
  • getElevations([[lng,lat], ...], zoom)Promise<Array<number | undefined>>

Performance

  • Reuse a tileCache across calls when possible.
  • Prefer getElevations(coords, zoom) over many independent getElevation() calls when many coordinates share tiles.
  • Grouping happens by resolved tile URL, so repeated coordinates in the same tile share fetch, decode, cache, and in-flight request work.

Credits

This project is a fork of watergis/terrain-rgb. Original work by Jin IGARASHI. Licensed under MIT.