worldmap-viewer

git clone https://git.godosa.eu/worldmap-viewer

master

raw · 1859 bytes

import './_planet.mjs';
import { test } from 'node:test';
import assert from 'node:assert/strict';

const { riverStats, riverMinOrder, cellSpacingKm } = await import('../js/riverlod.js');
// r5 reference world: total river length per Strahler order (km, from its rivers.geojson) and its cell spacing
const r5 = { length: { 1: 3177232, 2: 430077, 3: 141166, 4: 38607, 5: 8174, 6: 1273 } };
const cell = cellSpacingKm(5, 6371);

test('H3 res-5 cells on an Earth-sized planet lie ≈ 16 km apart', () => {
  assert.ok(Math.abs(cell - 15.9) < 0.2, String(cell));
});

test('a phone at 26 km/px (the view that merged into blue) draws orders ≥ 3', () => {
  assert.equal(riverMinOrder(26, r5, cell), 3);      // order 3 ≈ 358 km apart ≥ 208; order 2 ≈ 117 km is not
});

test('closer in, smaller rivers join; first-order ones only when a cell spans ≥ 8 px', () => {
  assert.equal(riverMinOrder(14, r5, cell), 2);
  assert.equal(riverMinOrder(cell / 8, r5, cell), 1);
  assert.equal(riverMinOrder(cell / 7, r5, cell), 2);
});

test('far out: only the largest rivers; no scale yet: the largest; no data: all', () => {
  assert.equal(riverMinOrder(1e4, r5, cell), 6);
  assert.equal(riverMinOrder(null, r5, cell), 6);
  assert.equal(riverMinOrder(5, { length: {} }, cell), 1);
});

test('riverStats sums each order\'s length', async () => {
  const line = (o, ...lons) => ({ properties: { order: o }, geometry: { coordinates: lons.map(x => [x, 0]) } });
  const s = riverStats({ features: [line(1, 0, 1), line(1, 2, 3, 4), line(2, 0, 0.5)] });
  const { distanceKm } = await import('../js/geo.js');
  const deg = distanceKm({ lat: 0, lon: 0 }, { lat: 0, lon: 1 });   // km per degree on this planet's equator
  assert.ok(Math.abs(s.length[1] - 3 * deg) < 1, String(s.length[1]));
  assert.ok(Math.abs(s.length[2] - 0.5 * deg) < 1, String(s.length[2]));
});