UNPKG

crepuscule

Version:

Sunlight raster tile layer, with twilight, dynamically generated for MapLibre GL and MapTiler SDK.

168 lines (167 loc) 11.1 kB
var n = Object.defineProperty; var K = (o, t, s) => t in o ? n(o, t, { enumerable: !0, configurable: !0, writable: !0, value: s }) : o[t] = s; var i = (o, t, s) => (K(o, typeof t != "symbol" ? t + "" : t, s), s); import { addProtocol as r } from "@maptiler/sdk"; const u = "KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiOyhmdW5jdGlvbigpe3ZhciBoPU1hdGguUEksaT1NYXRoLnNpbixhPU1hdGguY29zLG09TWF0aC50YW4seD1NYXRoLmFzaW4sTT1NYXRoLmF0YW4yLEQ9TWF0aC5hY29zLHM9aC8xODAsSD0xZTMqNjAqNjAqMjQsVT0yNDQwNTg4LHA9MjQ1MTU0NTtmdW5jdGlvbiAkKHQpe3JldHVybiB0L0gtLjUrVX1mdW5jdGlvbiBBKHQpe3JldHVybiBuZXcgRGF0ZSgodCsuNS1VKSpIKX1mdW5jdGlvbiBrKHQpe3JldHVybiAkKHQpLXB9dmFyIEI9cyoyMy40Mzk3O2Z1bmN0aW9uIHkodCxuKXtyZXR1cm4gTShpKHQpKmEoQiktbShuKSppKEIpLGEodCkpfWZ1bmN0aW9uIEUodCxuKXtyZXR1cm4geChpKG4pKmEoQikrYShuKSppKEIpKmkodCkpfWZ1bmN0aW9uIEYodCxuLGUpe3JldHVybiBNKGkodCksYSh0KSppKG4pLW0oZSkqYShuKSl9ZnVuY3Rpb24gUSh0LG4sZSl7cmV0dXJuIHgoaShuKSppKGUpK2EobikqYShlKSphKHQpKX1mdW5jdGlvbiBSKHQsbil7cmV0dXJuIHMqKDI4MC4xNiszNjAuOTg1NjIzNSp0KS1ufWZ1bmN0aW9uIHcodCl7cmV0dXJuIHQ8MCYmKHQ9MCksMjk2N2UtNy9NYXRoLnRhbih0Ky4wMDMxMjUzNi8odCsuMDg5MDExNzkpKX1mdW5jdGlvbiBvKHQpe3JldHVybiBzKigzNTcuNTI5MSsuOTg1NjAwMjgqdCl9ZnVuY3Rpb24gaih0KXt2YXIgbj1zKigxLjkxNDgqaSh0KSsuMDIqaSgyKnQpKzNlLTQqaSgzKnQpKSxlPXMqMTAyLjkzNzI7cmV0dXJuIHQrbitlK2h9ZnVuY3Rpb24gcSh0KXt2YXIgbj1vKHQpLGU9aihuKTtyZXR1cm57ZGVjOkUoZSwwKSxyYTp5KGUsMCl9fXZhciBmPXt9O2YuZ2V0UG9zaXRpb249ZnVuY3Rpb24odCxuLGUpe3ZhciB1PXMqLWUscj1zKm4sbD1rKHQpLGM9cShsKSxkPVIobCx1KS1jLnJhO3JldHVybnthemltdXRoOkYoZCxyLGMuZGVjKSxhbHRpdHVkZTpRKGQscixjLmRlYyl9fTt2YXIgRz1mLnRpbWVzPVtbLS44MzMsInN1bnJpc2UiLCJzdW5zZXQiXSxbLS4zLCJzdW5yaXNlRW5kIiwic3Vuc2V0U3RhcnQiXSxbLTYsImRhd24iLCJkdXNrIl0sWy0xMiwibmF1dGljYWxEYXduIiwibmF1dGljYWxEdXNrIl0sWy0xOCwibmlnaHRFbmQiLCJuaWdodCJdLFs2LCJnb2xkZW5Ib3VyRW5kIiwiZ29sZGVuSG91ciJdXTtmLmFkZFRpbWU9ZnVuY3Rpb24odCxuLGUpe0cucHVzaChbdCxuLGVdKX07dmFyIFY9OWUtNDtmdW5jdGlvbiBLKHQsbil7cmV0dXJuIE1hdGgucm91bmQodC1WLW4vKDIqaCkpfWZ1bmN0aW9uIFcodCxuLGUpe3JldHVybiBWKyh0K24pLygyKmgpK2V9ZnVuY3Rpb24gWih0LG4sZSl7cmV0dXJuIHArdCsuMDA1MyppKG4pLS4wMDY5KmkoMiplKX1mdW5jdGlvbiBpdCh0LG4sZSl7cmV0dXJuIEQoKGkodCktaShuKSppKGUpKS8oYShuKSphKGUpKSl9ZnVuY3Rpb24gYXQodCl7cmV0dXJuLTIuMDc2Kk1hdGguc3FydCh0KS82MH1mdW5jdGlvbiBydCh0LG4sZSx1LHIsbCxjKXt2YXIgZD1pdCh0LGUsdSksZz1XKGQsbixyKTtyZXR1cm4gWihnLGwsYyl9Zi5nZXRUaW1lcz1mdW5jdGlvbih0LG4sZSx1KXt1PXV8fDA7dmFyIHI9cyotZSxsPXMqbixjPWF0KHUpLGQ9ayh0KSxnPUsoZCxyKSxUPVcoMCxyLGcpLFM9byhUKSxDPWooUyksTD1FKEMsMCksej1aKFQsUyxDKSxJLE4sYixQLEosTyx2PXtzb2xhck5vb246QSh6KSxuYWRpcjpBKHotLjUpfTtmb3IoST0wLE49Ry5sZW5ndGg7STxOO0krPTEpYj1HW0ldLFA9KGJbMF0rYykqcyxKPXJ0KFAscixsLEwsZyxTLEMpLE89ei0oSi16KSx2W2JbMV1dPUEoTyksdltiWzJdXT1BKEopO3JldHVybiB2fTtmdW5jdGlvbiB0dCh0KXt2YXIgbj1zKigyMTguMzE2KzEzLjE3NjM5Nip0KSxlPXMqKDEzNC45NjMrMTMuMDY0OTkzKnQpLHU9cyooOTMuMjcyKzEzLjIyOTM1KnQpLHI9bitzKjYuMjg5KmkoZSksbD1zKjUuMTI4KmkodSksYz0zODUwMDEtMjA5MDUqYShlKTtyZXR1cm57cmE6eShyLGwpLGRlYzpFKHIsbCksZGlzdDpjfX1mLmdldE1vb25Qb3NpdGlvbj1mdW5jdGlvbih0LG4sZSl7dmFyIHU9cyotZSxyPXMqbixsPWsodCksYz10dChsKSxkPVIobCx1KS1jLnJhLGc9UShkLHIsYy5kZWMpLFQ9TShpKGQpLG0ocikqYShjLmRlYyktaShjLmRlYykqYShkKSk7cmV0dXJuIGc9Zyt3KGcpLHthemltdXRoOkYoZCxyLGMuZGVjKSxhbHRpdHVkZTpnLGRpc3RhbmNlOmMuZGlzdCxwYXJhbGxhY3RpY0FuZ2xlOlR9fSxmLmdldE1vb25JbGx1bWluYXRpb249ZnVuY3Rpb24odCl7dmFyIG49ayh0fHxuZXcgRGF0ZSgpLnZhbHVlT2YoKSksZT1xKG4pLHU9dHQobikscj0xNDk1OThlMyxsPUQoaShlLmRlYykqaSh1LmRlYykrYShlLmRlYykqYSh1LmRlYykqYShlLnJhLXUucmEpKSxjPU0ocippKGwpLHUuZGlzdC1yKmEobCkpLGQ9TShhKGUuZGVjKSppKGUucmEtdS5yYSksaShlLmRlYykqYSh1LmRlYyktYShlLmRlYykqaSh1LmRlYykqYShlLnJhLXUucmEpKTtyZXR1cm57ZnJhY3Rpb246KDErYShjKSkvMixwaGFzZTouNSsuNSpjKihkPDA/LTE6MSkvTWF0aC5QSSxhbmdsZTpkfX07ZnVuY3Rpb24gWCh0LG4pe3JldHVybiBuZXcgRGF0ZSh0K24qSC8yNCl9Zi5nZXRNb29uVGltZXM9ZnVuY3Rpb24odCxuLGUsdSl7dmFyIHI9bmV3IERhdGUodCk7dT9yLnNldFVUQ0hvdXJzKDAsMCwwLDApOnIuc2V0SG91cnMoMCwwLDAsMCk7Zm9yKHZhciBsPS4xMzMqcyxjPWYuZ2V0TW9vblBvc2l0aW9uKHIsbixlKS5hbHRpdHVkZS1sLGQsZyxULFMsQyxMLHosSSxOLGIsUCxKLE8sdj0xO3Y8PTI0JiYoZD1mLmdldE1vb25Qb3NpdGlvbihYKHIsdiksbixlKS5hbHRpdHVkZS1sLGc9Zi5nZXRNb29uUG9zaXRpb24oWChyLHYrMSksbixlKS5hbHRpdHVkZS1sLEM9KGMrZykvMi1kLEw9KGctYykvMix6PS1MLygyKkMpLEk9KEMqeitMKSp6K2QsTj1MKkwtNCpDKmQsYj0wLE4+PTAmJihPPU1hdGguc3FydChOKS8oTWF0aC5hYnMoQykqMiksUD16LU8sSj16K08sTWF0aC5hYnMoUCk8PTEmJmIrKyxNYXRoLmFicyhKKTw9MSYmYisrLFA8LTEmJihQPUopKSxiPT09MT9jPDA/VD12K1A6Uz12K1A6Yj09PTImJihUPXYrKEk8MD9KOlApLFM9disoSTwwP1A6SikpLCEoVCYmUykpO3YrPTIpYz1nO3ZhciBZPXt9O3JldHVybiBUJiYoWS5yaXNlPVgocixUKSksUyYmKFkuc2V0PVgocixTKSksIVQmJiFTJiYoWVtJPjA/ImFsd2F5c1VwIjoiYWx3YXlzRG93biJdPSEwKSxZfSx0eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJnR5cGVvZiBtb2R1bGU8InUiP21vZHVsZS5leHBvcnRzPWY6dHlwZW9mIGRlZmluZT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZD9kZWZpbmUoZik6c2VsZi5TdW5DYWxjPWZ9KSgpO2Z1bmN0aW9uIG50KGgpe2NvbnN0IGk9TWF0aC5QSSxhPU1hdGguYXRhbixtPU1hdGguZXhwLHg9bShoKjIqaSk7cmV0dXJuKGEoeCktaS80KSozNjAvaX1mdW5jdGlvbiBfKGgsaSxhLG0seCxNKXtjb25zdCBEPTIqKngscz0xL0QqKGEraC9NKSxIPTEvRCoobStpL00pLFU9cyozNjAtMTgwLHA9bnQoMS1ILS41KTtyZXR1cm5bVSxwXX1hc3luYyBmdW5jdGlvbiBldChoLGksYSxtLHgsTSl7cmV0dXJuIG5ldyBQcm9taXNlKEQ9Pntjb25zdCBVPTEuMzMzMzMzMzMzMzMzMzMzMyxwPX5+KDEyOC8yKSxBPVt7eDowLHk6MH0se3g6MCx5OjEyOC0xfSx7eDoxMjgtMSx5OjEyOC0xfSx7eDoxMjgtMSx5OjB9LHt4OnAseTpwfSx7eDpwLHk6MH0se3g6cCx5OjEyOC0xfSx7eDowLHk6cH0se3g6MTI4LTEseTpwfV0ubWFwKG89Pntjb25zdFtqLHFdPV8oby54LG8ueSxoLGksYSwxMjgpLHthbHRpdHVkZTpmfT1TdW5DYWxjLmdldFBvc2l0aW9uKG0scSxqKTtyZXR1cm4gZioxODAvTWF0aC5QSX0pLGs9QS5ldmVyeShvPT5vPjApLEI9QS5ldmVyeShvPT5vPC02KSx5PWt8fEI/MjoxMjgsRT15KnksRj1uZXcgT2Zmc2NyZWVuQ2FudmFzKHkseSksUT1GLmdldENvbnRleHQoIjJkIiksUj1uZXcgSW1hZ2VEYXRhKHkseSksdz1uZXcgVWludDhDbGFtcGVkQXJyYXkoRSo0KTtmb3IobGV0IG89MDtvPEUqNDtvKz00KXtjb25zdCBqPW8vNCV5LHE9fn4oby80L3kpLFtmLEddPV8oaixxLGgsaSxhLHkpLHthbHRpdHVkZTpWfT1TdW5DYWxjLmdldFBvc2l0aW9uKG0sRyxmKSxLPVYqMTgwL01hdGguUEksVz0tSztNP0s+PTA/d1tvKzNdPTA6SzwtNj93W28rM109MjU1OndbbyszXT0xMjg6d1tvKzNdPTI1NSooMS8oMStNYXRoLmV4cCgtVSooVy02LzIpKSkpLHdbb109eFswXSx3W28rMV09eFsxXSx3W28rMl09eFsyXX1SLmRhdGEuc2V0KHcpLFEucHV0SW1hZ2VEYXRhKFIsMCwwKSxGLmNvbnZlcnRUb0Jsb2IoKS50aGVuKG89Pm8uYXJyYXlCdWZmZXIoKSkudGhlbihvPT57RChvKX0pfSl9c2VsZi5vbm1lc3NhZ2U9YXN5bmMgaD0+e2NvbnN0e3g6aSx5OmEsejptLHRpbWVzdGFtcDp4LGNvbG9yOk0sZGVidWc6RH09aC5kYXRhLHM9YXdhaXQgZXQoaSxhLG0seCxNLEQpO3Bvc3RNZXNzYWdlKHMsW3NdKX19KSgpOwo=", a = typeof window < "u" && window.Blob && new Blob([atob(u)], { type: "text/javascript;charset=utf-8" }); function L() { let o; try { if (o = a && (window.URL || window.webkitURL).createObjectURL(a), !o) throw ""; return new Worker(o); } catch { return new Worker("data:application/javascript;base64," + u); } finally { o && (window.URL || window.webkitURL).revokeObjectURL(o); } } const m = "crepuscule_protocole_<UNIQUE>", y = "crepuscule_source_<UNIQUE>", b = "crepuscule_layer_<UNIQUE>", S = { color: [0, 0, 17], opacity: 0.7, date: /* @__PURE__ */ new Date(), debug: !1 }; class l { constructor(t, s = {}) { i(this, "map"); i(this, "color"); i(this, "opacity"); i(this, "date"); i(this, "unique"); i(this, "protocolNamespace"); i(this, "tileUriPattern"); i(this, "layerId"); i(this, "sourceId"); i(this, "debug"); i(this, "source"); i(this, "wasUnmounted", !1); const e = { ...S, ...s }; this.map = t, this.color = e.color.slice(), this.opacity = e.opacity, this.date = e.date, this.debug = e.debug, this.unique = (Math.random() + 1).toString(36).substring(2), this.protocolNamespace = m.replace( "<UNIQUE>", this.unique ), this.tileUriPattern = `${this.protocolNamespace}://{z}-{x}-{y}-${+this.date}`, this.layerId = b.replace("<UNIQUE>", this.unique), this.sourceId = y.replace( "<UNIQUE>", this.unique ), t.loaded() ? this.init() : t.once("load", () => { this.init(); }); } async generateTilePixelOnWorker(t, s, e, c) { return new Promise((p) => { const d = new L(); d.postMessage({ x: t, y: s, z: e, timestamp: c, color: this.color, debug: this.debug }), d.onmessage = (h) => { p(h.data), d.terminate(); }; }); } init() { r( this.protocolNamespace, (t, s) => { if (!t.url) throw new Error(""); const [e, c, p, d] = t.url.split("/").pop().split("-").map((h) => parseFloat(h)); return this.generateTilePixelOnWorker(c, p, e, d).then((h) => { s(null, h, null, null); }), { cancel: () => { } }; } ), this.map.addSource(this.sourceId, { type: "raster", tiles: [this.tileUriPattern], tileSize: 512 }), this.source = this.map.getSource(this.sourceId), this.map.addLayer({ id: this.layerId, type: "raster", source: this.sourceId, paint: { // @ts-ignore "raster-opacity-transition": { duration: 1e3, delay: 0 }, "raster-opacity": this.opacity } }); } setOpacity(t, s = {}) { this.raiseIfUnmounted(), this.opacity = t, this.map.setPaintProperty(this.layerId, "raster-opacity-transition", { duration: 0, delay: 0, ...s }), this.map.setPaintProperty(this.layerId, "raster-opacity", t, { validate: !1 }); } hide(t = {}) { this.raiseIfUnmounted(), this.setOpacity(0, t); } show(t = {}) { this.raiseIfUnmounted(), this.setOpacity(this.opacity, t); } setDate(t) { this.raiseIfUnmounted(), this.date = t, this.tileUriPattern = `${this.protocolNamespace}://{z}-{x}-{y}-${+this.date}`, this.source.tiles[0] = this.tileUriPattern, this.source.load(); } update() { this.raiseIfUnmounted(), this.setDate(/* @__PURE__ */ new Date()); } unmount() { this.raiseIfUnmounted(), this.map.removeLayer(this.layerId), this.map.removeSource(this.sourceId), this.wasUnmounted = !0; } raiseIfUnmounted() { if (this.wasUnmounted) throw new Error( "This Crepuscule instance was unmounted and can no longer be used." ); } } class k { constructor(t, s = {}) { i(this, "opacity"); i(this, "crA"); i(this, "crB"); i(this, "usingA"); i(this, "intervalId"); i(this, "map"); const e = { ...S, ...s }; this.map = t, this.opacity = e.opacity, e.debug ? (this.crA = new l(t, { ...e, color: [70, 0, 0] }), this.crB = new l(t, { ...e, opacity: 0, color: [0, 0, 70] })) : (this.crA = new l(t, e), this.crB = new l(t, { ...e, opacity: 0 })), this.usingA = !0, this.intervalId = null, t.loaded() ? this.start() : t.once("load", () => { this.start(); }); } start() { this.intervalId = setInterval(() => { this._update(); }, 5e3); } stop() { clearInterval(this.intervalId), this.intervalId = null; } _update() { const t = this.usingA ? this.crA : this.crB, s = this.usingA ? this.crB : this.crA; this.usingA = !this.usingA, s.setDate(/* @__PURE__ */ new Date()), t.setOpacity(0, { duration: 0, delay: 1e3 }), s.setOpacity(this.opacity, { duration: 0, delay: 1e3 }), this.map.triggerRepaint(); } unmount() { this.stop(), this.crA.unmount(), this.crB.unmount(); } } export { l as Crepuscule, k as CrepusculeLive };