diff --git a/package-lock.json b/package-lock.json index 794a898..72ceb11 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "devDependencies": { "@lucide/svelte": "^1.7.0", "@openmeteo/file-reader": "^0.0.15", - "@openmeteo/weather-map-layer": "github:open-meteo/weather-map-layer#e65e07029794285a64ec19f5f96e0e0c18a3e539", + "@openmeteo/weather-map-layer": "github:open-meteo/weather-map-layer#12cdd8f1b1316bf9345ab6276498a02c8134b5ad", "@sveltejs/adapter-static": "^3.0.8", "@sveltejs/kit": "^2.57.1", "@sveltejs/vite-plugin-svelte": "^7.0.0", @@ -675,8 +675,8 @@ }, "node_modules/@openmeteo/weather-map-layer": { "version": "0.0.19", - "resolved": "git+ssh://git@github.com/open-meteo/weather-map-layer.git#e65e07029794285a64ec19f5f96e0e0c18a3e539", - "integrity": "sha512-Ds6x5mYsa5XbYALlvoU2x8S9V1/6Y4oQjXy94qlsRoMGVIiMB3szxZpjx6z06DpUJdRvAzHiT1qXAPBXTrK9YQ==", + "resolved": "git+ssh://git@github.com/open-meteo/weather-map-layer.git#12cdd8f1b1316bf9345ab6276498a02c8134b5ad", + "integrity": "sha512-D9BiCF3Qyv8QQh3OQlPJUZ5MfXF9AzPnjjS011M9QcPU9Pab+VAd5/tXS5XCtEHd/irOx0V5AwSoC8roTcg9zQ==", "dev": true, "dependencies": { "@mapbox/tilebelt": "^2.0.3", diff --git a/package.json b/package.json index 2738194..94d61d0 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "devDependencies": { "@lucide/svelte": "^1.7.0", "@openmeteo/file-reader": "^0.0.15", - "@openmeteo/weather-map-layer": "github:open-meteo/weather-map-layer#e65e07029794285a64ec19f5f96e0e0c18a3e539", + "@openmeteo/weather-map-layer": "github:open-meteo/weather-map-layer#12cdd8f1b1316bf9345ab6276498a02c8134b5ad", "@sveltejs/adapter-static": "^3.0.8", "@sveltejs/kit": "^2.57.1", "@sveltejs/vite-plugin-svelte": "^7.0.0", diff --git a/src/lib/components/settings/isobands-settings.svelte b/src/lib/components/settings/isobands-settings.svelte new file mode 100644 index 0000000..5bf6b0f --- /dev/null +++ b/src/lib/components/settings/isobands-settings.svelte @@ -0,0 +1,34 @@ + + +
+

Isobands settings

+
+ { + updateUrl('isobands', String(isobands)); + changeOMfileURL(); + toast.info( + 'Isobands turned ' + + (isobands ? 'on' : 'off') + + (isobands ? ' (raster source disabled)' : '') + ); + }} + /> + +
+
diff --git a/src/lib/components/settings/settings.svelte b/src/lib/components/settings/settings.svelte index 9d137dc..f0c2687 100644 --- a/src/lib/components/settings/settings.svelte +++ b/src/lib/components/settings/settings.svelte @@ -7,6 +7,7 @@ import CacheSettings from './cache-settings.svelte'; import ContourSettings from './contour-settings.svelte'; import GridSettings from './grid-settings.svelte'; + import IsobandsSettings from './isobands-settings.svelte'; import OpacitySetting from './opacity-setting.svelte'; import PopupSettings from './popup-settings.svelte'; import StateSettings from './state-settings.svelte'; @@ -22,6 +23,7 @@ + diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 03b43cd..0489a7c 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -7,6 +7,7 @@ export const DEFAULT_VECTOR_OPTIONS = { grid: false, arrows: true, contours: false, + isobands: false, breakpoints: true, contourInterval: 2 }; diff --git a/src/lib/layers.ts b/src/lib/layers.ts index 6d92dff..ab30e51 100644 --- a/src/lib/layers.ts +++ b/src/lib/layers.ts @@ -206,6 +206,37 @@ const vectorContourLayer = (): SlotLayer => ({ } }); +const vectorIsobandFillLayer = (): SlotLayer => ({ + id: 'omVectorIsobandFillLayer', + opacityProp: 'fill-opacity', + commitOpacity: getRasterOpacity(), + add: (map, sourceId, layerId, beforeLayer) => { + const vectorOptions = get(vO); + if (!vectorOptions.isobands) return; + map.addLayer( + { + id: layerId, + type: 'fill', + source: sourceId, + 'source-layer': 'isobands', + paint: { + 'fill-opacity': 0, + 'fill-opacity-transition': { duration: 2, delay: 0 }, + 'fill-antialias': false, + 'fill-color': [ + 'rgba', + ['get', 'r'], + ['get', 'g'], + ['get', 'b'], + ['/', ['get', 'a'], 255] + ] + } + }, + beforeLayer + ); + } +}); + const vectorContourLabelsLayer = (): SlotLayer => ({ id: 'omVectorContourLayerLabels', opacityProp: 'text-opacity', @@ -271,17 +302,28 @@ export const createManagers = (): void => { toast.warning('Loading raster data might be limited by bandwidth or upstream server speed.') }); + const vectorOptions = get(vO); vectorManager = new SlotManager(map, { sourceIdPrefix: 'omVectorSource', beforeLayer: preferences.clipWater ? BEFORE_LAYER_VECTOR_WATER_CLIP : BEFORE_LAYER_VECTOR, layerFactory: () => [ + vectorIsobandFillLayer(), vectorArrowLayer(), vectorGridLayer(), vectorContourLayer(), vectorContourLabelsLayer() ], sourceSpec: (sourceUrl) => ({ url: sourceUrl, type: 'vector' }), - removeDelayMs: 250 + removeDelayMs: 250, + ...(vectorOptions.isobands + ? { + onCommit: () => { + loading.set(false); + refreshPopup(); + }, + onError: () => loading.set(false) + } + : {}) }); }; @@ -294,7 +336,8 @@ export const addOmFileLayers = (): void => { if (!map) return; const omUrl = getOMUrl(); createManagers(); - rasterManager?.update('om://' + omUrl); + const vectorOptions = get(vO); + if (!vectorOptions.isobands) rasterManager?.update('om://' + omUrl); vectorManager?.update('om://' + omUrl); }; @@ -314,6 +357,7 @@ export const changeOMfileURL = (vectorOnly = false, rasterOnly = false): void => ); rasterManager?.setBeforeLayer(preferences.hillshade ? HILLSHADE_LAYER : BEFORE_LAYER_RASTER); - if (!vectorOnly) rasterManager?.update('om://' + omUrl); + const vectorOptions = get(vO); + if (!vectorOnly && !vectorOptions.isobands) rasterManager?.update('om://' + omUrl); if (!rasterOnly) vectorManager?.update('om://' + omUrl); }; diff --git a/src/lib/stores/vector.ts b/src/lib/stores/vector.ts index 0bd2f14..ab8d004 100644 --- a/src/lib/stores/vector.ts +++ b/src/lib/stores/vector.ts @@ -8,6 +8,7 @@ export interface VectorOptions { grid: boolean; arrows: boolean; contours: boolean; + isobands: boolean; breakpoints: boolean; contourInterval: number; } diff --git a/src/lib/url.ts b/src/lib/url.ts index 5a2ae91..6ef4f2e 100644 --- a/src/lib/url.ts +++ b/src/lib/url.ts @@ -177,6 +177,7 @@ export const getOMUrl = () => { if (vectorOptions.grid) result += '&grid=true'; if (vectorOptions.arrows) result += '&arrows=true'; if (vectorOptions.contours) result += '&contours=true'; + if (vectorOptions.isobands) result += '&isobands=true'; if (vectorOptions.contours && !vectorOptions.breakpoints) result += `&intervals=${vectorOptions.contourInterval}`;