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}`;