@geoql/v-maplibre 2.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{arc-B_fAMcpz.js → arc-XYgM0NpD.js} +2 -2
- package/dist/{arc-B_fAMcpz.js.map → arc-XYgM0NpD.js.map} +1 -1
- package/dist/{bitmap-C_yi2tt7.js → bitmap-CEQZNyod.js} +2 -2
- package/dist/{bitmap-C_yi2tt7.js.map → bitmap-CEQZNyod.js.map} +1 -1
- package/dist/{cog-Cksxp4kb.js → cog-B3kQFMdO.js} +2 -2
- package/dist/{cog-Cksxp4kb.js.map → cog-B3kQFMdO.js.map} +1 -1
- package/dist/{column-CN436hkx.js → column-6Alyevco.js} +2 -2
- package/dist/{column-CN436hkx.js.map → column-6Alyevco.js.map} +1 -1
- package/dist/{contour-DJbs8Kf4.js → contour-D5irVPeN.js} +2 -2
- package/dist/{contour-DJbs8Kf4.js.map → contour-D5irVPeN.js.map} +1 -1
- package/dist/deckgl.js +1 -1
- package/dist/{generic-B-YSsfL2.js → generic-DXw_QGDp.js} +2 -2
- package/dist/{generic-B-YSsfL2.js.map → generic-DXw_QGDp.js.map} +1 -1
- package/dist/{geoarrow-path-4ompjoL_.js → geoarrow-path-tBmjWKYC.js} +2 -2
- package/dist/{geoarrow-path-4ompjoL_.js.map → geoarrow-path-tBmjWKYC.js.map} +1 -1
- package/dist/{geoarrow-polygon-DUlcZwlA.js → geoarrow-polygon-C2sWPrq6.js} +2 -2
- package/dist/{geoarrow-polygon-DUlcZwlA.js.map → geoarrow-polygon-C2sWPrq6.js.map} +1 -1
- package/dist/{geoarrow-scatterplot-Cd2DK-iz.js → geoarrow-scatterplot-BvvHZc7E.js} +2 -2
- package/dist/{geoarrow-scatterplot-Cd2DK-iz.js.map → geoarrow-scatterplot-BvvHZc7E.js.map} +1 -1
- package/dist/{geoarrow-solid-polygon-q14Ff9j9.js → geoarrow-solid-polygon-DPmDfwoY.js} +2 -2
- package/dist/{geoarrow-solid-polygon-q14Ff9j9.js.map → geoarrow-solid-polygon-DPmDfwoY.js.map} +1 -1
- package/dist/{geoarrow-text-DHvTakUd.js → geoarrow-text-DEFcoF0G.js} +2 -2
- package/dist/{geoarrow-text-DHvTakUd.js.map → geoarrow-text-DEFcoF0G.js.map} +1 -1
- package/dist/{geoarrow-trips-CwRSQdMU.js → geoarrow-trips-C9_EXHnn.js} +2 -2
- package/dist/{geoarrow-trips-CwRSQdMU.js.map → geoarrow-trips-C9_EXHnn.js.map} +1 -1
- package/dist/{geohash-DfnNENva.js → geohash-vWnSK76U.js} +2 -2
- package/dist/{geohash-DfnNENva.js.map → geohash-vWnSK76U.js.map} +1 -1
- package/dist/{geojson-BRWVICwI.js → geojson-CqnyNLW0.js} +2 -2
- package/dist/{geojson-BRWVICwI.js.map → geojson-CqnyNLW0.js.map} +1 -1
- package/dist/geotiff.js +1 -1
- package/dist/{great-circle-Da5XIa2p.js → great-circle-Bz8TvCiM.js} +2 -2
- package/dist/{great-circle-Da5XIa2p.js.map → great-circle-Bz8TvCiM.js.map} +1 -1
- package/dist/{grid-DKP8clpW.js → grid-B_D40N2N.js} +2 -2
- package/dist/{grid-DKP8clpW.js.map → grid-B_D40N2N.js.map} +1 -1
- package/dist/{grid-cell-CZ41kY8K.js → grid-cell-fa_NejcO.js} +2 -2
- package/dist/{grid-cell-CZ41kY8K.js.map → grid-cell-fa_NejcO.js.map} +1 -1
- package/dist/{h3-cluster-Cco_QCbU.js → h3-cluster-Cg0CEA_m.js} +2 -2
- package/dist/{h3-cluster-Cco_QCbU.js.map → h3-cluster-Cg0CEA_m.js.map} +1 -1
- package/dist/{h3-hexagon-BqvZfU5b.js → h3-hexagon-DkIZnQEf.js} +2 -2
- package/dist/{h3-hexagon-BqvZfU5b.js.map → h3-hexagon-DkIZnQEf.js.map} +1 -1
- package/dist/{heatmap-Bq7-L0jp.js → heatmap-D7R9nYug.js} +2 -2
- package/dist/{heatmap-Bq7-L0jp.js.map → heatmap-D7R9nYug.js.map} +1 -1
- package/dist/{hexagon-T0vesB_G.js → hexagon-Bl_UBlOT.js} +2 -2
- package/dist/{hexagon-T0vesB_G.js.map → hexagon-Bl_UBlOT.js.map} +1 -1
- package/dist/{icon-Bwm2m8b4.js → icon-Dm1fyRNM.js} +2 -2
- package/dist/{icon-Bwm2m8b4.js.map → icon-Dm1fyRNM.js.map} +1 -1
- package/dist/index.d.ts +15 -15
- package/dist/index.js +1 -1
- package/dist/lidar.js +1 -1
- package/dist/{line-2EN6ukkf.js → line-B77d8tio.js} +2 -2
- package/dist/{line-2EN6ukkf.js.map → line-B77d8tio.js.map} +1 -1
- package/dist/{mosaic-DUwBxfGg.js → mosaic-Bm1aKa0Q.js} +2 -2
- package/dist/{mosaic-DUwBxfGg.js.map → mosaic-Bm1aKa0Q.js.map} +1 -1
- package/dist/{multi-cog-B2kVLX90.js → multi-cog-D2ys9o3u.js} +2 -2
- package/dist/{multi-cog-B2kVLX90.js.map → multi-cog-D2ys9o3u.js.map} +1 -1
- package/dist/{mvt-q6iXzmEF.js → mvt-BUVHps3s.js} +2 -2
- package/dist/{mvt-q6iXzmEF.js.map → mvt-BUVHps3s.js.map} +1 -1
- package/dist/{path-CKCx5_Gi.js → path-CvxVK8wm.js} +2 -2
- package/dist/{path-CKCx5_Gi.js.map → path-CvxVK8wm.js.map} +1 -1
- package/dist/{point-cloud-C9zJxZDT.js → point-cloud-CSsO2nuJ.js} +2 -2
- package/dist/{point-cloud-C9zJxZDT.js.map → point-cloud-CSsO2nuJ.js.map} +1 -1
- package/dist/{polygon-DRpsvg1W.js → polygon-DAVE4LXH.js} +2 -2
- package/dist/{polygon-DRpsvg1W.js.map → polygon-DAVE4LXH.js.map} +1 -1
- package/dist/{quadkey-DfoG2hLL.js → quadkey-BAnxuF9T.js} +2 -2
- package/dist/{quadkey-DfoG2hLL.js.map → quadkey-BAnxuF9T.js.map} +1 -1
- package/dist/{s2-DlEDAkpJ.js → s2-Bv5MIwa9.js} +2 -2
- package/dist/{s2-DlEDAkpJ.js.map → s2-Bv5MIwa9.js.map} +1 -1
- package/dist/{scatterplot-B9zXE6Jf.js → scatterplot-aZig07ZM.js} +2 -2
- package/dist/{scatterplot-B9zXE6Jf.js.map → scatterplot-aZig07ZM.js.map} +1 -1
- package/dist/{scenegraph-BVXLw8Cw.js → scenegraph-WEtd4Tza.js} +2 -2
- package/dist/{scenegraph-BVXLw8Cw.js.map → scenegraph-WEtd4Tza.js.map} +1 -1
- package/dist/{screen-grid-Dgj0QdEI.js → screen-grid-Cp80FMUf.js} +2 -2
- package/dist/{screen-grid-Dgj0QdEI.js.map → screen-grid-Cp80FMUf.js.map} +1 -1
- package/dist/{simple-mesh-ypHRymUD.js → simple-mesh-DT1BC-Mz.js} +2 -2
- package/dist/{simple-mesh-ypHRymUD.js.map → simple-mesh-DT1BC-Mz.js.map} +1 -1
- package/dist/{solid-polygon-DyWHVxEO.js → solid-polygon-BxLiMNAC.js} +2 -2
- package/dist/{solid-polygon-DyWHVxEO.js.map → solid-polygon-BxLiMNAC.js.map} +1 -1
- package/dist/{terrain-D3LKaDfn.js → terrain-CPKUswLf.js} +2 -2
- package/dist/{terrain-D3LKaDfn.js.map → terrain-CPKUswLf.js.map} +1 -1
- package/dist/{text-C6lF4GFS.js → text-Qf7B4QNZ.js} +2 -2
- package/dist/{text-C6lF4GFS.js.map → text-Qf7B4QNZ.js.map} +1 -1
- package/dist/{tile-3d-DHzr5_s2.js → tile-3d-CbQInXbC.js} +2 -2
- package/dist/{tile-3d-DHzr5_s2.js.map → tile-3d-CbQInXbC.js.map} +1 -1
- package/dist/{tile-DqpbfgRL.js → tile-BxWRJ8QY.js} +2 -2
- package/dist/{tile-DqpbfgRL.js.map → tile-BxWRJ8QY.js.map} +1 -1
- package/dist/{trips-CchyX_8N.js → trips-CwzuAg1k.js} +2 -2
- package/dist/{trips-CchyX_8N.js.map → trips-CwzuAg1k.js.map} +1 -1
- package/dist/useDeckOverlay-CI56uIKH.js +2 -0
- package/dist/useDeckOverlay-CI56uIKH.js.map +1 -0
- package/dist/{wind-particle-Rs67QBQ9.js → wind-particle-D3y-A-W4.js} +2 -2
- package/dist/{wind-particle-Rs67QBQ9.js.map → wind-particle-D3y-A-W4.js.map} +1 -1
- package/dist/wind.js +1 -1
- package/dist/{wms-KlHzzqd3.js → wms-BEsf7XG6.js} +2 -2
- package/dist/{wms-KlHzzqd3.js.map → wms-BEsf7XG6.js.map} +1 -1
- package/dist/{zarr-Czf44Tqd.js → zarr-BWbq3Uwq.js} +2 -2
- package/dist/{zarr-Czf44Tqd.js.map → zarr-BWbq3Uwq.js.map} +1 -1
- package/package.json +12 -12
- package/dist/useDeckOverlay-GlkH_rvP.js +0 -2
- package/dist/useDeckOverlay-GlkH_rvP.js.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -465,12 +465,10 @@ type __VLS_Slots$7 = {} & {
|
|
|
465
465
|
default?: (props: typeof __VLS_1$7) => any;
|
|
466
466
|
};
|
|
467
467
|
declare const __VLS_base$7: import("vue").DefineComponent<__VLS_Props$3, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
468
|
-
click: (...args: any[]) => void;
|
|
469
|
-
mouseenter: (...args: any[]) => void;
|
|
470
|
-
mouseleave: (...args: any[]) => void;
|
|
471
468
|
touchcancel: (...args: any[]) => void;
|
|
472
469
|
touchend: (...args: any[]) => void;
|
|
473
470
|
touchstart: (...args: any[]) => void;
|
|
471
|
+
click: (...args: any[]) => void;
|
|
474
472
|
contextmenu: (...args: any[]) => void;
|
|
475
473
|
dblclick: (...args: any[]) => void;
|
|
476
474
|
mousemove: (...args: any[]) => void;
|
|
@@ -478,13 +476,13 @@ declare const __VLS_base$7: import("vue").DefineComponent<__VLS_Props$3, {}, {},
|
|
|
478
476
|
mousedown: (...args: any[]) => void;
|
|
479
477
|
mouseout: (...args: any[]) => void;
|
|
480
478
|
mouseover: (...args: any[]) => void;
|
|
479
|
+
mouseenter: (...args: any[]) => void;
|
|
480
|
+
mouseleave: (...args: any[]) => void;
|
|
481
481
|
}, string, import("vue").PublicProps, Readonly<__VLS_Props$3> & Readonly<{
|
|
482
|
-
onClick?: ((...args: any[]) => any) | undefined;
|
|
483
|
-
onMouseenter?: ((...args: any[]) => any) | undefined;
|
|
484
|
-
onMouseleave?: ((...args: any[]) => any) | undefined;
|
|
485
482
|
onTouchcancel?: ((...args: any[]) => any) | undefined;
|
|
486
483
|
onTouchend?: ((...args: any[]) => any) | undefined;
|
|
487
484
|
onTouchstart?: ((...args: any[]) => any) | undefined;
|
|
485
|
+
onClick?: ((...args: any[]) => any) | undefined;
|
|
488
486
|
onContextmenu?: ((...args: any[]) => any) | undefined;
|
|
489
487
|
onDblclick?: ((...args: any[]) => any) | undefined;
|
|
490
488
|
onMousemove?: ((...args: any[]) => any) | undefined;
|
|
@@ -492,6 +490,8 @@ declare const __VLS_base$7: import("vue").DefineComponent<__VLS_Props$3, {}, {},
|
|
|
492
490
|
onMousedown?: ((...args: any[]) => any) | undefined;
|
|
493
491
|
onMouseout?: ((...args: any[]) => any) | undefined;
|
|
494
492
|
onMouseover?: ((...args: any[]) => any) | undefined;
|
|
493
|
+
onMouseenter?: ((...args: any[]) => any) | undefined;
|
|
494
|
+
onMouseleave?: ((...args: any[]) => any) | undefined;
|
|
495
495
|
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
496
496
|
declare const __VLS_export$8: __VLS_WithSlots$7<typeof __VLS_base$7, __VLS_Slots$7>;
|
|
497
497
|
declare const _default$16: typeof __VLS_export$8;
|
|
@@ -844,10 +844,6 @@ type __VLS_Slots$2 = {} & {
|
|
|
844
844
|
default?: (props: typeof __VLS_3) => any;
|
|
845
845
|
};
|
|
846
846
|
declare const __VLS_base$2: import("vue").DefineComponent<__VLS_Props$2, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
847
|
-
dragstart: (...args: any[]) => void;
|
|
848
|
-
drag: (...args: any[]) => void;
|
|
849
|
-
dragend: (...args: any[]) => void;
|
|
850
|
-
click: (...args: any[]) => void;
|
|
851
847
|
loaded: (...args: any[]) => void;
|
|
852
848
|
error: (...args: any[]) => void;
|
|
853
849
|
load: (...args: any[]) => void;
|
|
@@ -874,6 +870,7 @@ declare const __VLS_base$2: import("vue").DefineComponent<__VLS_Props$2, {}, {},
|
|
|
874
870
|
touchmove: (...args: any[]) => void;
|
|
875
871
|
touchend: (...args: any[]) => void;
|
|
876
872
|
touchstart: (...args: any[]) => void;
|
|
873
|
+
click: (...args: any[]) => void;
|
|
877
874
|
contextmenu: (...args: any[]) => void;
|
|
878
875
|
dblclick: (...args: any[]) => void;
|
|
879
876
|
mousemove: (...args: any[]) => void;
|
|
@@ -890,6 +887,9 @@ declare const __VLS_base$2: import("vue").DefineComponent<__VLS_Props$2, {}, {},
|
|
|
890
887
|
rotatestart: (...args: any[]) => void;
|
|
891
888
|
rotate: (...args: any[]) => void;
|
|
892
889
|
rotateend: (...args: any[]) => void;
|
|
890
|
+
dragstart: (...args: any[]) => void;
|
|
891
|
+
drag: (...args: any[]) => void;
|
|
892
|
+
dragend: (...args: any[]) => void;
|
|
893
893
|
pitchstart: (...args: any[]) => void;
|
|
894
894
|
pitch: (...args: any[]) => void;
|
|
895
895
|
pitchend: (...args: any[]) => void;
|
|
@@ -898,10 +898,6 @@ declare const __VLS_base$2: import("vue").DefineComponent<__VLS_Props$2, {}, {},
|
|
|
898
898
|
cooperativegestureprevented: (...args: any[]) => void;
|
|
899
899
|
projectiontransition: (...args: any[]) => void;
|
|
900
900
|
}, string, import("vue").PublicProps, Readonly<__VLS_Props$2> & Readonly<{
|
|
901
|
-
onDragstart?: ((...args: any[]) => any) | undefined;
|
|
902
|
-
onDrag?: ((...args: any[]) => any) | undefined;
|
|
903
|
-
onDragend?: ((...args: any[]) => any) | undefined;
|
|
904
|
-
onClick?: ((...args: any[]) => any) | undefined;
|
|
905
901
|
onLoaded?: ((...args: any[]) => any) | undefined;
|
|
906
902
|
onError?: ((...args: any[]) => any) | undefined;
|
|
907
903
|
onLoad?: ((...args: any[]) => any) | undefined;
|
|
@@ -928,6 +924,7 @@ declare const __VLS_base$2: import("vue").DefineComponent<__VLS_Props$2, {}, {},
|
|
|
928
924
|
onTouchmove?: ((...args: any[]) => any) | undefined;
|
|
929
925
|
onTouchend?: ((...args: any[]) => any) | undefined;
|
|
930
926
|
onTouchstart?: ((...args: any[]) => any) | undefined;
|
|
927
|
+
onClick?: ((...args: any[]) => any) | undefined;
|
|
931
928
|
onContextmenu?: ((...args: any[]) => any) | undefined;
|
|
932
929
|
onDblclick?: ((...args: any[]) => any) | undefined;
|
|
933
930
|
onMousemove?: ((...args: any[]) => any) | undefined;
|
|
@@ -944,6 +941,9 @@ declare const __VLS_base$2: import("vue").DefineComponent<__VLS_Props$2, {}, {},
|
|
|
944
941
|
onRotatestart?: ((...args: any[]) => any) | undefined;
|
|
945
942
|
onRotate?: ((...args: any[]) => any) | undefined;
|
|
946
943
|
onRotateend?: ((...args: any[]) => any) | undefined;
|
|
944
|
+
onDragstart?: ((...args: any[]) => any) | undefined;
|
|
945
|
+
onDrag?: ((...args: any[]) => any) | undefined;
|
|
946
|
+
onDragend?: ((...args: any[]) => any) | undefined;
|
|
947
947
|
onPitchstart?: ((...args: any[]) => any) | undefined;
|
|
948
948
|
onPitch?: ((...args: any[]) => any) | undefined;
|
|
949
949
|
onPitchend?: ((...args: any[]) => any) | undefined;
|
|
@@ -1017,8 +1017,8 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {},
|
|
|
1017
1017
|
onOpen?: (() => any) | undefined;
|
|
1018
1018
|
onClose?: (() => any) | undefined;
|
|
1019
1019
|
}>, {
|
|
1020
|
-
coordinates: LngLatLike;
|
|
1021
1020
|
options: PopupOptions;
|
|
1021
|
+
coordinates: LngLatLike;
|
|
1022
1022
|
marker: Marker;
|
|
1023
1023
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
1024
1024
|
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{n as e,r as t,t as n}from"./symbols-DXKzIgbY.js";import{a as r,i,t as a}from"./useDeckOverlay-GlkH_rvP.js";import{Fragment as o,computed as s,createBlock as c,createCommentVNode as l,createElementBlock as u,createElementVNode as d,defineComponent as f,inject as p,nextTick as m,normalizeClass as h,normalizeStyle as g,onBeforeUnmount as _,onMounted as v,onUnmounted as y,onUpdated as b,openBlock as x,provide as S,ref as C,renderList as w,renderSlot as T,shallowRef as E,toDisplayString as D,useSlots as O,watch as k,withCtx as A}from"vue";import j,{AttributionControl as M,FullscreenControl as N,GeolocateControl as P,Map as F,Marker as I,NavigationControl as L,Popup as R,ScaleControl as z}from"maplibre-gl";import{PMTiles as B,Protocol as V}from"pmtiles";const H=f({__name:`VControlAttribution`,props:{options:{default:void 0},position:{default:`bottom-right`}},setup(e){let r={compact:!1,customAttribution:void 0},i=e,a=O(),o=t(n);v(()=>{s()});let s=()=>{let e=r;i.options&&(e={...i.options}),a&&a.default?.()&&(e.customAttribution=a.default()[0].children);let t=new M(e);o.value.addControl(t,i.position)};return(e,t)=>T(e.$slots,`default`)}}),U=f({__name:`VControlFullscreen`,props:{options:{default:void 0},position:{default:`top-left`}},setup(e){let r={container:void 0},i=e,a=t(n);v(()=>{o()});let o=()=>{let e=new N(i.options||r);a.value.addControl(e,i.position)};return()=>{}}}),W=[`geolocate`,`error`,`outofmaxbounds`,`trackuserlocationstart`,`trackuserlocationend`],G=f({__name:`VControlGeolocate`,props:{options:{default:void 0},position:{default:`top-left`}},emits:W,setup(e,{emit:r}){let i={fitBoundsOptions:{linear:!1,offset:[0,0],maxZoom:22},positionOptions:{enableHighAccuracy:!0,maximumAge:0,timeout:6e3},trackUserLocation:!0,showAccuracyCircle:!0,showUserLocation:!0},a=e,o=r,s=t(n);v(()=>{c()});let c=()=>{let e=new P(a.options||i);s.value.addControl(e,a.position),W.forEach(t=>{e.on(t,()=>{o(t)})})};return()=>{}}}),ee=f({__name:`VControlNavigation`,props:{options:{default:void 0},position:{default:`top-left`}},setup(e){let t={showCompass:!0,showZoom:!0,visualizePitch:!0},r=e,i=p(n);v(()=>{a()});let a=()=>{let e=new L(r.options||t);i.value.addControl(e,r.position)};return()=>{}}}),te=f({__name:`VControlScale`,props:{options:{default:void 0},position:{default:`bottom-left`}},setup(e){let t={maxWidth:100,unit:`metric`},r=e,i=p(n);v(()=>{a()});let a=()=>{let e=new z(r.options||t);i?.value.addControl(e,r.position)};return(e,t)=>T(e.$slots,`default`)}});function K(e,t,n){let r=null,i=!1,a=()=>{i&&t.value&&!t.value.classList.contains(`maplibregl-ctrl`)&&t.value.classList.add(`maplibregl-ctrl`)};v(()=>{!e.value||!t.value||(r={onAdd:()=>(t.value?.classList.add(`maplibregl-ctrl`),t.value),onRemove:()=>{}},e.value.addControl(r,n),i=!0)}),b(()=>{a()}),y(()=>{if(e.value&&r)try{e.value.removeControl(r)}catch{}})}const ne={class:`v-layer-control-header`},re={class:`v-layer-control-title`},ie=[`aria-pressed`,`title`],ae={key:0,width:`16`,height:`16`,viewBox:`0 0 16 16`,fill:`none`},oe={key:1,width:`16`,height:`16`,viewBox:`0 0 16 16`,fill:`none`},se={class:`v-layer-control-slider-row`},ce=[`value`,`disabled`],le={class:`v-layer-control-value`},ue=f({__name:`VControlLayer`,props:{layerId:{},position:{default:`top-right`},visible:{type:Boolean,default:!0},opacity:{default:1},title:{default:`Layer Control`},layerType:{default:void 0}},emits:[`visibility-change`,`opacity-change`,`update:visible`,`update:opacity`],setup(e,{emit:r}){let i=e,o=r,s=t(n),c=p(a,null),l=C(null),f=C(i.visible),m=C(i.opacity);K(s,l,i.position);let g=()=>i.layerType?i.layerType:s.value?s.value.getLayer(i.layerId)?`maplibre`:c&&c.getLayers().find(e=>e.id===i.layerId)?`deckgl`:null:null,_=()=>{if(!s.value||g()!==`maplibre`)return null;let e=s.value.getLayer(i.layerId);if(!e)return null;switch(e.type){case`fill`:return`fill-opacity`;case`line`:return`line-opacity`;case`circle`:return`circle-opacity`;case`symbol`:return`icon-opacity`;default:return null}},y=e=>{let t=g();if(t===`maplibre`){if(!s.value)return;if(!s.value.getLayer(i.layerId)){console.warn(`MapLibre layer not found: ${i.layerId}`);return}s.value.setLayoutProperty(i.layerId,`visibility`,e?`visible`:`none`)}else if(t===`deckgl`){if(!c){console.warn(`deck.gl overlay not available for layer: ${i.layerId}`);return}let t=c.getLayers().find(e=>e.id===i.layerId);if(!t){console.warn(`deck.gl layer not found: ${i.layerId}`);return}if(typeof t.clone==`function`){let n=t.clone({visible:e});c.updateLayer(i.layerId,n)}}else{console.warn(`Layer not found in MapLibre or deck.gl: ${i.layerId}`);return}o(`visibility-change`,e),o(`update:visible`,e)},b=e=>{let t=g();if(t===`maplibre`){let t=_();if(!s.value||!t)return;if(!s.value.getLayer(i.layerId)){console.warn(`MapLibre layer not found: ${i.layerId}`);return}s.value.setPaintProperty(i.layerId,t,e)}else if(t===`deckgl`){if(!c){console.warn(`deck.gl overlay not available for layer: ${i.layerId}`);return}let t=c.getLayers().find(e=>e.id===i.layerId);if(!t){console.warn(`deck.gl layer not found: ${i.layerId}`);return}if(typeof t.clone==`function`){let n=t.clone({opacity:e});c.updateLayer(i.layerId,n)}}else{console.warn(`Layer not found in MapLibre or deck.gl: ${i.layerId}`);return}o(`opacity-change`,e),o(`update:opacity`,e)},S=()=>{f.value=!f.value},w=e=>{let t=e.target;m.value=Number(t.value)/100};return k(f,e=>{y(e)}),k(m,e=>{b(e)}),k(()=>i.visible,e=>{f.value=e}),k(()=>i.opacity,e=>{m.value=e}),v(()=>{let e=!1,t=()=>e?!0:g()?(e=!0,y(f.value),b(m.value),!0):!1;if(t())return;let n=[100,200,300,500,500,1e3,1e3,1e3,2e3,3e3],r=0,i=()=>{t()||r>=n.length||setTimeout(()=>{r++,i()},n[r])};i()}),(t,n)=>(x(),u(`div`,{ref_key:`containerRef`,ref:l,class:`v-layer-control`},[d(`div`,ne,[d(`span`,re,D(e.title),1),d(`button`,{type:`button`,class:h([`v-layer-control-toggle`,{"is-hidden":!f.value}]),"aria-pressed":f.value,title:f.value?`Hide layer`:`Show layer`,onClick:S},[f.value?(x(),u(`svg`,ae,[...n[0]||(n[0]=[d(`path`,{d:`M8 3C4.5 3 1.5 5.5 0.5 8C1.5 10.5 4.5 13 8 13C11.5 13 14.5 10.5 15.5 8C14.5 5.5 11.5 3 8 3Z`,stroke:`currentColor`,"stroke-width":`1.25`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,-1),d(`circle`,{cx:`8`,cy:`8`,r:`2.5`,stroke:`currentColor`,"stroke-width":`1.25`},null,-1)])])):(x(),u(`svg`,oe,[...n[1]||(n[1]=[d(`path`,{d:`M2 2L14 14M6.5 6.5C5.9 7.1 5.5 7.9 5.5 8.8C5.5 10.4 6.9 11.5 8 11.5C8.9 11.5 9.7 11.1 10.3 10.5M8 3C4.5 3 1.5 5.5 0.5 8C1 9.2 1.8 10.3 2.8 11.2M13.2 11.2C14.2 10.3 15 9.2 15.5 8C14.5 5.5 11.5 3 8 3`,stroke:`currentColor`,"stroke-width":`1.25`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,-1)])]))],10,ie)]),d(`div`,se,[d(`input`,{type:`range`,min:`0`,max:`100`,value:Math.round(m.value*100),class:`v-layer-control-slider`,disabled:!f.value,onInput:w},null,40,ce),d(`span`,le,D(Math.round(m.value*100))+`%`,1)]),T(t.$slots,`default`)],512))}}),de={class:`v-layer-group-title`},fe={key:1,class:`v-layer-group-header is-static`},pe={class:`v-layer-group-title`},me={key:2,class:`v-layer-group-content`},he={class:`v-layer-group-item-header`},ge={class:`v-layer-group-item-title`},_e=[`aria-pressed`,`title`,`onClick`],ve={key:0,width:`16`,height:`16`,viewBox:`0 0 16 16`,fill:`none`},ye={key:1,width:`16`,height:`16`,viewBox:`0 0 16 16`,fill:`none`},be={class:`v-layer-group-slider-row`},xe=[`value`,`disabled`,`onInput`],Se={class:`v-layer-group-value`},Ce=f({__name:`VControlLayerGroup`,props:{layers:{},position:{default:`top-right`},title:{default:`Layers`},collapsible:{type:Boolean,default:!0},collapsed:{type:Boolean,default:!1}},emits:[`visibility-change`,`opacity-change`,`update:layers`],setup(e,{emit:r}){let i=e,s=r,c=t(n),f=p(a,null),m=C(null),g=C(i.collapsed),_=C(new Map);K(c,m,i.position);let y=()=>{for(let e of i.layers)_.value.set(e.id,{visible:e.visible??!0,opacity:e.opacity??1})},b=(e,t)=>t||(c.value?c.value.getLayer(e)?`maplibre`:f&&f.getLayers().find(t=>t.id===e)?`deckgl`:null:null),S=e=>{if(!c.value)return null;let t=c.value.getLayer(e);if(!t)return null;switch(t.type){case`fill`:return`fill-opacity`;case`line`:return`line-opacity`;case`circle`:return`circle-opacity`;case`symbol`:return`icon-opacity`;case`raster`:return`raster-opacity`;default:return null}},E=(e,t,n)=>{let r=b(e,n);if(r===`maplibre`){if(!c.value)return;if(!c.value.getLayer(e)){console.warn(`[VControlLayerGroup] MapLibre layer not found: ${e}`);return}c.value.setLayoutProperty(e,`visibility`,t?`visible`:`none`)}else if(r===`deckgl`){if(!f){console.warn(`[VControlLayerGroup] deck.gl overlay not available for layer: ${e}`);return}let n=f.getLayers().find(t=>t.id===e);if(!n){console.warn(`[VControlLayerGroup] deck.gl layer not found: ${e}`);return}if(typeof n.clone==`function`){let r=n.clone({visible:t});f.updateLayer(e,r)}}else{console.warn(`[VControlLayerGroup] Layer not found: ${e}`);return}s(`visibility-change`,{layerId:e,visible:t})},O=(e,t,n)=>{let r=b(e,n);if(r===`maplibre`){let n=S(e);if(!c.value||!n)return;if(!c.value.getLayer(e)){console.warn(`[VControlLayerGroup] MapLibre layer not found: ${e}`);return}c.value.setPaintProperty(e,n,t)}else if(r===`deckgl`){if(!f){console.warn(`[VControlLayerGroup] deck.gl overlay not available for layer: ${e}`);return}let n=f.getLayers().find(t=>t.id===e);if(!n){console.warn(`[VControlLayerGroup] deck.gl layer not found: ${e}`);return}if(typeof n.clone==`function`){let r=n.clone({opacity:t});f.updateLayer(e,r)}}else{console.warn(`[VControlLayerGroup] Layer not found: ${e}`);return}s(`opacity-change`,{layerId:e,opacity:t})},A=e=>{let t=_.value.get(e.id);if(!t)return;let n=!t.visible;t.visible=n,E(e.id,n,e.type)},j=(e,t)=>{let n=t.target,r=Number(n.value)/100,i=_.value.get(e.id);i&&(i.opacity=r,O(e.id,r,e.type))},M=e=>_.value.get(e)??{visible:!0,opacity:1},N=()=>{i.collapsible&&(g.value=!g.value)};return k(()=>i.layers,()=>{y()},{deep:!0}),k(()=>i.collapsed,e=>{g.value=e}),v(()=>{y();for(let e of i.layers){let t=M(e.id);E(e.id,t.visible,e.type),O(e.id,t.opacity,e.type)}}),(t,n)=>(x(),u(`div`,{ref_key:`containerRef`,ref:m,class:h([`v-layer-group maplibregl-ctrl`,{"is-collapsed":g.value}])},[e.collapsible?(x(),u(`button`,{key:0,type:`button`,class:`v-layer-group-header`,onClick:N},[d(`span`,de,D(e.title),1),(x(),u(`svg`,{class:h([`v-layer-group-chevron`,{"is-collapsed":g.value}]),width:`14`,height:`14`,viewBox:`0 0 14 14`,fill:`none`},[...n[0]||(n[0]=[d(`path`,{d:`M3 5L7 9L11 5`,stroke:`currentColor`,"stroke-width":`1.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,-1)])],2))])):(x(),u(`div`,fe,[d(`span`,pe,D(e.title),1)])),g.value?l(`v-if`,!0):(x(),u(`div`,me,[(x(!0),u(o,null,w(e.layers,e=>(x(),u(`div`,{key:e.id,class:`v-layer-group-item`},[d(`div`,he,[d(`span`,ge,D(e.title),1),d(`button`,{type:`button`,class:h([`v-layer-group-toggle`,{"is-hidden":!M(e.id).visible}]),"aria-pressed":M(e.id).visible,title:M(e.id).visible?`Hide layer`:`Show layer`,onClick:t=>A(e)},[M(e.id).visible?(x(),u(`svg`,ve,[...n[1]||(n[1]=[d(`path`,{d:`M8 3C4.5 3 1.5 5.5 0.5 8C1.5 10.5 4.5 13 8 13C11.5 13 14.5 10.5 15.5 8C14.5 5.5 11.5 3 8 3Z`,stroke:`currentColor`,"stroke-width":`1.25`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,-1),d(`circle`,{cx:`8`,cy:`8`,r:`2.5`,stroke:`currentColor`,"stroke-width":`1.25`},null,-1)])])):(x(),u(`svg`,ye,[...n[2]||(n[2]=[d(`path`,{d:`M2 2L14 14M6.5 6.5C5.9 7.1 5.5 7.9 5.5 8.8C5.5 10.4 6.9 11.5 8 11.5C8.9 11.5 9.7 11.1 10.3 10.5M8 3C4.5 3 1.5 5.5 0.5 8C1 9.2 1.8 10.3 2.8 11.2M13.2 11.2C14.2 10.3 15 9.2 15.5 8C14.5 5.5 11.5 3 8 3`,stroke:`currentColor`,"stroke-width":`1.25`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,-1)])]))],10,_e)]),d(`div`,be,[d(`input`,{type:`range`,min:`0`,max:`100`,value:Math.round(M(e.id).opacity*100),class:`v-layer-group-slider`,disabled:!M(e.id).visible,onInput:t=>j(e,t)},null,40,xe),d(`span`,Se,D(Math.round(M(e.id).opacity*100))+`%`,1)])]))),128))])),T(t.$slots,`default`)],2))}}),we={class:`v-legend-control-title`},Te={key:0,class:`v-legend-control-content`},Ee=[`disabled`,`onClick`],De={class:`v-legend-control-label`},Oe={key:0,class:`v-legend-control-count`},ke={class:`v-legend-control-gradient-labels`},Ae={class:`v-legend-control-size-circle-wrap`},je={class:`v-legend-control-label`},Me={key:3,class:`v-legend-control-table`},Ne=[`title`],Pe={class:`v-legend-control-table-label`},Fe={class:`v-legend-control-table-value`},Ie=f({__name:`VControlLegend`,props:{layerIds:{},type:{default:`category`},items:{},position:{default:`top-right`},property:{},autoGenerate:{type:Boolean,default:!1},title:{default:`Legend`},collapsed:{type:Boolean,default:!1},interactive:{type:Boolean,default:!0}},emits:[`item-click`,`filter-change`,`update:filter`],setup(e,{emit:r}){let i=e,c=r,f=t(n),m=p(a,null),_=C(null),y=C(i.collapsed),b=C(new Map),S=C([]);K(f,_,i.position);let E=e=>{let t=[],n=e[e.length-1];for(let n=2;n<e.length-1;n+=2){let r=e[n],i=e[n+1];if(Array.isArray(r))for(let e of r)t.push({value:e,label:String(e),color:i,visible:!0});else t.push({value:r,label:String(r),color:i,visible:!0})}return t.length>0&&n&&typeof n==`string`&&t.push({value:`__default__`,label:`Other`,color:n,visible:!0}),t},O=e=>{let t=[],n=[],r=e[2];t.push(r);for(let r=3;r<e.length;r+=2){let i=e[r],a=e[r+1];n.push(i),t.push(a)}return n.length===0?null:{min:n[0],max:n[n.length-1],colors:t,stops:n}},A=e=>{let t=[],n=[];e[1]&&Array.isArray(e[1]);for(let r=3;r<e.length;r+=2){let i=e[r],a=e[r+1];n.push(i),t.push(a)}return n.length<2?null:{min:n[0],max:n[n.length-1],colors:t,stops:n}},j=()=>{if(!i.autoGenerate||!i.property||!f.value)return[];let e=i.layerIds[0];if(!e)return[];if(!f.value.getLayer(e))return console.warn(`[VControlLegend] Layer not found: ${e}`),[];let t=f.value.getPaintProperty(e,i.property);if(!t||!Array.isArray(t))return console.warn(`[VControlLegend] Paint property "${i.property}" not found or not an expression`),[];let n=t[0];if(n===`match`)return E(t);if(n===`step`){let e=O(t);return e?[e]:[]}if(n===`interpolate`||n===`interpolate-hcl`||n===`interpolate-lab`){let e=A(t);return e?[e]:[]}return console.warn(`[VControlLegend] Unsupported expression type: ${n}`),[]},M=s(()=>i.items&&i.items.length>0?i.items:S.value),N=s(()=>i.type===`category`?M.value.filter(e=>`value`in e&&`color`in e&&`label`in e):[]),P=s(()=>{if(i.type!==`gradient`)return null;let e=M.value;if(e.length===0)return null;let t=e[0];return`min`in t&&`max`in t&&`colors`in t?t:null}),F=s(()=>i.type===`size`?M.value.filter(e=>`size`in e&&`value`in e):[]),I=s(()=>i.type===`table`?M.value.filter(e=>`label`in e&&`color`in e&&`value`in e&&!(`size`in e)&&!(`visible`in e)).sort((e,t)=>t.value-e.value):[]),L=e=>e.formattedValue?e.formattedValue:`${e.value}${e.unit??``}`,R=s(()=>({visibleValues:Array.from(b.value.entries()).filter(([,e])=>e).map(([e])=>e)})),z=s(()=>P.value?`linear-gradient(to right, ${P.value.colors.join(`, `)})`:``),B=()=>{if(i.type===`category`)for(let e of N.value)b.value.set(e.value,e.visible??!0)},V=()=>{if(!f.value||!i.property||i.type!==`category`)return;let e=R.value.visibleValues.filter(e=>e!==`__default__`),t=N.value.map(e=>e.value).filter(e=>e!==`__default__`),n=e.length===t.length;for(let t of i.layerIds)if(f.value.getLayer(t))if(n)f.value.setFilter(t,null);else if(e.length===0)f.value.setFilter(t,[`==`,[`get`,`_never_match_`],!0]);else{let n=f.value.getPaintProperty(t,i.property);if(!n||!Array.isArray(n))continue;let r=n[1],a=null;Array.isArray(r)&&r[0]===`get`&&(a=r[1]),a&&f.value.setFilter(t,[`in`,[`get`,a],[`literal`,e]])}},H=()=>{if(!m||i.type!==`category`)return;let e=R.value.visibleValues.filter(e=>e!==`__default__`),t=N.value.map(e=>e.value).filter(e=>e!==`__default__`),n=e.length===t.length,r=m.getLayers();for(let t of i.layerIds){if(f.value?.getLayer(t))continue;let i=r.find(e=>e.id===t);if(i){if(!i.props?.extensions?.some(e=>e?.constructor?.name===`DataFilterExtension`)){console.warn(`[VControlLegend] deck.gl layer "${t}" requires DataFilterExtension for filtering. Add DataFilterExtension to layer extensions and configure getFilterValue accessor.`);continue}if(typeof i.clone==`function`)if(n){let e=i.clone({filterRange:[-1/0,1/0]});m.updateLayer(t,e)}else if(e.length===0){let e=i.clone({filterRange:[1/0,1/0]});m.updateLayer(t,e)}else{let n=e.map(e=>N.value.findIndex(t=>t.value===e)).filter(e=>e>=0);if(n.length>0){let e=Math.min(...n),r=Math.max(...n),a=i.clone({filterRange:[e-.5,r+.5]});m.updateLayer(t,a)}}}}},U=(e,t)=>{if(!i.interactive)return;let n=!(b.value.get(e.value)??!0);b.value.set(e.value,n),V(),H(),c(`item-click`,{item:e,index:t,visible:n}),c(`filter-change`,{filter:R.value,layerIds:i.layerIds}),c(`update:filter`,R.value)},W=e=>b.value.get(e.value)??!0,G=()=>{y.value=!y.value};return k(()=>i.items,()=>{B()},{deep:!0}),k(()=>i.collapsed,e=>{y.value=e}),v(()=>{i.autoGenerate&&(S.value=j()),B()}),(t,n)=>(x(),u(`div`,{ref_key:`containerRef`,ref:_,class:h([`v-legend-control`,{"is-collapsed":y.value}])},[d(`button`,{type:`button`,class:`v-legend-control-header`,onClick:G},[d(`span`,we,D(e.title),1),(x(),u(`svg`,{class:h([`v-legend-control-chevron`,{"is-collapsed":y.value}]),width:`14`,height:`14`,viewBox:`0 0 14 14`,fill:`none`},[...n[0]||(n[0]=[d(`path`,{d:`M3 5L7 9L11 5`,stroke:`currentColor`,"stroke-width":`1.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,-1)])],2))]),y.value?l(`v-if`,!0):(x(),u(`div`,Te,[e.type===`category`?(x(!0),u(o,{key:0},w(N.value,(t,n)=>(x(),u(`button`,{key:t.value,type:`button`,class:h([`v-legend-control-item`,{"is-interactive":e.interactive,"is-hidden":!W(t)}]),disabled:!e.interactive,onClick:e=>U(t,n)},[d(`span`,{class:`v-legend-control-swatch`,style:g({backgroundColor:t.color})},null,4),d(`span`,De,D(t.label),1),t.count===void 0?l(`v-if`,!0):(x(),u(`span`,Oe,D(t.count),1))],10,Ee))),128)):e.type===`gradient`&&P.value?(x(),u(o,{key:1},[d(`div`,{class:`v-legend-control-gradient`,style:g({background:z.value})},null,4),d(`div`,ke,[d(`span`,null,D(P.value.minLabel??P.value.min),1),d(`span`,null,D(P.value.maxLabel??P.value.max),1)])],64)):e.type===`size`?(x(!0),u(o,{key:2},w(F.value,e=>(x(),u(`div`,{key:e.value,class:`v-legend-control-size-item`},[d(`div`,Ae,[d(`div`,{class:`v-legend-control-size-circle`,style:g({width:`${Math.min(e.size,20)}px`,height:`${Math.min(e.size,20)}px`})},null,4)]),d(`span`,je,D(e.label),1)]))),128)):e.type===`table`?(x(),u(`div`,Me,[(x(!0),u(o,null,w(I.value,e=>(x(),u(`div`,{key:e.label,class:`v-legend-control-table-row`,title:e.description},[d(`span`,{class:`v-legend-control-swatch`,style:g({backgroundColor:e.color})},null,4),d(`span`,Pe,D(e.label),1),d(`span`,Fe,D(L(e)),1)],8,Ne))),128))])):l(`v-if`,!0)])),T(t.$slots,`default`)],2))}}),Le=f({__name:`VLayerMaplibreCanvas`,props:{source:{},layer:{},sourceId:{default:`maplibre.gl-canvas-source`},layerId:{default:`maplibre.gl-canvas-layer`},before:{default:``}},setup(e){let r=e,i=t(n),a=()=>i.value||null,o=C(!1),s=null,c=null,l=null,u=()=>{if(o.value)return!0;let e=a();if(!e||!e.isStyleLoaded())return!1;try{if(e.getSource(r.sourceId)||e.addSource(r.sourceId,r.source),!e.getLayer(r.layerId)){let t={...r.layer,id:r.layerId,source:r.sourceId};e.addLayer(t,r.before)}return o.value=!0,!0}catch(e){return console.error(`Error adding Canvas layer:`,e),!1}},d=e=>{s!==e&&(f(),s=e,c=()=>{u()},e.on(`style.load`,c),l=()=>{if(o.value){l&&s&&s.off(`idle`,l),l=null;return}u()},e.on(`idle`,l),u())},f=()=>{s&&(c&&s.off(`style.load`,c),l&&s.off(`idle`,l)),s=null,c=null,l=null};return k(()=>r.source,()=>{let e=a();if(e)try{e.getLayer(r.layerId)&&e.removeLayer(r.layerId),e.getSource(r.sourceId)&&e.removeSource(r.sourceId),e.addSource(r.sourceId,r.source);let t={...r.layer,id:r.layerId,source:r.sourceId};e.addLayer(t,r.before)}catch(e){console.error(`Error updating Canvas source:`,e)}},{deep:!0}),k(()=>r.layer,()=>{let e=a();if(e)try{e.getLayer(r.layerId)&&(Object.entries(r.layer.paint||{}).forEach(([t,n])=>{e.setPaintProperty(r.layerId,t,n)}),Object.entries(r.layer.layout||{}).forEach(([t,n])=>{e.setLayoutProperty(r.layerId,t,n)}))}catch(e){console.error(`Error updating Canvas layer:`,e)}},{deep:!0}),k(i,e=>{e?d(e):(f(),o.value=!1)},{immediate:!0}),v(()=>{u()}),_(()=>{f();let e=a();if(e)try{e.getLayer(r.layerId)&&e.removeLayer(r.layerId),e.getSource(r.sourceId)&&e.removeSource(r.sourceId)}catch(e){console.error(`Error cleaning up Canvas layer:`,e)}}),(e,t)=>T(e.$slots,`default`)}}),Re=f({__name:`VLayerMaplibreGeojson`,props:{sourceId:{default:`maplibre-gl-geojson-source`},layerId:{default:`maplibre-gl-geojson-layer`},source:{},layer:{},before:{default:``}},emits:[`on-click`],setup(e,{emit:r}){let i=e,a=r,o=t(n),s=e=>!e||typeof e==`string`?!1:e&&typeof e==`object`&&`type`in e?e.type===`FeatureCollection`&&`features`in e?e.features.length>0:e.type===`Feature`||e.type===`Point`||e.type===`LineString`||e.type===`Polygon`||e.type===`MultiPoint`||e.type===`MultiLineString`||e.type===`MultiPolygon`:!1,c=()=>o.value||null,l=C(!1),u=null,d=null,f=null,p=()=>{if(l.value)return!0;let e=c();if(!e||!e.isStyleLoaded()||!s(i.source.data))return!1;try{if(e.getSource(i.sourceId)||e.addSource(i.sourceId,i.source),!e.getLayer(i.layerId)){let t={...i.layer,id:i.layerId,source:i.sourceId};e.addLayer(t,i.before)}return x(e),l.value=!0,!0}catch(e){return console.error(`Error adding GeoJSON layer:`,e),!1}},h=e=>{u!==e&&(g(),u=e,d=()=>{p()},e.on(`style.load`,d),f=()=>{if(l.value){f&&u&&u.off(`idle`,f),f=null;return}p()},e.on(`idle`,f),p())},g=()=>{u&&(d&&u.off(`style.load`,d),f&&u.off(`idle`,f)),u=null,d=null,f=null},y=()=>{let e=c();if(e)try{let t=e.getSource(i.sourceId);if(t&&`setData`in t){let n=e.getStyle().layers.filter(e=>e.type!==`background`&&`source`in e&&e.source===i.sourceId);(n.length===0||n[0]?.id===i.layerId)&&t.setData(i.source.data)}else t||p()}catch(e){console.error(`Error updating GeoJSON source:`,e)}},b=()=>{let e=c();if(e)try{e.getLayer(i.layerId)?(Object.entries(i.layer.paint||{}).forEach(([t,n])=>{e.setPaintProperty(i.layerId,t,n)}),Object.entries(i.layer.layout||{}).forEach(([t,n])=>{e.setLayoutProperty(i.layerId,t,n)})):p()}catch(e){console.error(`Error updating GeoJSON layer:`,e)}},x=e=>{if(e)try{e.on(`click`,i.layerId,e=>{e.features&&e.features.length>0&&a(`on-click`,{features:e.features,coordinates:e.lngLat})}),e.on(`mouseenter`,i.layerId,()=>{e.getCanvas().style.cursor=`pointer`}),e.on(`mouseleave`,i.layerId,()=>{e.getCanvas().style.cursor=``})}catch(e){console.error(`Error in setupLayerEvents:`,e)}};return k(o,e=>{e?h(e):(g(),l.value=!1)},{immediate:!0}),k(()=>i.source.data,(e,t)=>{if(s(e)){if(!l.value){let e=c();e&&!u?h(e):p();return}JSON.stringify(e)!==JSON.stringify(t)&&y()}}),k(()=>i.layer,b,{deep:!0}),k(()=>i.layer.layout?.visibility,e=>{let t=c();if(!t||!t.isStyleLoaded())return;let n=t.getLayer(i.layerId);if(!n&&e===`visible`)s(i.source.data)&&p();else if(n)try{t.setLayoutProperty(i.layerId,`visibility`,e)}catch(e){console.error(`Error updating visibility for ${i.layerId}:`,e)}},{immediate:!0}),v(()=>{m(()=>{p()})}),_(()=>{g();let e=c();if(e)try{e.getLayer(i.layerId)&&e.removeLayer(i.layerId),e.getStyle().layers.filter(e=>e.type!==`background`&&`source`in e&&e.source===i.sourceId).length===0&&e.getSource(i.sourceId)&&e.removeSource(i.sourceId)}catch(e){console.error(`Error cleaning up GeoJSON layer:`,e)}}),(e,t)=>T(e.$slots,`default`)}}),ze=f({__name:`VLayerMaplibreImage`,props:{sourceId:{type:String,default:`maplibre.gl-image-source`,required:!0},layerId:{type:String,default:`maplibre.gl-image-layer`,required:!0},source:{type:Object,required:!0},layer:{type:Object,default:()=>({}),required:!0},before:{type:String,default:``,required:!1}},setup(e){let r=e,i=t(n),a=()=>i.value||null,o=C(!1),s=null,c=null,l=null,u=()=>{if(o.value)return!0;let e=a();if(!e||!e.isStyleLoaded())return!1;try{if(e.getSource(r.sourceId)||e.addSource(r.sourceId,r.source),!e.getLayer(r.layerId)){let t={...r.layer,id:r.layerId,source:r.sourceId};e.addLayer(t,r.before)}return o.value=!0,!0}catch(e){return console.error(`Error adding Image layer:`,e),!1}},d=e=>{s!==e&&(f(),s=e,c=()=>{u()},e.on(`style.load`,c),l=()=>{if(o.value){l&&s&&s.off(`idle`,l),l=null;return}u()},e.on(`idle`,l),u())},f=()=>{s&&(c&&s.off(`style.load`,c),l&&s.off(`idle`,l)),s=null,c=null,l=null};return k(()=>r.source,()=>{let e=a();if(e)try{let t=e.getSource(r.sourceId);if(t)if(t.updateImage)t.updateImage({url:r.source.url,coordinates:r.source.coordinates});else{e.getLayer(r.layerId)&&e.removeLayer(r.layerId),e.getSource(r.sourceId)&&e.removeSource(r.sourceId),e.addSource(r.sourceId,r.source);let t={...r.layer,id:r.layerId,source:r.sourceId};e.addLayer(t,r.before)}}catch(e){console.error(`Error updating Image source:`,e)}},{deep:!0}),k(()=>r.layer,()=>{let e=a();if(e)try{e.getLayer(r.layerId)&&(Object.entries(r.layer.paint||{}).forEach(([t,n])=>{e.setPaintProperty(r.layerId,t,n)}),Object.entries(r.layer.layout||{}).forEach(([t,n])=>{e.setLayoutProperty(r.layerId,t,n)}))}catch(e){console.error(`Error updating Image layer:`,e)}},{deep:!0}),k(i,e=>{e?d(e):(f(),o.value=!1)},{immediate:!0}),v(()=>{u()}),_(()=>{f();let e=a();if(e)try{e.getLayer(r.layerId)&&e.removeLayer(r.layerId),e.getSource(r.sourceId)&&e.removeSource(r.sourceId)}catch(e){console.error(`Error cleaning up Image layer:`,e)}}),(e,t)=>T(e.$slots,`default`)}}),q=f({__name:`VLayerMaplibreRaster`,props:{sourceId:{},source:{},layerId:{},layer:{},before:{}},setup(e){let r=e,i=t(n),a=()=>i.value||null,o=C(!1),s=null,c=null,l=null,u=()=>{if(o.value)return!0;let e=a();if(!e||!e.isStyleLoaded())return!1;try{return e.getSource(r.sourceId)||e.addSource(r.sourceId,r.source),e.getLayer(r.layerId)||(e.addLayer(r.layer,r.before),r.layer.layout?.visibility&&e.setLayoutProperty(r.layerId,`visibility`,r.layer.layout.visibility)),o.value=!0,!0}catch(e){return console.error(`[${r.layerId}] Error setting up layer:`,e),!1}},d=e=>{s!==e&&(f(),s=e,c=()=>{u()},e.on(`style.load`,c),l=()=>{if(o.value){l&&s&&s.off(`idle`,l),l=null;return}u()},e.on(`idle`,l),u())},f=()=>{s&&(c&&s.off(`style.load`,c),l&&s.off(`idle`,l)),s=null,c=null,l=null},p=()=>{let e=a();if(e)try{let t=r.before;e.getLayer(r.layerId)&&e.removeLayer(r.layerId),e.removeSource(r.sourceId),e.addSource(r.sourceId,r.source);let n={...r.layer,id:r.layerId,type:`raster`,source:r.sourceId};t&&e.getLayer(t)?e.addLayer(n,t):e.addLayer(n)}catch(e){console.error(`Error updating Raster source:`,e)}};return k(()=>r.source.tiles?.[0],(e,t)=>{e!==t&&p()}),k(()=>r.layer,()=>{let e=a();if(e)try{if(e.getLayer(r.layerId)){let t=r.layer.paint||{};Object.entries(t).forEach(([t,n])=>{e.setPaintProperty(r.layerId,t,n)});let n=r.layer.layout||{};Object.entries(n).forEach(([t,n])=>{e.setLayoutProperty(r.layerId,t,n)})}}catch(e){console.error(`Error updating Raster layer:`,e)}},{deep:!0}),k(i,e=>{e?d(e):(f(),o.value=!1)},{immediate:!0}),k(()=>r.layer.layout?.visibility,e=>{let t=a();if(t)if(t.getLayer(r.layerId))try{t.setLayoutProperty(r.layerId,`visibility`,e),e===`visible`&&r.before&&t.moveLayer(r.layerId,r.before)}catch(e){console.error(`[${r.layerId}] Error updating visibility:`,e)}else try{t.addLayer(r.layer,r.before)}catch(e){console.error(`[${r.layerId}] Error adding layer:`,e)}},{immediate:!0}),k(()=>r.before,e=>{let t=a();if(!(!t||!t.getLayer(r.layerId))&&r.layer.layout?.visibility===`visible`)try{console.log(`[${r.layerId}] Moving layer before:`,e),t.moveLayer(r.layerId,e)}catch(e){console.error(`[${r.layerId}] Error moving layer:`,e)}}),v(()=>{u()}),_(()=>{f()}),(e,t)=>T(e.$slots,`default`)}}),J=[`click`,`dblclick`,`mousedown`,`mouseup`,`mousemove`,`mouseenter`,`mouseleave`,`mouseover`,`mouseout`,`contextmenu`,`touchstart`,`touchend`,`touchcancel`],Y=`error.load.idle.remove.render.resize.webglcontextlost.webglcontextrestored.dataloading.data.tiledataloading.sourcedataloading.styledataloading.sourcedata.styledata.boxzoomcancel.boxzoomstart.boxzoomend.touchcancel.touchmove.touchend.touchstart.click.contextmenu.dblclick.mousemove.mouseup.mousedown.mouseout.mouseover.movestart.move.moveend.zoomstart.zoom.zoomend.rotatestart.rotate.rotateend.dragstart.drag.dragend.pitchstart.pitch.pitchend.wheel`.split(`.`),X=[`dragstart`,`drag`,`dragend`],Z=[`click`,`mouseenter`,`mouseleave`],Q=[`open`,`close`],Be=f({__name:`VLayerMaplibreVector`,props:{sourceId:{},source:{},layerId:{},layer:{},before:{}},emits:[...J],setup(e,{emit:r}){let i=e,a=r,o=t(n),s=()=>o.value||null,c=C(!1),l=null,u=null,d=null,f=()=>{if(c.value)return!0;let e=s();if(!e||!e.isStyleLoaded())return!1;try{return e.getSource(i.sourceId)||e.addSource(i.sourceId,i.source),e.getLayer(i.layerId)||(i.layer.layout?.visibility===`visible`?e.addLayer(i.layer,i.before):e.addLayer(i.layer)),y(e),c.value=!0,!0}catch(e){return console.error(`[${i.layerId}] Error setting up layer:`,e),!1}},p=e=>{l!==e&&(m(),l=e,u=()=>{f()},e.on(`style.load`,u),d=()=>{if(c.value){d&&l&&l.off(`idle`,d),d=null;return}f()},e.on(`idle`,d),f())},m=()=>{l&&(u&&l.off(`style.load`,u),d&&l.off(`idle`,d)),l=null,u=null,d=null},h=()=>{let e=s();if(e)try{let t=e.getSource(i.sourceId);if(t&&JSON.stringify(t.serialize())!==JSON.stringify(i.source)){e.getLayer(i.layerId)&&e.removeLayer(i.layerId),e.removeSource(i.sourceId),e.addSource(i.sourceId,i.source);let t={...i.layer,id:i.layerId,source:i.sourceId};e.addLayer(t,i.before)}}catch(e){console.error(`Error updating vector source:`,e)}},g=()=>{let e=s();if(e)try{if(e.getLayer(i.layerId)){let t=e.getLayer(i.layerId),n=t?.paint||{},r=t?.layout||{};Object.entries(i.layer.paint||{}).forEach(([t,r])=>{JSON.stringify(n[t])!==JSON.stringify(r)&&e.setPaintProperty(i.layerId,t,r)}),Object.entries(i.layer.layout||{}).forEach(([t,n])=>{JSON.stringify(r[t])!==JSON.stringify(n)&&e.setLayoutProperty(i.layerId,t,n)})}}catch(e){console.error(`Error updating vector layer:`,e)}},y=e=>{if(e)try{J.forEach(t=>{e.on(t,i.layerId,n=>{t===`mousemove`&&(e.getCanvas().style.cursor=`pointer`),t===`mouseleave`&&(e.getCanvas().style.cursor=``),a(t,n)})})}catch(e){console.error(`Error setting up layer events:`,e)}};return k(o,e=>{e?p(e):(m(),c.value=!1)},{immediate:!0}),k(()=>JSON.stringify(i.source.tiles),(e,t)=>{e!==t&&h()}),k(()=>({paint:i.layer.paint,layout:i.layer.layout?{...i.layer.layout,visibility:void 0}:void 0}),(e,t)=>{JSON.stringify(e)!==JSON.stringify(t)&&g()},{deep:!0}),k(()=>i.layer.layout?.visibility,e=>{let t=s();if(t)if(t.getLayer(i.layerId))try{t.setLayoutProperty(i.layerId,`visibility`,e),e===`visible`&&i.before&&setTimeout(()=>{t.moveLayer(i.layerId,i.before)},0)}catch(e){console.error(`[${i.layerId}] Error updating visibility:`,e)}else try{t.getSource(i.sourceId)||t.addSource(i.sourceId,i.source),t.addLayer(i.layer,i.before)}catch(e){console.error(`[${i.layerId}] Error adding layer:`,e)}},{immediate:!0}),k(()=>i.before,e=>{let t=s();if(!(!t||!t.getLayer(i.layerId))&&i.layer.layout?.visibility===`visible`)try{t.moveLayer(i.layerId,e)}catch(e){console.error(`Error reordering vector layer ${i.layerId}:`,e)}}),k(()=>i.layer.layout?.visibility,e=>{let t=s();if(t)if(t.getLayer(i.layerId))try{t.setLayoutProperty(i.layerId,`visibility`,e)}catch(e){console.error(`[${i.layerId}] Error updating visibility:`,e)}else try{t.getSource(i.sourceId)||t.addSource(i.sourceId,i.source),t.addLayer(i.layer,i.before)}catch(e){console.error(`[${i.layerId}] Error adding layer:`,e)}},{immediate:!0}),v(()=>{f()}),_(()=>{m()}),(e,t)=>T(e.$slots,`default`)}}),Ve=f({__name:`VLayerMaplibreVideo`,props:{sourceId:{type:String,default:`maplibre.gl-video-source`,required:!0},layerId:{type:String,default:`maplibre.gl-video-layer`,required:!0},source:{type:Object,required:!0},layer:{type:Object,default:()=>({}),required:!0},before:{type:String,default:``,required:!1}},setup(e){let r=e,i=t(n),a=()=>i.value||null,o=C(!1),s=null,c=null,l=null,u=()=>{if(o.value)return!0;let e=a();if(!e||!e.isStyleLoaded())return!1;try{if(e.getSource(r.sourceId)||e.addSource(r.sourceId,r.source),!e.getLayer(r.layerId)){let t={...r.layer,id:r.layerId,source:r.sourceId};e.addLayer(t,r.before)}return o.value=!0,!0}catch(e){return console.error(`Error adding Video layer:`,e),!1}},d=e=>{s!==e&&(f(),s=e,c=()=>{u()},e.on(`style.load`,c),l=()=>{if(o.value){l&&s&&s.off(`idle`,l),l=null;return}u()},e.on(`idle`,l),u())},f=()=>{s&&(c&&s.off(`style.load`,c),l&&s.off(`idle`,l)),s=null,c=null,l=null};return k(()=>r.source,()=>{let e=a();if(e)try{let t=e.getSource(r.sourceId);if(t){e.getLayer(r.layerId)&&e.removeLayer(r.layerId),e.getSource(r.sourceId)&&e.removeSource(r.sourceId),e.addSource(r.sourceId,r.source);let n={...r.layer,id:r.layerId,source:r.sourceId};if(e.addLayer(n,r.before),t.getVideo){let e=t.getVideo();e&&e.play().catch(e=>{console.error(`Error playing video:`,e)})}}}catch(e){console.error(`Error updating Video source:`,e)}},{deep:!0}),k(()=>r.layer,()=>{let e=a();if(e)try{e.getLayer(r.layerId)&&(Object.entries(r.layer.paint||{}).forEach(([t,n])=>{e.setPaintProperty(r.layerId,t,n)}),Object.entries(r.layer.layout||{}).forEach(([t,n])=>{e.setLayoutProperty(r.layerId,t,n)}))}catch(e){console.error(`Error updating Video layer:`,e)}},{deep:!0}),k(i,e=>{e?d(e):(f(),o.value=!1)},{immediate:!0}),v(()=>{u()}),_(()=>{f();let e=a();if(e)try{let t=e.getSource(r.sourceId);if(t?.getVideo){let e=t.getVideo();e&&(e.pause(),e.remove())}e.getLayer(r.layerId)&&e.removeLayer(r.layerId),e.getSource(r.sourceId)&&e.removeSource(r.sourceId)}catch(e){console.error(`Error cleaning up Video layer:`,e)}}),(e,t)=>T(e.$slots,`default`)}}),He=f({__name:`VLayerMaplibrePmtile`,props:{sourceId:{type:String,default:`maplibre.gl-pmtile-source`,required:!0},layerId:{type:String,default:`maplibre.gl-pmtile-layer`,required:!0},url:{type:String,required:!0},layer:{type:Object,default:()=>({}),required:!0},before:{type:String,default:``,required:!1}},setup(t){let n=t,r=p(e);if(!r)throw Error(`Protocol not provided`);let i=C({type:`raster`,url:`pmtiles://${n.url}`,tileSize:512,volatile:!0});return v(async()=>{let e=new B(n.url);r.add(e)}),(e,n)=>(x(),c(q,{"source-id":t.sourceId,"layer-id":t.layerId,source:i.value,layer:{...t.layer,type:`raster`},before:t.before},null,8,[`source-id`,`layer-id`,`source`,`layer`,`before`]))}}),Ue=f({__name:`VLayerMaplibreCluster`,props:{sourceId:{default:`cluster-source`},baseLayerId:{default:`cluster`},source:{},visibility:{type:Boolean,default:!0},clusterPaint:{default:()=>({colors:[`#51bbd6`,`#f1f075`,`#f28cb1`],radii:[20,30,40],breakpoints:[100,750]})},unclusteredPaint:{default:()=>({color:`#51bbd6`,radius:6})},textPaint:{default:()=>({color:`#ffffff`,font:[`DIN Offc Pro Medium`,`Arial Unicode MS Bold`],size:12})}},emits:[`cluster-click`,`point-click`],setup(e,{emit:r}){let i=e,a=r,o=t(n),c=C(!1),l=s(()=>`${i.baseLayerId}-clusters`),u=s(()=>`${i.baseLayerId}-cluster-count`),d=s(()=>`${i.baseLayerId}-unclustered-point`),f=()=>o.value||null,p=e=>typeof e==`string`?!1:e&&typeof e==`object`&&`type`in e&&e.type===`FeatureCollection`&&`features`in e?e.features.length>0:!1,m=()=>{let e=f();if(!(!e||!e.isStyleLoaded()))try{if(!e.getSource(i.sourceId))console.log(`Adding clustered source: ${i.sourceId}`),e.addSource(i.sourceId,{...i.source,cluster:!0,clusterMaxZoom:14,clusterRadius:50});else{let t=e.getSource(i.sourceId);t&&`setData`in t&&t.setData(i.source.data)}e.getLayer(l.value)||(console.log(`Adding clusters layer: ${l.value}`),e.addLayer({id:l.value,type:`circle`,source:i.sourceId,filter:[`has`,`point_count`],paint:{"circle-color":[`step`,[`get`,`point_count`],i.clusterPaint.colors[0],i.clusterPaint.breakpoints[0],i.clusterPaint.colors[1],i.clusterPaint.breakpoints[1],i.clusterPaint.colors[2]],"circle-radius":[`step`,[`get`,`point_count`],i.clusterPaint.radii[0],i.clusterPaint.breakpoints[0],i.clusterPaint.radii[1],i.clusterPaint.breakpoints[1],i.clusterPaint.radii[2]],"circle-stroke-width":2,"circle-stroke-color":`#ffffff`,"circle-opacity":.9},layout:{visibility:i.visibility?`visible`:`none`}})),e.getLayer(u.value)||(console.log(`Adding cluster count layer: ${u.value}`),e.addLayer({id:u.value,type:`symbol`,source:i.sourceId,filter:[`has`,`point_count`],layout:{"text-field":`{point_count_abbreviated}`,"text-font":i.textPaint.font,"text-size":i.textPaint.size,visibility:i.visibility?`visible`:`none`},paint:{"text-color":i.textPaint.color}})),e.getLayer(d.value)||(console.log(`Adding unclustered points layer: ${d.value}`),e.addLayer({id:d.value,type:`circle`,source:i.sourceId,filter:[`!`,[`has`,`point_count`]],paint:{"circle-color":i.unclusteredPaint.color,"circle-radius":i.unclusteredPaint.radius,"circle-stroke-width":2,"circle-stroke-color":`#ffffff`,"circle-opacity":.95},layout:{visibility:i.visibility?`visible`:`none`}})),console.log(`All cluster layers added for ${i.baseLayerId}`),y(e)}catch(e){console.error(`Error adding cluster layers:`,e)}},h=()=>{let e=f();if(e)try{let t=e.getSource(i.sourceId);t&&`setData`in t?(console.log(`Updating source ${i.sourceId} with data`),t.setData(i.source.data),setTimeout(()=>{m()},100)):t||m()}catch(e){console.error(`Error updating source:`,e)}},g=e=>{let t=f();if(!t)return;let n=e?`visible`:`none`;[l.value,u.value,d.value].forEach(e=>{t.getLayer(e)&&t.setLayoutProperty(e,`visibility`,n)})},y=e=>{if(e)try{e.on(`click`,l.value,e=>{e.features&&e.features.length>0&&a(`cluster-click`,{features:e.features,coordinates:e.lngLat})}),e.on(`click`,d.value,e=>{e.features&&e.features.length>0&&a(`point-click`,{features:e.features,coordinates:e.lngLat})}),[l.value,d.value].forEach(t=>{e.on(`mouseenter`,t,()=>{e.getCanvas().style.cursor=`pointer`}),e.on(`mouseleave`,t,()=>{e.getCanvas().style.cursor=``})})}catch(e){console.error(`Error setting up layer events:`,e)}},b=e=>{e&&(e.on(`style.load`,()=>{let t=()=>{e.isStyleLoaded()?(c.value=!0,p(i.source.data)&&m()):(c.value=!1,setTimeout(t,200))};t()}),e.isStyleLoaded()&&(c.value=!0,p(i.source.data)&&m()))};return k(()=>i.source.data,e=>{if(p(e)){let e=f();e?.isStyleLoaded()&&(e.getSource(i.sourceId)?h():m())}},{deep:!0,immediate:!0}),k(()=>i.visibility,g),k(o,e=>{e&&b(e)},{immediate:!0}),v(()=>{f()?.isStyleLoaded()&&p(i.source.data)&&m()}),_(()=>{let e=f();if(e)try{[l.value,d.value].forEach(t=>{e.off(`click`,t,()=>{}),e.off(`mouseenter`,t,()=>{}),e.off(`mouseleave`,t,()=>{})}),[l.value,u.value,d.value].forEach(t=>{e.getLayer(t)&&e.removeLayer(t)}),e.getSource(i.sourceId)&&e.removeSource(i.sourceId)}catch(e){console.error(`Error cleaning up cluster layers:`,e)}}),(e,t)=>T(e.$slots,`default`)}}),We=f({__name:`VLayerMaplibreRoute`,props:{id:{default:()=>`route-${Math.random().toString(36).slice(2,9)}`},coordinates:{},color:{default:`#4285F4`},width:{default:4},opacity:{default:1},lineCap:{default:`round`},lineJoin:{default:`round`},visible:{type:Boolean,default:!0},interactive:{type:Boolean,default:!0},before:{default:``},dashArray:{},blur:{default:0}},emits:[`click`,`mouseenter`,`mouseleave`],setup(e,{emit:r}){let i=e,a=r,o=t(n),c=C(!1),l=s(()=>`${i.id}-source`),u=s(()=>`${i.id}-layer`),d=s(()=>({type:`FeatureCollection`,features:i.coordinates.length>=2?[{type:`Feature`,properties:{},geometry:{type:`LineString`,coordinates:i.coordinates}}]:[]})),f=()=>o.value||null,p=e=>{e&&e.on(`style.load`,()=>{let t=()=>{e.isStyleLoaded()?c.value=!0:(c.value=!1,setTimeout(t,200))};t()})},m=()=>{let e=f();if(!(!e||!e.isStyleLoaded())&&!(i.coordinates.length<2))try{if(e.getSource(l.value)||e.addSource(l.value,{type:`geojson`,data:d.value}),!e.getLayer(u.value)){let t={id:u.value,type:`line`,source:l.value,layout:{"line-cap":i.lineCap,"line-join":i.lineJoin,visibility:i.visible?`visible`:`none`},paint:{"line-color":i.color,"line-width":i.width,"line-opacity":i.opacity,...i.blur>0&&{"line-blur":i.blur},...i.dashArray&&{"line-dasharray":i.dashArray}}};e.addLayer(t,i.before||void 0)}}catch(e){console.error(`Error adding route layer:`,e)}},h=()=>{let e=f();if(e)try{let t=e.getSource(l.value);t&&`setData`in t?t.setData(d.value):!t&&i.coordinates.length>=2&&m()}catch(e){console.error(`Error updating route source:`,e)}},g=()=>{let e=f();if(!(!e||!e.getLayer(u.value)))try{e.setPaintProperty(u.value,`line-color`,i.color),e.setPaintProperty(u.value,`line-width`,i.width),e.setPaintProperty(u.value,`line-opacity`,i.opacity),i.blur>0&&e.setPaintProperty(u.value,`line-blur`,i.blur),i.dashArray&&e.setPaintProperty(u.value,`line-dasharray`,i.dashArray),e.setLayoutProperty(u.value,`line-cap`,i.lineCap),e.setLayoutProperty(u.value,`line-join`,i.lineJoin),e.setLayoutProperty(u.value,`visibility`,i.visible?`visible`:`none`)}catch(e){console.error(`Error updating route layer style:`,e)}},y=e=>{if(!(!e||!i.interactive))try{e.on(`click`,u.value,e=>{a(`click`,{coordinates:e.lngLat})}),e.on(`mouseenter`,u.value,()=>{e.getCanvas().style.cursor=`pointer`,a(`mouseenter`)}),e.on(`mouseleave`,u.value,()=>{e.getCanvas().style.cursor=``,a(`mouseleave`)})}catch(e){console.error(`Error setting up route layer events:`,e)}};return k(()=>i.coordinates,()=>{let e=f();e?.isStyleLoaded()&&(e.getSource(l.value)?h():m())},{deep:!0}),k(()=>[i.color,i.width,i.opacity,i.lineCap,i.lineJoin,i.visible,i.blur,i.dashArray],()=>g(),{deep:!0}),k(o,e=>{e&&(p(e),e.isStyleLoaded()&&(c.value=!0))},{immediate:!0}),k(c,e=>{if(e&&i.coordinates.length>=2){let e=f();e&&(m(),y(e))}}),v(()=>{try{let e=f();e?.isStyleLoaded()&&i.coordinates.length>=2&&(m(),y(e))}catch(e){console.error(`Error mounting route layer:`,e)}}),_(()=>{let e=f();if(e)try{e.getLayer(u.value)&&e.removeLayer(u.value),e.getSource(l.value)&&e.removeSource(l.value)}catch(e){console.error(`Error cleaning up route layer:`,e)}}),(e,t)=>T(e.$slots,`default`)}}),Ge=f({__name:`VLayerMaplibreIsochrone`,props:{id:{default:()=>`isochrone-${Math.random().toString(36).slice(2,9)}`},data:{},fillOpacity:{default:.4},lineWidth:{default:2},lineOpacity:{default:.8},visible:{type:Boolean,default:!0},interactive:{type:Boolean,default:!0},before:{default:``},reverseOrder:{type:Boolean,default:!0}},emits:[`click`,`mouseenter`,`mouseleave`],setup(e,{emit:r}){let i=e,a=r,o=t(n),c=C(!1),l=C(!1),u=s(()=>`${i.id}-source`),d=s(()=>`${i.id}-fill`),f=s(()=>`${i.id}-line`),p=s(()=>!i.data||!i.data.features||i.data.features.length===0?null:{type:`FeatureCollection`,features:(i.reverseOrder?[...i.data.features].reverse():i.data.features).map(e=>({...e,properties:{...e.properties,fillColor:e.properties.color.startsWith(`#`)?e.properties.color:`#${e.properties.color}`}}))}),h=()=>o.value||null,g=e=>{e&&e.on(`style.load`,()=>{let t=()=>{e.isStyleLoaded()?c.value=!0:(c.value=!1,setTimeout(t,200))};t()})},y=()=>{let e=h();if(!e||!e.isStyleLoaded())return;let t=p.value;if(t)try{if(e.getSource(u.value)||e.addSource(u.value,{type:`geojson`,data:t}),!e.getLayer(d.value)){let t={id:d.value,type:`fill`,source:u.value,layout:{visibility:i.visible?`visible`:`none`},paint:{"fill-color":[`get`,`fillColor`],"fill-opacity":i.fillOpacity}};e.addLayer(t,i.before||void 0)}if(!e.getLayer(f.value)){let t={id:f.value,type:`line`,source:u.value,layout:{visibility:i.visible?`visible`:`none`},paint:{"line-color":[`get`,`fillColor`],"line-width":i.lineWidth,"line-opacity":i.lineOpacity}};e.addLayer(t,i.before||void 0)}}catch(e){console.error(`Error adding isochrone layers:`,e)}},b=()=>{let e=h();if(e)try{let t=e.getSource(u.value),n=p.value;t&&`setData`in t?n&&t.setData(n):!t&&n&&y()}catch(e){console.error(`Error updating isochrone source:`,e)}},x=()=>{let e=h();if(e)try{e.getLayer(d.value)&&(e.setPaintProperty(d.value,`fill-opacity`,i.fillOpacity),e.setLayoutProperty(d.value,`visibility`,i.visible?`visible`:`none`)),e.getLayer(f.value)&&(e.setPaintProperty(f.value,`line-width`,i.lineWidth),e.setPaintProperty(f.value,`line-opacity`,i.lineOpacity),e.setLayoutProperty(f.value,`visibility`,i.visible?`visible`:`none`))}catch(e){console.error(`Error updating isochrone layer style:`,e)}},S=e=>{if(!(!e||!i.interactive))try{e.on(`click`,d.value,e=>{e.features&&e.features.length>0&&a(`click`,{feature:e.features[0],coordinates:e.lngLat})}),e.on(`mouseenter`,d.value,t=>{e.getCanvas().style.cursor=`pointer`,t.features&&t.features.length>0&&a(`mouseenter`,t.features[0])}),e.on(`mouseleave`,d.value,()=>{e.getCanvas().style.cursor=``,a(`mouseleave`)})}catch(e){console.error(`Error setting up isochrone layer events:`,e)}},w=async()=>{if(l.value)return;let e=h();!e||!e.isStyleLoaded()||p.value&&(await m(),!l.value&&(y(),S(e),l.value=!0))};return k(()=>i.data,()=>{let e=h();e?.isStyleLoaded()&&(e.getSource(u.value)?b():y())},{deep:!0}),k(()=>[i.fillOpacity,i.lineWidth,i.lineOpacity,i.visible],()=>x(),{deep:!0}),k(c,e=>{e&&w()}),k(o,e=>{e&&(g(e),e.isStyleLoaded()&&(c.value=!0,w()))},{immediate:!0}),v(()=>{m(()=>{w()})}),_(()=>{let e=h();if(e)try{e.getLayer(f.value)&&e.removeLayer(f.value),e.getLayer(d.value)&&e.removeLayer(d.value),e.getSource(u.value)&&e.removeSource(u.value)}catch(e){console.error(`Error cleaning up isochrone layer:`,e)}}),(e,t)=>T(e.$slots,`default`)}});var Ke=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n};const qe=[`id`];var $=Ke(f({__name:`VMap`,props:{options:{default:()=>({container:`map`})},supportPmtiles:{type:Boolean,default:!1},projection:{default:`mercator`}},emits:[`loaded`,...Y],setup(t,{emit:r}){let a=t,o=r;if(a.supportPmtiles){let t=new V({metadata:!0});j.addProtocol(`pmtiles`,t.tile),S(e,t)}let s=E(null),c=C(!1),d=C(Y);S(n,s),i(s,{globe:a.projection===`globe`}),v(()=>{s.value=new F(a.options),c.value=!0,f()});let f=()=>{s.value&&d.value.forEach(e=>{s.value?.on(e,t=>{switch(e){case`load`:o(`loaded`,s.value);break;default:o(e,t);break}})})};return(e,n)=>(x(),u(`div`,{id:`${t.options?.container}`,class:`v-map-container`},[c.value?T(e.$slots,`default`,{key:0},()=>[T(e.$slots,`default`,{},void 0,!0)],!0):l(`v-if`,!0)],8,qe))}}),[[`__scopeId`,`data-v-2632eb0f`]]);const Je=[`id`],Ye=f({__name:`VPopup`,props:{options:{default:()=>({})},coordinates:{default:()=>({})},marker:{default:()=>({})}},emits:[`added`,`removed`,`open`,`close`],setup(e,{emit:r}){let i=e,a=r,o=t(n),s=new R(i.options),c=C(!0),l=C(null),d=()=>o.value||null,f=e=>{e&&e.on(`style.load`,()=>{let t=()=>{e.isStyleLoaded()?c.value=!0:(c.value=!1,setTimeout(t,200))};t()})},p=()=>{try{l.value&&s.setDOMContent(l.value)}catch(e){console.error(`Error setting popup content:`,e)}},m=()=>{try{s.setLngLat(i.coordinates)}catch(e){console.error(`Error setting popup coordinates:`,e)}},h=()=>{let e=d();if(e)try{`setPopup`in i.marker?i.marker.setPopup(s):s.addTo(e),a(`added`,{popup:s})}catch(e){console.error(`Error adding popup to marker:`,e)}},g=()=>{try{s.remove(),a(`removed`)}catch(e){console.error(`Error removing popup:`,e)}},y=()=>{try{Q.forEach(e=>{s.on(e,()=>{a(e)})})}catch(e){console.error(`Error setting up popup events:`,e)}},b=()=>{try{Q.forEach(e=>{s.off(e,()=>{a(e)})})}catch(e){console.error(`Error removing popup events:`,e)}};return k(o,e=>{e&&f(e)},{immediate:!0}),k(()=>i.coordinates,()=>{m()},{deep:!0}),v(()=>{if(c.value)try{p(),m(),h(),y()}catch(e){console.error(`Error initializing popup:`,e)}else g(),b()}),_(()=>{g(),b()}),(e,t)=>(x(),u(`section`,{id:`popup-${Date.now()}`,ref_key:`content`,ref:l},[T(e.$slots,`default`)],8,Je))}}),Xe=[`id`],Ze=f({__name:`VMarker`,props:{coordinates:{},options:{default:()=>({})},popupOptions:{default:()=>({})},cursor:{default:`pointer`}},emits:[`added`,`update:coordinates`,`removed`,...X,...Z],setup(e,{emit:r}){let i=O(),a=e,o=r,s=t(n),d=C(null),f=C(!0),p=C(!1),m=C(null),h=()=>s.value||null,g=e=>{e&&e.on(`style.load`,()=>{let t=()=>{e.isStyleLoaded()?f.value=!0:(f.value=!1,setTimeout(t,200))};t()})},y=e=>{e instanceof HTMLElement&&(m.value=e)},b=e=>{try{e.setLngLat(a.coordinates)}catch(e){console.error(`Error setting marker coordinates:`,e)}},S=e=>{try{e.getElement().style.cursor=a.cursor||`default`}catch(e){console.error(`Error setting cursor:`,e)}},w=e=>{let t=h();if(t)try{e.addTo(t),o(`added`,{marker:e})}catch(e){console.error(`Error adding marker to map:`,e)}},E=e=>{try{e.remove(),o(`removed`)}catch(e){console.error(`Error removing marker from map:`,e)}},D=e=>{try{let t;X.forEach(n=>{e.on(n,e=>{n===`dragend`&&(t=Array.isArray(a.coordinates)?[e.target.getLngLat().lng,e.target.getLngLat().lat]:e.target.getLngLat(),o(`update:coordinates`,t)),o(n,e)})}),Z.forEach(t=>{e.getElement().addEventListener(t,e=>{o(t,e)})})}catch(e){console.error(`Error setting up marker events:`,e)}};k(d,e=>{p.value=e!==null&&`_map`in e}),k(s,e=>{e&&g(e)},{immediate:!0});let j=e=>{if(!(!f.value||d.value))try{d.value=new I({...a.options,element:e||void 0}),b(d.value),w(d.value),S(d.value),D(d.value)}catch(e){console.error(`Error initializing marker:`,e)}};return k(m,e=>{e&&!d.value&&j(e)}),v(()=>{i.markers||j()}),_(()=>{d.value&&E(d.value)}),(t,n)=>(x(),u(`section`,{id:`marker-${Date.now()}`,class:`absolute`},[T(t.$slots,`markers`,{setRef:y}),p.value&&t.$slots.default?(x(),c(Ye,{key:0,marker:d.value,options:e.popupOptions,coordinates:e.coordinates},{default:A(()=>[T(t.$slots,`default`)]),_:3},8,[`marker`,`options`,`coordinates`])):l(`v-if`,!0)],8,Xe))}});var Qe=$;export{H as VControlAttribution,U as VControlFullscreen,G as VControlGeolocate,ue as VControlLayer,Ce as VControlLayerGroup,Ie as VControlLegend,ee as VControlNavigation,te as VControlScale,Le as VLayerMaplibreCanvas,Ue as VLayerMaplibreCluster,Re as VLayerMaplibreGeojson,ze as VLayerMaplibreImage,Ge as VLayerMaplibreIsochrone,He as VLayerMaplibrePmtile,q as VLayerMaplibreRaster,We as VLayerMaplibreRoute,Be as VLayerMaplibreVector,Ve as VLayerMaplibreVideo,$ as VMap,Ze as VMarker,Ye as VPopup,Qe as default,r as requirePeer};
|
|
1
|
+
import{n as e,r as t,t as n}from"./symbols-DXKzIgbY.js";import{a as r,i,t as a}from"./useDeckOverlay-CI56uIKH.js";import{Fragment as o,computed as s,createBlock as c,createCommentVNode as l,createElementBlock as u,createElementVNode as d,defineComponent as f,inject as p,nextTick as m,normalizeClass as h,normalizeStyle as g,onBeforeUnmount as _,onMounted as v,onUnmounted as y,onUpdated as b,openBlock as x,provide as S,ref as C,renderList as w,renderSlot as T,shallowRef as E,toDisplayString as D,useSlots as O,watch as k,withCtx as A}from"vue";import j,{AttributionControl as M,FullscreenControl as N,GeolocateControl as P,Map as F,Marker as I,NavigationControl as L,Popup as R,ScaleControl as z}from"maplibre-gl";import{PMTiles as B,Protocol as V}from"pmtiles";const H=f({__name:`VControlAttribution`,props:{options:{default:void 0},position:{default:`bottom-right`}},setup(e){let r={compact:!1,customAttribution:void 0},i=e,a=O(),o=t(n);v(()=>{s()});let s=()=>{let e=r;i.options&&(e={...i.options}),a&&a.default?.()&&(e.customAttribution=a.default()[0].children);let t=new M(e);o.value.addControl(t,i.position)};return(e,t)=>T(e.$slots,`default`)}}),U=f({__name:`VControlFullscreen`,props:{options:{default:void 0},position:{default:`top-left`}},setup(e){let r={container:void 0},i=e,a=t(n);v(()=>{o()});let o=()=>{let e=new N(i.options||r);a.value.addControl(e,i.position)};return()=>{}}}),W=[`geolocate`,`error`,`outofmaxbounds`,`trackuserlocationstart`,`trackuserlocationend`],G=f({__name:`VControlGeolocate`,props:{options:{default:void 0},position:{default:`top-left`}},emits:W,setup(e,{emit:r}){let i={fitBoundsOptions:{linear:!1,offset:[0,0],maxZoom:22},positionOptions:{enableHighAccuracy:!0,maximumAge:0,timeout:6e3},trackUserLocation:!0,showAccuracyCircle:!0,showUserLocation:!0},a=e,o=r,s=t(n);v(()=>{c()});let c=()=>{let e=new P(a.options||i);s.value.addControl(e,a.position),W.forEach(t=>{e.on(t,()=>{o(t)})})};return()=>{}}}),ee=f({__name:`VControlNavigation`,props:{options:{default:void 0},position:{default:`top-left`}},setup(e){let t={showCompass:!0,showZoom:!0,visualizePitch:!0},r=e,i=p(n);v(()=>{a()});let a=()=>{let e=new L(r.options||t);i.value.addControl(e,r.position)};return()=>{}}}),te=f({__name:`VControlScale`,props:{options:{default:void 0},position:{default:`bottom-left`}},setup(e){let t={maxWidth:100,unit:`metric`},r=e,i=p(n);v(()=>{a()});let a=()=>{let e=new z(r.options||t);i?.value.addControl(e,r.position)};return(e,t)=>T(e.$slots,`default`)}});function K(e,t,n){let r=null,i=!1,a=()=>{i&&t.value&&!t.value.classList.contains(`maplibregl-ctrl`)&&t.value.classList.add(`maplibregl-ctrl`)};v(()=>{!e.value||!t.value||(r={onAdd:()=>(t.value?.classList.add(`maplibregl-ctrl`),t.value),onRemove:()=>{}},e.value.addControl(r,n),i=!0)}),b(()=>{a()}),y(()=>{if(e.value&&r)try{e.value.removeControl(r)}catch{}})}const ne={class:`v-layer-control-header`},re={class:`v-layer-control-title`},ie=[`aria-pressed`,`title`],ae={key:0,width:`16`,height:`16`,viewBox:`0 0 16 16`,fill:`none`},oe={key:1,width:`16`,height:`16`,viewBox:`0 0 16 16`,fill:`none`},se={class:`v-layer-control-slider-row`},ce=[`value`,`disabled`],le={class:`v-layer-control-value`},ue=f({__name:`VControlLayer`,props:{layerId:{},position:{default:`top-right`},visible:{type:Boolean,default:!0},opacity:{default:1},title:{default:`Layer Control`},layerType:{default:void 0}},emits:[`visibility-change`,`opacity-change`,`update:visible`,`update:opacity`],setup(e,{emit:r}){let i=e,o=r,s=t(n),c=p(a,null),l=C(null),f=C(i.visible),m=C(i.opacity);K(s,l,i.position);let g=()=>i.layerType?i.layerType:s.value?s.value.getLayer(i.layerId)?`maplibre`:c&&c.getLayers().find(e=>e.id===i.layerId)?`deckgl`:null:null,_=()=>{if(!s.value||g()!==`maplibre`)return null;let e=s.value.getLayer(i.layerId);if(!e)return null;switch(e.type){case`fill`:return`fill-opacity`;case`line`:return`line-opacity`;case`circle`:return`circle-opacity`;case`symbol`:return`icon-opacity`;default:return null}},y=e=>{let t=g();if(t===`maplibre`){if(!s.value)return;if(!s.value.getLayer(i.layerId)){console.warn(`MapLibre layer not found: ${i.layerId}`);return}s.value.setLayoutProperty(i.layerId,`visibility`,e?`visible`:`none`)}else if(t===`deckgl`){if(!c){console.warn(`deck.gl overlay not available for layer: ${i.layerId}`);return}let t=c.getLayers().find(e=>e.id===i.layerId);if(!t){console.warn(`deck.gl layer not found: ${i.layerId}`);return}if(typeof t.clone==`function`){let n=t.clone({visible:e});c.updateLayer(i.layerId,n)}}else{console.warn(`Layer not found in MapLibre or deck.gl: ${i.layerId}`);return}o(`visibility-change`,e),o(`update:visible`,e)},b=e=>{let t=g();if(t===`maplibre`){let t=_();if(!s.value||!t)return;if(!s.value.getLayer(i.layerId)){console.warn(`MapLibre layer not found: ${i.layerId}`);return}s.value.setPaintProperty(i.layerId,t,e)}else if(t===`deckgl`){if(!c){console.warn(`deck.gl overlay not available for layer: ${i.layerId}`);return}let t=c.getLayers().find(e=>e.id===i.layerId);if(!t){console.warn(`deck.gl layer not found: ${i.layerId}`);return}if(typeof t.clone==`function`){let n=t.clone({opacity:e});c.updateLayer(i.layerId,n)}}else{console.warn(`Layer not found in MapLibre or deck.gl: ${i.layerId}`);return}o(`opacity-change`,e),o(`update:opacity`,e)},S=()=>{f.value=!f.value},w=e=>{let t=e.target;m.value=Number(t.value)/100};return k(f,e=>{y(e)}),k(m,e=>{b(e)}),k(()=>i.visible,e=>{f.value=e}),k(()=>i.opacity,e=>{m.value=e}),v(()=>{let e=!1,t=()=>e?!0:g()?(e=!0,y(f.value),b(m.value),!0):!1;if(t())return;let n=[100,200,300,500,500,1e3,1e3,1e3,2e3,3e3],r=0,i=()=>{t()||r>=n.length||setTimeout(()=>{r++,i()},n[r])};i()}),(t,n)=>(x(),u(`div`,{ref_key:`containerRef`,ref:l,class:`v-layer-control`},[d(`div`,ne,[d(`span`,re,D(e.title),1),d(`button`,{type:`button`,class:h([`v-layer-control-toggle`,{"is-hidden":!f.value}]),"aria-pressed":f.value,title:f.value?`Hide layer`:`Show layer`,onClick:S},[f.value?(x(),u(`svg`,ae,[...n[0]||(n[0]=[d(`path`,{d:`M8 3C4.5 3 1.5 5.5 0.5 8C1.5 10.5 4.5 13 8 13C11.5 13 14.5 10.5 15.5 8C14.5 5.5 11.5 3 8 3Z`,stroke:`currentColor`,"stroke-width":`1.25`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,-1),d(`circle`,{cx:`8`,cy:`8`,r:`2.5`,stroke:`currentColor`,"stroke-width":`1.25`},null,-1)])])):(x(),u(`svg`,oe,[...n[1]||(n[1]=[d(`path`,{d:`M2 2L14 14M6.5 6.5C5.9 7.1 5.5 7.9 5.5 8.8C5.5 10.4 6.9 11.5 8 11.5C8.9 11.5 9.7 11.1 10.3 10.5M8 3C4.5 3 1.5 5.5 0.5 8C1 9.2 1.8 10.3 2.8 11.2M13.2 11.2C14.2 10.3 15 9.2 15.5 8C14.5 5.5 11.5 3 8 3`,stroke:`currentColor`,"stroke-width":`1.25`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,-1)])]))],10,ie)]),d(`div`,se,[d(`input`,{type:`range`,min:`0`,max:`100`,value:Math.round(m.value*100),class:`v-layer-control-slider`,disabled:!f.value,onInput:w},null,40,ce),d(`span`,le,D(Math.round(m.value*100))+`%`,1)]),T(t.$slots,`default`)],512))}}),de={class:`v-layer-group-title`},fe={key:1,class:`v-layer-group-header is-static`},pe={class:`v-layer-group-title`},me={key:2,class:`v-layer-group-content`},he={class:`v-layer-group-item-header`},ge={class:`v-layer-group-item-title`},_e=[`aria-pressed`,`title`,`onClick`],ve={key:0,width:`16`,height:`16`,viewBox:`0 0 16 16`,fill:`none`},ye={key:1,width:`16`,height:`16`,viewBox:`0 0 16 16`,fill:`none`},be={class:`v-layer-group-slider-row`},xe=[`value`,`disabled`,`onInput`],Se={class:`v-layer-group-value`},Ce=f({__name:`VControlLayerGroup`,props:{layers:{},position:{default:`top-right`},title:{default:`Layers`},collapsible:{type:Boolean,default:!0},collapsed:{type:Boolean,default:!1}},emits:[`visibility-change`,`opacity-change`,`update:layers`],setup(e,{emit:r}){let i=e,s=r,c=t(n),f=p(a,null),m=C(null),g=C(i.collapsed),_=C(new Map);K(c,m,i.position);let y=()=>{for(let e of i.layers)_.value.set(e.id,{visible:e.visible??!0,opacity:e.opacity??1})},b=(e,t)=>t||(c.value?c.value.getLayer(e)?`maplibre`:f&&f.getLayers().find(t=>t.id===e)?`deckgl`:null:null),S=e=>{if(!c.value)return null;let t=c.value.getLayer(e);if(!t)return null;switch(t.type){case`fill`:return`fill-opacity`;case`line`:return`line-opacity`;case`circle`:return`circle-opacity`;case`symbol`:return`icon-opacity`;case`raster`:return`raster-opacity`;default:return null}},E=(e,t,n)=>{let r=b(e,n);if(r===`maplibre`){if(!c.value)return;if(!c.value.getLayer(e)){console.warn(`[VControlLayerGroup] MapLibre layer not found: ${e}`);return}c.value.setLayoutProperty(e,`visibility`,t?`visible`:`none`)}else if(r===`deckgl`){if(!f){console.warn(`[VControlLayerGroup] deck.gl overlay not available for layer: ${e}`);return}let n=f.getLayers().find(t=>t.id===e);if(!n){console.warn(`[VControlLayerGroup] deck.gl layer not found: ${e}`);return}if(typeof n.clone==`function`){let r=n.clone({visible:t});f.updateLayer(e,r)}}else{console.warn(`[VControlLayerGroup] Layer not found: ${e}`);return}s(`visibility-change`,{layerId:e,visible:t})},O=(e,t,n)=>{let r=b(e,n);if(r===`maplibre`){let n=S(e);if(!c.value||!n)return;if(!c.value.getLayer(e)){console.warn(`[VControlLayerGroup] MapLibre layer not found: ${e}`);return}c.value.setPaintProperty(e,n,t)}else if(r===`deckgl`){if(!f){console.warn(`[VControlLayerGroup] deck.gl overlay not available for layer: ${e}`);return}let n=f.getLayers().find(t=>t.id===e);if(!n){console.warn(`[VControlLayerGroup] deck.gl layer not found: ${e}`);return}if(typeof n.clone==`function`){let r=n.clone({opacity:t});f.updateLayer(e,r)}}else{console.warn(`[VControlLayerGroup] Layer not found: ${e}`);return}s(`opacity-change`,{layerId:e,opacity:t})},A=e=>{let t=_.value.get(e.id);if(!t)return;let n=!t.visible;t.visible=n,E(e.id,n,e.type)},j=(e,t)=>{let n=t.target,r=Number(n.value)/100,i=_.value.get(e.id);i&&(i.opacity=r,O(e.id,r,e.type))},M=e=>_.value.get(e)??{visible:!0,opacity:1},N=()=>{i.collapsible&&(g.value=!g.value)};return k(()=>i.layers,()=>{y()},{deep:!0}),k(()=>i.collapsed,e=>{g.value=e}),v(()=>{y();for(let e of i.layers){let t=M(e.id);E(e.id,t.visible,e.type),O(e.id,t.opacity,e.type)}}),(t,n)=>(x(),u(`div`,{ref_key:`containerRef`,ref:m,class:h([`v-layer-group maplibregl-ctrl`,{"is-collapsed":g.value}])},[e.collapsible?(x(),u(`button`,{key:0,type:`button`,class:`v-layer-group-header`,onClick:N},[d(`span`,de,D(e.title),1),(x(),u(`svg`,{class:h([`v-layer-group-chevron`,{"is-collapsed":g.value}]),width:`14`,height:`14`,viewBox:`0 0 14 14`,fill:`none`},[...n[0]||(n[0]=[d(`path`,{d:`M3 5L7 9L11 5`,stroke:`currentColor`,"stroke-width":`1.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,-1)])],2))])):(x(),u(`div`,fe,[d(`span`,pe,D(e.title),1)])),g.value?l(`v-if`,!0):(x(),u(`div`,me,[(x(!0),u(o,null,w(e.layers,e=>(x(),u(`div`,{key:e.id,class:`v-layer-group-item`},[d(`div`,he,[d(`span`,ge,D(e.title),1),d(`button`,{type:`button`,class:h([`v-layer-group-toggle`,{"is-hidden":!M(e.id).visible}]),"aria-pressed":M(e.id).visible,title:M(e.id).visible?`Hide layer`:`Show layer`,onClick:t=>A(e)},[M(e.id).visible?(x(),u(`svg`,ve,[...n[1]||(n[1]=[d(`path`,{d:`M8 3C4.5 3 1.5 5.5 0.5 8C1.5 10.5 4.5 13 8 13C11.5 13 14.5 10.5 15.5 8C14.5 5.5 11.5 3 8 3Z`,stroke:`currentColor`,"stroke-width":`1.25`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,-1),d(`circle`,{cx:`8`,cy:`8`,r:`2.5`,stroke:`currentColor`,"stroke-width":`1.25`},null,-1)])])):(x(),u(`svg`,ye,[...n[2]||(n[2]=[d(`path`,{d:`M2 2L14 14M6.5 6.5C5.9 7.1 5.5 7.9 5.5 8.8C5.5 10.4 6.9 11.5 8 11.5C8.9 11.5 9.7 11.1 10.3 10.5M8 3C4.5 3 1.5 5.5 0.5 8C1 9.2 1.8 10.3 2.8 11.2M13.2 11.2C14.2 10.3 15 9.2 15.5 8C14.5 5.5 11.5 3 8 3`,stroke:`currentColor`,"stroke-width":`1.25`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,-1)])]))],10,_e)]),d(`div`,be,[d(`input`,{type:`range`,min:`0`,max:`100`,value:Math.round(M(e.id).opacity*100),class:`v-layer-group-slider`,disabled:!M(e.id).visible,onInput:t=>j(e,t)},null,40,xe),d(`span`,Se,D(Math.round(M(e.id).opacity*100))+`%`,1)])]))),128))])),T(t.$slots,`default`)],2))}}),we={class:`v-legend-control-title`},Te={key:0,class:`v-legend-control-content`},Ee=[`disabled`,`onClick`],De={class:`v-legend-control-label`},Oe={key:0,class:`v-legend-control-count`},ke={class:`v-legend-control-gradient-labels`},Ae={class:`v-legend-control-size-circle-wrap`},je={class:`v-legend-control-label`},Me={key:3,class:`v-legend-control-table`},Ne=[`title`],Pe={class:`v-legend-control-table-label`},Fe={class:`v-legend-control-table-value`},Ie=f({__name:`VControlLegend`,props:{layerIds:{},type:{default:`category`},items:{},position:{default:`top-right`},property:{},autoGenerate:{type:Boolean,default:!1},title:{default:`Legend`},collapsed:{type:Boolean,default:!1},interactive:{type:Boolean,default:!0}},emits:[`item-click`,`filter-change`,`update:filter`],setup(e,{emit:r}){let i=e,c=r,f=t(n),m=p(a,null),_=C(null),y=C(i.collapsed),b=C(new Map),S=C([]);K(f,_,i.position);let E=e=>{let t=[],n=e[e.length-1];for(let n=2;n<e.length-1;n+=2){let r=e[n],i=e[n+1];if(Array.isArray(r))for(let e of r)t.push({value:e,label:String(e),color:i,visible:!0});else t.push({value:r,label:String(r),color:i,visible:!0})}return t.length>0&&n&&typeof n==`string`&&t.push({value:`__default__`,label:`Other`,color:n,visible:!0}),t},O=e=>{let t=[],n=[],r=e[2];t.push(r);for(let r=3;r<e.length;r+=2){let i=e[r],a=e[r+1];n.push(i),t.push(a)}return n.length===0?null:{min:n[0],max:n[n.length-1],colors:t,stops:n}},A=e=>{let t=[],n=[];e[1]&&Array.isArray(e[1]);for(let r=3;r<e.length;r+=2){let i=e[r],a=e[r+1];n.push(i),t.push(a)}return n.length<2?null:{min:n[0],max:n[n.length-1],colors:t,stops:n}},j=()=>{if(!i.autoGenerate||!i.property||!f.value)return[];let e=i.layerIds[0];if(!e)return[];if(!f.value.getLayer(e))return console.warn(`[VControlLegend] Layer not found: ${e}`),[];let t=f.value.getPaintProperty(e,i.property);if(!t||!Array.isArray(t))return console.warn(`[VControlLegend] Paint property "${i.property}" not found or not an expression`),[];let n=t[0];if(n===`match`)return E(t);if(n===`step`){let e=O(t);return e?[e]:[]}if(n===`interpolate`||n===`interpolate-hcl`||n===`interpolate-lab`){let e=A(t);return e?[e]:[]}return console.warn(`[VControlLegend] Unsupported expression type: ${n}`),[]},M=s(()=>i.items&&i.items.length>0?i.items:S.value),N=s(()=>i.type===`category`?M.value.filter(e=>`value`in e&&`color`in e&&`label`in e):[]),P=s(()=>{if(i.type!==`gradient`)return null;let e=M.value;if(e.length===0)return null;let t=e[0];return`min`in t&&`max`in t&&`colors`in t?t:null}),F=s(()=>i.type===`size`?M.value.filter(e=>`size`in e&&`value`in e):[]),I=s(()=>i.type===`table`?M.value.filter(e=>`label`in e&&`color`in e&&`value`in e&&!(`size`in e)&&!(`visible`in e)).sort((e,t)=>t.value-e.value):[]),L=e=>e.formattedValue?e.formattedValue:`${e.value}${e.unit??``}`,R=s(()=>({visibleValues:Array.from(b.value.entries()).filter(([,e])=>e).map(([e])=>e)})),z=s(()=>P.value?`linear-gradient(to right, ${P.value.colors.join(`, `)})`:``),B=()=>{if(i.type===`category`)for(let e of N.value)b.value.set(e.value,e.visible??!0)},V=()=>{if(!f.value||!i.property||i.type!==`category`)return;let e=R.value.visibleValues.filter(e=>e!==`__default__`),t=N.value.map(e=>e.value).filter(e=>e!==`__default__`),n=e.length===t.length;for(let t of i.layerIds)if(f.value.getLayer(t))if(n)f.value.setFilter(t,null);else if(e.length===0)f.value.setFilter(t,[`==`,[`get`,`_never_match_`],!0]);else{let n=f.value.getPaintProperty(t,i.property);if(!n||!Array.isArray(n))continue;let r=n[1],a=null;Array.isArray(r)&&r[0]===`get`&&(a=r[1]),a&&f.value.setFilter(t,[`in`,[`get`,a],[`literal`,e]])}},H=()=>{if(!m||i.type!==`category`)return;let e=R.value.visibleValues.filter(e=>e!==`__default__`),t=N.value.map(e=>e.value).filter(e=>e!==`__default__`),n=e.length===t.length,r=m.getLayers();for(let t of i.layerIds){if(f.value?.getLayer(t))continue;let i=r.find(e=>e.id===t);if(i){if(!i.props?.extensions?.some(e=>e?.constructor?.name===`DataFilterExtension`)){console.warn(`[VControlLegend] deck.gl layer "${t}" requires DataFilterExtension for filtering. Add DataFilterExtension to layer extensions and configure getFilterValue accessor.`);continue}if(typeof i.clone==`function`)if(n){let e=i.clone({filterRange:[-1/0,1/0]});m.updateLayer(t,e)}else if(e.length===0){let e=i.clone({filterRange:[1/0,1/0]});m.updateLayer(t,e)}else{let n=e.map(e=>N.value.findIndex(t=>t.value===e)).filter(e=>e>=0);if(n.length>0){let e=Math.min(...n),r=Math.max(...n),a=i.clone({filterRange:[e-.5,r+.5]});m.updateLayer(t,a)}}}}},U=(e,t)=>{if(!i.interactive)return;let n=!(b.value.get(e.value)??!0);b.value.set(e.value,n),V(),H(),c(`item-click`,{item:e,index:t,visible:n}),c(`filter-change`,{filter:R.value,layerIds:i.layerIds}),c(`update:filter`,R.value)},W=e=>b.value.get(e.value)??!0,G=()=>{y.value=!y.value};return k(()=>i.items,()=>{B()},{deep:!0}),k(()=>i.collapsed,e=>{y.value=e}),v(()=>{i.autoGenerate&&(S.value=j()),B()}),(t,n)=>(x(),u(`div`,{ref_key:`containerRef`,ref:_,class:h([`v-legend-control`,{"is-collapsed":y.value}])},[d(`button`,{type:`button`,class:`v-legend-control-header`,onClick:G},[d(`span`,we,D(e.title),1),(x(),u(`svg`,{class:h([`v-legend-control-chevron`,{"is-collapsed":y.value}]),width:`14`,height:`14`,viewBox:`0 0 14 14`,fill:`none`},[...n[0]||(n[0]=[d(`path`,{d:`M3 5L7 9L11 5`,stroke:`currentColor`,"stroke-width":`1.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,-1)])],2))]),y.value?l(`v-if`,!0):(x(),u(`div`,Te,[e.type===`category`?(x(!0),u(o,{key:0},w(N.value,(t,n)=>(x(),u(`button`,{key:t.value,type:`button`,class:h([`v-legend-control-item`,{"is-interactive":e.interactive,"is-hidden":!W(t)}]),disabled:!e.interactive,onClick:e=>U(t,n)},[d(`span`,{class:`v-legend-control-swatch`,style:g({backgroundColor:t.color})},null,4),d(`span`,De,D(t.label),1),t.count===void 0?l(`v-if`,!0):(x(),u(`span`,Oe,D(t.count),1))],10,Ee))),128)):e.type===`gradient`&&P.value?(x(),u(o,{key:1},[d(`div`,{class:`v-legend-control-gradient`,style:g({background:z.value})},null,4),d(`div`,ke,[d(`span`,null,D(P.value.minLabel??P.value.min),1),d(`span`,null,D(P.value.maxLabel??P.value.max),1)])],64)):e.type===`size`?(x(!0),u(o,{key:2},w(F.value,e=>(x(),u(`div`,{key:e.value,class:`v-legend-control-size-item`},[d(`div`,Ae,[d(`div`,{class:`v-legend-control-size-circle`,style:g({width:`${Math.min(e.size,20)}px`,height:`${Math.min(e.size,20)}px`})},null,4)]),d(`span`,je,D(e.label),1)]))),128)):e.type===`table`?(x(),u(`div`,Me,[(x(!0),u(o,null,w(I.value,e=>(x(),u(`div`,{key:e.label,class:`v-legend-control-table-row`,title:e.description},[d(`span`,{class:`v-legend-control-swatch`,style:g({backgroundColor:e.color})},null,4),d(`span`,Pe,D(e.label),1),d(`span`,Fe,D(L(e)),1)],8,Ne))),128))])):l(`v-if`,!0)])),T(t.$slots,`default`)],2))}}),Le=f({__name:`VLayerMaplibreCanvas`,props:{source:{},layer:{},sourceId:{default:`maplibre.gl-canvas-source`},layerId:{default:`maplibre.gl-canvas-layer`},before:{default:``}},setup(e){let r=e,i=t(n),a=()=>i.value||null,o=C(!1),s=null,c=null,l=null,u=()=>{if(o.value)return!0;let e=a();if(!e||!e.isStyleLoaded())return!1;try{if(e.getSource(r.sourceId)||e.addSource(r.sourceId,r.source),!e.getLayer(r.layerId)){let t={...r.layer,id:r.layerId,source:r.sourceId};e.addLayer(t,r.before)}return o.value=!0,!0}catch(e){return console.error(`Error adding Canvas layer:`,e),!1}},d=e=>{s!==e&&(f(),s=e,c=()=>{u()},e.on(`style.load`,c),l=()=>{if(o.value){l&&s&&s.off(`idle`,l),l=null;return}u()},e.on(`idle`,l),u())},f=()=>{s&&(c&&s.off(`style.load`,c),l&&s.off(`idle`,l)),s=null,c=null,l=null};return k(()=>r.source,()=>{let e=a();if(e)try{e.getLayer(r.layerId)&&e.removeLayer(r.layerId),e.getSource(r.sourceId)&&e.removeSource(r.sourceId),e.addSource(r.sourceId,r.source);let t={...r.layer,id:r.layerId,source:r.sourceId};e.addLayer(t,r.before)}catch(e){console.error(`Error updating Canvas source:`,e)}},{deep:!0}),k(()=>r.layer,()=>{let e=a();if(e)try{e.getLayer(r.layerId)&&(Object.entries(r.layer.paint||{}).forEach(([t,n])=>{e.setPaintProperty(r.layerId,t,n)}),Object.entries(r.layer.layout||{}).forEach(([t,n])=>{e.setLayoutProperty(r.layerId,t,n)}))}catch(e){console.error(`Error updating Canvas layer:`,e)}},{deep:!0}),k(i,e=>{e?d(e):(f(),o.value=!1)},{immediate:!0}),v(()=>{u()}),_(()=>{f();let e=a();if(e)try{e.getLayer(r.layerId)&&e.removeLayer(r.layerId),e.getSource(r.sourceId)&&e.removeSource(r.sourceId)}catch(e){console.error(`Error cleaning up Canvas layer:`,e)}}),(e,t)=>T(e.$slots,`default`)}}),Re=f({__name:`VLayerMaplibreGeojson`,props:{sourceId:{default:`maplibre-gl-geojson-source`},layerId:{default:`maplibre-gl-geojson-layer`},source:{},layer:{},before:{default:``}},emits:[`on-click`],setup(e,{emit:r}){let i=e,a=r,o=t(n),s=e=>!e||typeof e==`string`?!1:e&&typeof e==`object`&&`type`in e?e.type===`FeatureCollection`&&`features`in e?e.features.length>0:e.type===`Feature`||e.type===`Point`||e.type===`LineString`||e.type===`Polygon`||e.type===`MultiPoint`||e.type===`MultiLineString`||e.type===`MultiPolygon`:!1,c=()=>o.value||null,l=C(!1),u=null,d=null,f=null,p=()=>{if(l.value)return!0;let e=c();if(!e||!e.isStyleLoaded()||!s(i.source.data))return!1;try{if(e.getSource(i.sourceId)||e.addSource(i.sourceId,i.source),!e.getLayer(i.layerId)){let t={...i.layer,id:i.layerId,source:i.sourceId};e.addLayer(t,i.before)}return x(e),l.value=!0,!0}catch(e){return console.error(`Error adding GeoJSON layer:`,e),!1}},h=e=>{u!==e&&(g(),u=e,d=()=>{p()},e.on(`style.load`,d),f=()=>{if(l.value){f&&u&&u.off(`idle`,f),f=null;return}p()},e.on(`idle`,f),p())},g=()=>{u&&(d&&u.off(`style.load`,d),f&&u.off(`idle`,f)),u=null,d=null,f=null},y=()=>{let e=c();if(e)try{let t=e.getSource(i.sourceId);if(t&&`setData`in t){let n=e.getStyle().layers.filter(e=>e.type!==`background`&&`source`in e&&e.source===i.sourceId);(n.length===0||n[0]?.id===i.layerId)&&t.setData(i.source.data)}else t||p()}catch(e){console.error(`Error updating GeoJSON source:`,e)}},b=()=>{let e=c();if(e)try{e.getLayer(i.layerId)?(Object.entries(i.layer.paint||{}).forEach(([t,n])=>{e.setPaintProperty(i.layerId,t,n)}),Object.entries(i.layer.layout||{}).forEach(([t,n])=>{e.setLayoutProperty(i.layerId,t,n)})):p()}catch(e){console.error(`Error updating GeoJSON layer:`,e)}},x=e=>{if(e)try{e.on(`click`,i.layerId,e=>{e.features&&e.features.length>0&&a(`on-click`,{features:e.features,coordinates:e.lngLat})}),e.on(`mouseenter`,i.layerId,()=>{e.getCanvas().style.cursor=`pointer`}),e.on(`mouseleave`,i.layerId,()=>{e.getCanvas().style.cursor=``})}catch(e){console.error(`Error in setupLayerEvents:`,e)}};return k(o,e=>{e?h(e):(g(),l.value=!1)},{immediate:!0}),k(()=>i.source.data,(e,t)=>{if(s(e)){if(!l.value){let e=c();e&&!u?h(e):p();return}JSON.stringify(e)!==JSON.stringify(t)&&y()}}),k(()=>i.layer,b,{deep:!0}),k(()=>i.layer.layout?.visibility,e=>{let t=c();if(!t||!t.isStyleLoaded())return;let n=t.getLayer(i.layerId);if(!n&&e===`visible`)s(i.source.data)&&p();else if(n)try{t.setLayoutProperty(i.layerId,`visibility`,e)}catch(e){console.error(`Error updating visibility for ${i.layerId}:`,e)}},{immediate:!0}),v(()=>{m(()=>{p()})}),_(()=>{g();let e=c();if(e)try{e.getLayer(i.layerId)&&e.removeLayer(i.layerId),e.getStyle().layers.filter(e=>e.type!==`background`&&`source`in e&&e.source===i.sourceId).length===0&&e.getSource(i.sourceId)&&e.removeSource(i.sourceId)}catch(e){console.error(`Error cleaning up GeoJSON layer:`,e)}}),(e,t)=>T(e.$slots,`default`)}}),ze=f({__name:`VLayerMaplibreImage`,props:{sourceId:{type:String,default:`maplibre.gl-image-source`,required:!0},layerId:{type:String,default:`maplibre.gl-image-layer`,required:!0},source:{type:Object,required:!0},layer:{type:Object,default:()=>({}),required:!0},before:{type:String,default:``,required:!1}},setup(e){let r=e,i=t(n),a=()=>i.value||null,o=C(!1),s=null,c=null,l=null,u=()=>{if(o.value)return!0;let e=a();if(!e||!e.isStyleLoaded())return!1;try{if(e.getSource(r.sourceId)||e.addSource(r.sourceId,r.source),!e.getLayer(r.layerId)){let t={...r.layer,id:r.layerId,source:r.sourceId};e.addLayer(t,r.before)}return o.value=!0,!0}catch(e){return console.error(`Error adding Image layer:`,e),!1}},d=e=>{s!==e&&(f(),s=e,c=()=>{u()},e.on(`style.load`,c),l=()=>{if(o.value){l&&s&&s.off(`idle`,l),l=null;return}u()},e.on(`idle`,l),u())},f=()=>{s&&(c&&s.off(`style.load`,c),l&&s.off(`idle`,l)),s=null,c=null,l=null};return k(()=>r.source,()=>{let e=a();if(e)try{let t=e.getSource(r.sourceId);if(t)if(t.updateImage)t.updateImage({url:r.source.url,coordinates:r.source.coordinates});else{e.getLayer(r.layerId)&&e.removeLayer(r.layerId),e.getSource(r.sourceId)&&e.removeSource(r.sourceId),e.addSource(r.sourceId,r.source);let t={...r.layer,id:r.layerId,source:r.sourceId};e.addLayer(t,r.before)}}catch(e){console.error(`Error updating Image source:`,e)}},{deep:!0}),k(()=>r.layer,()=>{let e=a();if(e)try{e.getLayer(r.layerId)&&(Object.entries(r.layer.paint||{}).forEach(([t,n])=>{e.setPaintProperty(r.layerId,t,n)}),Object.entries(r.layer.layout||{}).forEach(([t,n])=>{e.setLayoutProperty(r.layerId,t,n)}))}catch(e){console.error(`Error updating Image layer:`,e)}},{deep:!0}),k(i,e=>{e?d(e):(f(),o.value=!1)},{immediate:!0}),v(()=>{u()}),_(()=>{f();let e=a();if(e)try{e.getLayer(r.layerId)&&e.removeLayer(r.layerId),e.getSource(r.sourceId)&&e.removeSource(r.sourceId)}catch(e){console.error(`Error cleaning up Image layer:`,e)}}),(e,t)=>T(e.$slots,`default`)}}),q=f({__name:`VLayerMaplibreRaster`,props:{sourceId:{},source:{},layerId:{},layer:{},before:{}},setup(e){let r=e,i=t(n),a=()=>i.value||null,o=C(!1),s=null,c=null,l=null,u=()=>{if(o.value)return!0;let e=a();if(!e||!e.isStyleLoaded())return!1;try{return e.getSource(r.sourceId)||e.addSource(r.sourceId,r.source),e.getLayer(r.layerId)||(e.addLayer(r.layer,r.before),r.layer.layout?.visibility&&e.setLayoutProperty(r.layerId,`visibility`,r.layer.layout.visibility)),o.value=!0,!0}catch(e){return console.error(`[${r.layerId}] Error setting up layer:`,e),!1}},d=e=>{s!==e&&(f(),s=e,c=()=>{u()},e.on(`style.load`,c),l=()=>{if(o.value){l&&s&&s.off(`idle`,l),l=null;return}u()},e.on(`idle`,l),u())},f=()=>{s&&(c&&s.off(`style.load`,c),l&&s.off(`idle`,l)),s=null,c=null,l=null},p=()=>{let e=a();if(e)try{let t=r.before;e.getLayer(r.layerId)&&e.removeLayer(r.layerId),e.removeSource(r.sourceId),e.addSource(r.sourceId,r.source);let n={...r.layer,id:r.layerId,type:`raster`,source:r.sourceId};t&&e.getLayer(t)?e.addLayer(n,t):e.addLayer(n)}catch(e){console.error(`Error updating Raster source:`,e)}};return k(()=>r.source.tiles?.[0],(e,t)=>{e!==t&&p()}),k(()=>r.layer,()=>{let e=a();if(e)try{if(e.getLayer(r.layerId)){let t=r.layer.paint||{};Object.entries(t).forEach(([t,n])=>{e.setPaintProperty(r.layerId,t,n)});let n=r.layer.layout||{};Object.entries(n).forEach(([t,n])=>{e.setLayoutProperty(r.layerId,t,n)})}}catch(e){console.error(`Error updating Raster layer:`,e)}},{deep:!0}),k(i,e=>{e?d(e):(f(),o.value=!1)},{immediate:!0}),k(()=>r.layer.layout?.visibility,e=>{let t=a();if(t)if(t.getLayer(r.layerId))try{t.setLayoutProperty(r.layerId,`visibility`,e),e===`visible`&&r.before&&t.moveLayer(r.layerId,r.before)}catch(e){console.error(`[${r.layerId}] Error updating visibility:`,e)}else try{t.addLayer(r.layer,r.before)}catch(e){console.error(`[${r.layerId}] Error adding layer:`,e)}},{immediate:!0}),k(()=>r.before,e=>{let t=a();if(!(!t||!t.getLayer(r.layerId))&&r.layer.layout?.visibility===`visible`)try{console.log(`[${r.layerId}] Moving layer before:`,e),t.moveLayer(r.layerId,e)}catch(e){console.error(`[${r.layerId}] Error moving layer:`,e)}}),v(()=>{u()}),_(()=>{f()}),(e,t)=>T(e.$slots,`default`)}}),J=[`click`,`dblclick`,`mousedown`,`mouseup`,`mousemove`,`mouseenter`,`mouseleave`,`mouseover`,`mouseout`,`contextmenu`,`touchstart`,`touchend`,`touchcancel`],Y=`error.load.idle.remove.render.resize.webglcontextlost.webglcontextrestored.dataloading.data.tiledataloading.sourcedataloading.styledataloading.sourcedata.styledata.boxzoomcancel.boxzoomstart.boxzoomend.touchcancel.touchmove.touchend.touchstart.click.contextmenu.dblclick.mousemove.mouseup.mousedown.mouseout.mouseover.movestart.move.moveend.zoomstart.zoom.zoomend.rotatestart.rotate.rotateend.dragstart.drag.dragend.pitchstart.pitch.pitchend.wheel`.split(`.`),X=[`dragstart`,`drag`,`dragend`],Z=[`click`,`mouseenter`,`mouseleave`],Q=[`open`,`close`],Be=f({__name:`VLayerMaplibreVector`,props:{sourceId:{},source:{},layerId:{},layer:{},before:{}},emits:[...J],setup(e,{emit:r}){let i=e,a=r,o=t(n),s=()=>o.value||null,c=C(!1),l=null,u=null,d=null,f=()=>{if(c.value)return!0;let e=s();if(!e||!e.isStyleLoaded())return!1;try{return e.getSource(i.sourceId)||e.addSource(i.sourceId,i.source),e.getLayer(i.layerId)||(i.layer.layout?.visibility===`visible`?e.addLayer(i.layer,i.before):e.addLayer(i.layer)),y(e),c.value=!0,!0}catch(e){return console.error(`[${i.layerId}] Error setting up layer:`,e),!1}},p=e=>{l!==e&&(m(),l=e,u=()=>{f()},e.on(`style.load`,u),d=()=>{if(c.value){d&&l&&l.off(`idle`,d),d=null;return}f()},e.on(`idle`,d),f())},m=()=>{l&&(u&&l.off(`style.load`,u),d&&l.off(`idle`,d)),l=null,u=null,d=null},h=()=>{let e=s();if(e)try{let t=e.getSource(i.sourceId);if(t&&JSON.stringify(t.serialize())!==JSON.stringify(i.source)){e.getLayer(i.layerId)&&e.removeLayer(i.layerId),e.removeSource(i.sourceId),e.addSource(i.sourceId,i.source);let t={...i.layer,id:i.layerId,source:i.sourceId};e.addLayer(t,i.before)}}catch(e){console.error(`Error updating vector source:`,e)}},g=()=>{let e=s();if(e)try{if(e.getLayer(i.layerId)){let t=e.getLayer(i.layerId),n=t?.paint||{},r=t?.layout||{};Object.entries(i.layer.paint||{}).forEach(([t,r])=>{JSON.stringify(n[t])!==JSON.stringify(r)&&e.setPaintProperty(i.layerId,t,r)}),Object.entries(i.layer.layout||{}).forEach(([t,n])=>{JSON.stringify(r[t])!==JSON.stringify(n)&&e.setLayoutProperty(i.layerId,t,n)})}}catch(e){console.error(`Error updating vector layer:`,e)}},y=e=>{if(e)try{J.forEach(t=>{e.on(t,i.layerId,n=>{t===`mousemove`&&(e.getCanvas().style.cursor=`pointer`),t===`mouseleave`&&(e.getCanvas().style.cursor=``),a(t,n)})})}catch(e){console.error(`Error setting up layer events:`,e)}};return k(o,e=>{e?p(e):(m(),c.value=!1)},{immediate:!0}),k(()=>JSON.stringify(i.source.tiles),(e,t)=>{e!==t&&h()}),k(()=>({paint:i.layer.paint,layout:i.layer.layout?{...i.layer.layout,visibility:void 0}:void 0}),(e,t)=>{JSON.stringify(e)!==JSON.stringify(t)&&g()},{deep:!0}),k(()=>i.layer.layout?.visibility,e=>{let t=s();if(t)if(t.getLayer(i.layerId))try{t.setLayoutProperty(i.layerId,`visibility`,e),e===`visible`&&i.before&&setTimeout(()=>{t.moveLayer(i.layerId,i.before)},0)}catch(e){console.error(`[${i.layerId}] Error updating visibility:`,e)}else try{t.getSource(i.sourceId)||t.addSource(i.sourceId,i.source),t.addLayer(i.layer,i.before)}catch(e){console.error(`[${i.layerId}] Error adding layer:`,e)}},{immediate:!0}),k(()=>i.before,e=>{let t=s();if(!(!t||!t.getLayer(i.layerId))&&i.layer.layout?.visibility===`visible`)try{t.moveLayer(i.layerId,e)}catch(e){console.error(`Error reordering vector layer ${i.layerId}:`,e)}}),k(()=>i.layer.layout?.visibility,e=>{let t=s();if(t)if(t.getLayer(i.layerId))try{t.setLayoutProperty(i.layerId,`visibility`,e)}catch(e){console.error(`[${i.layerId}] Error updating visibility:`,e)}else try{t.getSource(i.sourceId)||t.addSource(i.sourceId,i.source),t.addLayer(i.layer,i.before)}catch(e){console.error(`[${i.layerId}] Error adding layer:`,e)}},{immediate:!0}),v(()=>{f()}),_(()=>{m()}),(e,t)=>T(e.$slots,`default`)}}),Ve=f({__name:`VLayerMaplibreVideo`,props:{sourceId:{type:String,default:`maplibre.gl-video-source`,required:!0},layerId:{type:String,default:`maplibre.gl-video-layer`,required:!0},source:{type:Object,required:!0},layer:{type:Object,default:()=>({}),required:!0},before:{type:String,default:``,required:!1}},setup(e){let r=e,i=t(n),a=()=>i.value||null,o=C(!1),s=null,c=null,l=null,u=()=>{if(o.value)return!0;let e=a();if(!e||!e.isStyleLoaded())return!1;try{if(e.getSource(r.sourceId)||e.addSource(r.sourceId,r.source),!e.getLayer(r.layerId)){let t={...r.layer,id:r.layerId,source:r.sourceId};e.addLayer(t,r.before)}return o.value=!0,!0}catch(e){return console.error(`Error adding Video layer:`,e),!1}},d=e=>{s!==e&&(f(),s=e,c=()=>{u()},e.on(`style.load`,c),l=()=>{if(o.value){l&&s&&s.off(`idle`,l),l=null;return}u()},e.on(`idle`,l),u())},f=()=>{s&&(c&&s.off(`style.load`,c),l&&s.off(`idle`,l)),s=null,c=null,l=null};return k(()=>r.source,()=>{let e=a();if(e)try{let t=e.getSource(r.sourceId);if(t){e.getLayer(r.layerId)&&e.removeLayer(r.layerId),e.getSource(r.sourceId)&&e.removeSource(r.sourceId),e.addSource(r.sourceId,r.source);let n={...r.layer,id:r.layerId,source:r.sourceId};if(e.addLayer(n,r.before),t.getVideo){let e=t.getVideo();e&&e.play().catch(e=>{console.error(`Error playing video:`,e)})}}}catch(e){console.error(`Error updating Video source:`,e)}},{deep:!0}),k(()=>r.layer,()=>{let e=a();if(e)try{e.getLayer(r.layerId)&&(Object.entries(r.layer.paint||{}).forEach(([t,n])=>{e.setPaintProperty(r.layerId,t,n)}),Object.entries(r.layer.layout||{}).forEach(([t,n])=>{e.setLayoutProperty(r.layerId,t,n)}))}catch(e){console.error(`Error updating Video layer:`,e)}},{deep:!0}),k(i,e=>{e?d(e):(f(),o.value=!1)},{immediate:!0}),v(()=>{u()}),_(()=>{f();let e=a();if(e)try{let t=e.getSource(r.sourceId);if(t?.getVideo){let e=t.getVideo();e&&(e.pause(),e.remove())}e.getLayer(r.layerId)&&e.removeLayer(r.layerId),e.getSource(r.sourceId)&&e.removeSource(r.sourceId)}catch(e){console.error(`Error cleaning up Video layer:`,e)}}),(e,t)=>T(e.$slots,`default`)}}),He=f({__name:`VLayerMaplibrePmtile`,props:{sourceId:{type:String,default:`maplibre.gl-pmtile-source`,required:!0},layerId:{type:String,default:`maplibre.gl-pmtile-layer`,required:!0},url:{type:String,required:!0},layer:{type:Object,default:()=>({}),required:!0},before:{type:String,default:``,required:!1}},setup(t){let n=t,r=p(e);if(!r)throw Error(`Protocol not provided`);let i=C({type:`raster`,url:`pmtiles://${n.url}`,tileSize:512,volatile:!0});return v(async()=>{let e=new B(n.url);r.add(e)}),(e,n)=>(x(),c(q,{"source-id":t.sourceId,"layer-id":t.layerId,source:i.value,layer:{...t.layer,type:`raster`},before:t.before},null,8,[`source-id`,`layer-id`,`source`,`layer`,`before`]))}}),Ue=f({__name:`VLayerMaplibreCluster`,props:{sourceId:{default:`cluster-source`},baseLayerId:{default:`cluster`},source:{},visibility:{type:Boolean,default:!0},clusterPaint:{default:()=>({colors:[`#51bbd6`,`#f1f075`,`#f28cb1`],radii:[20,30,40],breakpoints:[100,750]})},unclusteredPaint:{default:()=>({color:`#51bbd6`,radius:6})},textPaint:{default:()=>({color:`#ffffff`,font:[`DIN Offc Pro Medium`,`Arial Unicode MS Bold`],size:12})}},emits:[`cluster-click`,`point-click`],setup(e,{emit:r}){let i=e,a=r,o=t(n),c=C(!1),l=s(()=>`${i.baseLayerId}-clusters`),u=s(()=>`${i.baseLayerId}-cluster-count`),d=s(()=>`${i.baseLayerId}-unclustered-point`),f=()=>o.value||null,p=e=>typeof e==`string`?!1:e&&typeof e==`object`&&`type`in e&&e.type===`FeatureCollection`&&`features`in e?e.features.length>0:!1,m=()=>{let e=f();if(!(!e||!e.isStyleLoaded()))try{if(!e.getSource(i.sourceId))console.log(`Adding clustered source: ${i.sourceId}`),e.addSource(i.sourceId,{...i.source,cluster:!0,clusterMaxZoom:14,clusterRadius:50});else{let t=e.getSource(i.sourceId);t&&`setData`in t&&t.setData(i.source.data)}e.getLayer(l.value)||(console.log(`Adding clusters layer: ${l.value}`),e.addLayer({id:l.value,type:`circle`,source:i.sourceId,filter:[`has`,`point_count`],paint:{"circle-color":[`step`,[`get`,`point_count`],i.clusterPaint.colors[0],i.clusterPaint.breakpoints[0],i.clusterPaint.colors[1],i.clusterPaint.breakpoints[1],i.clusterPaint.colors[2]],"circle-radius":[`step`,[`get`,`point_count`],i.clusterPaint.radii[0],i.clusterPaint.breakpoints[0],i.clusterPaint.radii[1],i.clusterPaint.breakpoints[1],i.clusterPaint.radii[2]],"circle-stroke-width":2,"circle-stroke-color":`#ffffff`,"circle-opacity":.9},layout:{visibility:i.visibility?`visible`:`none`}})),e.getLayer(u.value)||(console.log(`Adding cluster count layer: ${u.value}`),e.addLayer({id:u.value,type:`symbol`,source:i.sourceId,filter:[`has`,`point_count`],layout:{"text-field":`{point_count_abbreviated}`,"text-font":i.textPaint.font,"text-size":i.textPaint.size,visibility:i.visibility?`visible`:`none`},paint:{"text-color":i.textPaint.color}})),e.getLayer(d.value)||(console.log(`Adding unclustered points layer: ${d.value}`),e.addLayer({id:d.value,type:`circle`,source:i.sourceId,filter:[`!`,[`has`,`point_count`]],paint:{"circle-color":i.unclusteredPaint.color,"circle-radius":i.unclusteredPaint.radius,"circle-stroke-width":2,"circle-stroke-color":`#ffffff`,"circle-opacity":.95},layout:{visibility:i.visibility?`visible`:`none`}})),console.log(`All cluster layers added for ${i.baseLayerId}`),y(e)}catch(e){console.error(`Error adding cluster layers:`,e)}},h=()=>{let e=f();if(e)try{let t=e.getSource(i.sourceId);t&&`setData`in t?(console.log(`Updating source ${i.sourceId} with data`),t.setData(i.source.data),setTimeout(()=>{m()},100)):t||m()}catch(e){console.error(`Error updating source:`,e)}},g=e=>{let t=f();if(!t)return;let n=e?`visible`:`none`;[l.value,u.value,d.value].forEach(e=>{t.getLayer(e)&&t.setLayoutProperty(e,`visibility`,n)})},y=e=>{if(e)try{e.on(`click`,l.value,e=>{e.features&&e.features.length>0&&a(`cluster-click`,{features:e.features,coordinates:e.lngLat})}),e.on(`click`,d.value,e=>{e.features&&e.features.length>0&&a(`point-click`,{features:e.features,coordinates:e.lngLat})}),[l.value,d.value].forEach(t=>{e.on(`mouseenter`,t,()=>{e.getCanvas().style.cursor=`pointer`}),e.on(`mouseleave`,t,()=>{e.getCanvas().style.cursor=``})})}catch(e){console.error(`Error setting up layer events:`,e)}},b=e=>{e&&(e.on(`style.load`,()=>{let t=()=>{e.isStyleLoaded()?(c.value=!0,p(i.source.data)&&m()):(c.value=!1,setTimeout(t,200))};t()}),e.isStyleLoaded()&&(c.value=!0,p(i.source.data)&&m()))};return k(()=>i.source.data,e=>{if(p(e)){let e=f();e?.isStyleLoaded()&&(e.getSource(i.sourceId)?h():m())}},{deep:!0,immediate:!0}),k(()=>i.visibility,g),k(o,e=>{e&&b(e)},{immediate:!0}),v(()=>{f()?.isStyleLoaded()&&p(i.source.data)&&m()}),_(()=>{let e=f();if(e)try{[l.value,d.value].forEach(t=>{e.off(`click`,t,()=>{}),e.off(`mouseenter`,t,()=>{}),e.off(`mouseleave`,t,()=>{})}),[l.value,u.value,d.value].forEach(t=>{e.getLayer(t)&&e.removeLayer(t)}),e.getSource(i.sourceId)&&e.removeSource(i.sourceId)}catch(e){console.error(`Error cleaning up cluster layers:`,e)}}),(e,t)=>T(e.$slots,`default`)}}),We=f({__name:`VLayerMaplibreRoute`,props:{id:{default:()=>`route-${Math.random().toString(36).slice(2,9)}`},coordinates:{},color:{default:`#4285F4`},width:{default:4},opacity:{default:1},lineCap:{default:`round`},lineJoin:{default:`round`},visible:{type:Boolean,default:!0},interactive:{type:Boolean,default:!0},before:{default:``},dashArray:{},blur:{default:0}},emits:[`click`,`mouseenter`,`mouseleave`],setup(e,{emit:r}){let i=e,a=r,o=t(n),c=C(!1),l=s(()=>`${i.id}-source`),u=s(()=>`${i.id}-layer`),d=s(()=>({type:`FeatureCollection`,features:i.coordinates.length>=2?[{type:`Feature`,properties:{},geometry:{type:`LineString`,coordinates:i.coordinates}}]:[]})),f=()=>o.value||null,p=e=>{e&&e.on(`style.load`,()=>{let t=()=>{e.isStyleLoaded()?c.value=!0:(c.value=!1,setTimeout(t,200))};t()})},m=()=>{let e=f();if(!(!e||!e.isStyleLoaded())&&!(i.coordinates.length<2))try{if(e.getSource(l.value)||e.addSource(l.value,{type:`geojson`,data:d.value}),!e.getLayer(u.value)){let t={id:u.value,type:`line`,source:l.value,layout:{"line-cap":i.lineCap,"line-join":i.lineJoin,visibility:i.visible?`visible`:`none`},paint:{"line-color":i.color,"line-width":i.width,"line-opacity":i.opacity,...i.blur>0&&{"line-blur":i.blur},...i.dashArray&&{"line-dasharray":i.dashArray}}};e.addLayer(t,i.before||void 0)}}catch(e){console.error(`Error adding route layer:`,e)}},h=()=>{let e=f();if(e)try{let t=e.getSource(l.value);t&&`setData`in t?t.setData(d.value):!t&&i.coordinates.length>=2&&m()}catch(e){console.error(`Error updating route source:`,e)}},g=()=>{let e=f();if(!(!e||!e.getLayer(u.value)))try{e.setPaintProperty(u.value,`line-color`,i.color),e.setPaintProperty(u.value,`line-width`,i.width),e.setPaintProperty(u.value,`line-opacity`,i.opacity),i.blur>0&&e.setPaintProperty(u.value,`line-blur`,i.blur),i.dashArray&&e.setPaintProperty(u.value,`line-dasharray`,i.dashArray),e.setLayoutProperty(u.value,`line-cap`,i.lineCap),e.setLayoutProperty(u.value,`line-join`,i.lineJoin),e.setLayoutProperty(u.value,`visibility`,i.visible?`visible`:`none`)}catch(e){console.error(`Error updating route layer style:`,e)}},y=e=>{if(!(!e||!i.interactive))try{e.on(`click`,u.value,e=>{a(`click`,{coordinates:e.lngLat})}),e.on(`mouseenter`,u.value,()=>{e.getCanvas().style.cursor=`pointer`,a(`mouseenter`)}),e.on(`mouseleave`,u.value,()=>{e.getCanvas().style.cursor=``,a(`mouseleave`)})}catch(e){console.error(`Error setting up route layer events:`,e)}};return k(()=>i.coordinates,()=>{let e=f();e?.isStyleLoaded()&&(e.getSource(l.value)?h():m())},{deep:!0}),k(()=>[i.color,i.width,i.opacity,i.lineCap,i.lineJoin,i.visible,i.blur,i.dashArray],()=>g(),{deep:!0}),k(o,e=>{e&&(p(e),e.isStyleLoaded()&&(c.value=!0))},{immediate:!0}),k(c,e=>{if(e&&i.coordinates.length>=2){let e=f();e&&(m(),y(e))}}),v(()=>{try{let e=f();e?.isStyleLoaded()&&i.coordinates.length>=2&&(m(),y(e))}catch(e){console.error(`Error mounting route layer:`,e)}}),_(()=>{let e=f();if(e)try{e.getLayer(u.value)&&e.removeLayer(u.value),e.getSource(l.value)&&e.removeSource(l.value)}catch(e){console.error(`Error cleaning up route layer:`,e)}}),(e,t)=>T(e.$slots,`default`)}}),Ge=f({__name:`VLayerMaplibreIsochrone`,props:{id:{default:()=>`isochrone-${Math.random().toString(36).slice(2,9)}`},data:{},fillOpacity:{default:.4},lineWidth:{default:2},lineOpacity:{default:.8},visible:{type:Boolean,default:!0},interactive:{type:Boolean,default:!0},before:{default:``},reverseOrder:{type:Boolean,default:!0}},emits:[`click`,`mouseenter`,`mouseleave`],setup(e,{emit:r}){let i=e,a=r,o=t(n),c=C(!1),l=C(!1),u=s(()=>`${i.id}-source`),d=s(()=>`${i.id}-fill`),f=s(()=>`${i.id}-line`),p=s(()=>!i.data||!i.data.features||i.data.features.length===0?null:{type:`FeatureCollection`,features:(i.reverseOrder?[...i.data.features].reverse():i.data.features).map(e=>({...e,properties:{...e.properties,fillColor:e.properties.color.startsWith(`#`)?e.properties.color:`#${e.properties.color}`}}))}),h=()=>o.value||null,g=e=>{e&&e.on(`style.load`,()=>{let t=()=>{e.isStyleLoaded()?c.value=!0:(c.value=!1,setTimeout(t,200))};t()})},y=()=>{let e=h();if(!e||!e.isStyleLoaded())return;let t=p.value;if(t)try{if(e.getSource(u.value)||e.addSource(u.value,{type:`geojson`,data:t}),!e.getLayer(d.value)){let t={id:d.value,type:`fill`,source:u.value,layout:{visibility:i.visible?`visible`:`none`},paint:{"fill-color":[`get`,`fillColor`],"fill-opacity":i.fillOpacity}};e.addLayer(t,i.before||void 0)}if(!e.getLayer(f.value)){let t={id:f.value,type:`line`,source:u.value,layout:{visibility:i.visible?`visible`:`none`},paint:{"line-color":[`get`,`fillColor`],"line-width":i.lineWidth,"line-opacity":i.lineOpacity}};e.addLayer(t,i.before||void 0)}}catch(e){console.error(`Error adding isochrone layers:`,e)}},b=()=>{let e=h();if(e)try{let t=e.getSource(u.value),n=p.value;t&&`setData`in t?n&&t.setData(n):!t&&n&&y()}catch(e){console.error(`Error updating isochrone source:`,e)}},x=()=>{let e=h();if(e)try{e.getLayer(d.value)&&(e.setPaintProperty(d.value,`fill-opacity`,i.fillOpacity),e.setLayoutProperty(d.value,`visibility`,i.visible?`visible`:`none`)),e.getLayer(f.value)&&(e.setPaintProperty(f.value,`line-width`,i.lineWidth),e.setPaintProperty(f.value,`line-opacity`,i.lineOpacity),e.setLayoutProperty(f.value,`visibility`,i.visible?`visible`:`none`))}catch(e){console.error(`Error updating isochrone layer style:`,e)}},S=e=>{if(!(!e||!i.interactive))try{e.on(`click`,d.value,e=>{e.features&&e.features.length>0&&a(`click`,{feature:e.features[0],coordinates:e.lngLat})}),e.on(`mouseenter`,d.value,t=>{e.getCanvas().style.cursor=`pointer`,t.features&&t.features.length>0&&a(`mouseenter`,t.features[0])}),e.on(`mouseleave`,d.value,()=>{e.getCanvas().style.cursor=``,a(`mouseleave`)})}catch(e){console.error(`Error setting up isochrone layer events:`,e)}},w=async()=>{if(l.value)return;let e=h();!e||!e.isStyleLoaded()||p.value&&(await m(),!l.value&&(y(),S(e),l.value=!0))};return k(()=>i.data,()=>{let e=h();e?.isStyleLoaded()&&(e.getSource(u.value)?b():y())},{deep:!0}),k(()=>[i.fillOpacity,i.lineWidth,i.lineOpacity,i.visible],()=>x(),{deep:!0}),k(c,e=>{e&&w()}),k(o,e=>{e&&(g(e),e.isStyleLoaded()&&(c.value=!0,w()))},{immediate:!0}),v(()=>{m(()=>{w()})}),_(()=>{let e=h();if(e)try{e.getLayer(f.value)&&e.removeLayer(f.value),e.getLayer(d.value)&&e.removeLayer(d.value),e.getSource(u.value)&&e.removeSource(u.value)}catch(e){console.error(`Error cleaning up isochrone layer:`,e)}}),(e,t)=>T(e.$slots,`default`)}});var Ke=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n};const qe=[`id`];var $=Ke(f({__name:`VMap`,props:{options:{default:()=>({container:`map`})},supportPmtiles:{type:Boolean,default:!1},projection:{default:`mercator`}},emits:[`loaded`,...Y],setup(t,{emit:r}){let a=t,o=r;if(a.supportPmtiles){let t=new V({metadata:!0});j.addProtocol(`pmtiles`,t.tile),S(e,t)}let s=E(null),c=C(!1),d=C(Y);S(n,s),i(s,{globe:a.projection===`globe`}),v(()=>{s.value=new F(a.options),c.value=!0,f()});let f=()=>{s.value&&d.value.forEach(e=>{s.value?.on(e,t=>{switch(e){case`load`:o(`loaded`,s.value);break;default:o(e,t);break}})})};return(e,n)=>(x(),u(`div`,{id:`${t.options?.container}`,class:`v-map-container`},[c.value?T(e.$slots,`default`,{key:0},()=>[T(e.$slots,`default`,{},void 0,!0)],!0):l(`v-if`,!0)],8,qe))}}),[[`__scopeId`,`data-v-2632eb0f`]]);const Je=[`id`],Ye=f({__name:`VPopup`,props:{options:{default:()=>({})},coordinates:{default:()=>({})},marker:{default:()=>({})}},emits:[`added`,`removed`,`open`,`close`],setup(e,{emit:r}){let i=e,a=r,o=t(n),s=new R(i.options),c=C(!0),l=C(null),d=()=>o.value||null,f=e=>{e&&e.on(`style.load`,()=>{let t=()=>{e.isStyleLoaded()?c.value=!0:(c.value=!1,setTimeout(t,200))};t()})},p=()=>{try{l.value&&s.setDOMContent(l.value)}catch(e){console.error(`Error setting popup content:`,e)}},m=()=>{try{s.setLngLat(i.coordinates)}catch(e){console.error(`Error setting popup coordinates:`,e)}},h=()=>{let e=d();if(e)try{`setPopup`in i.marker?i.marker.setPopup(s):s.addTo(e),a(`added`,{popup:s})}catch(e){console.error(`Error adding popup to marker:`,e)}},g=()=>{try{s.remove(),a(`removed`)}catch(e){console.error(`Error removing popup:`,e)}},y=()=>{try{Q.forEach(e=>{s.on(e,()=>{a(e)})})}catch(e){console.error(`Error setting up popup events:`,e)}},b=()=>{try{Q.forEach(e=>{s.off(e,()=>{a(e)})})}catch(e){console.error(`Error removing popup events:`,e)}};return k(o,e=>{e&&f(e)},{immediate:!0}),k(()=>i.coordinates,()=>{m()},{deep:!0}),v(()=>{if(c.value)try{p(),m(),h(),y()}catch(e){console.error(`Error initializing popup:`,e)}else g(),b()}),_(()=>{g(),b()}),(e,t)=>(x(),u(`section`,{id:`popup-${Date.now()}`,ref_key:`content`,ref:l},[T(e.$slots,`default`)],8,Je))}}),Xe=[`id`],Ze=f({__name:`VMarker`,props:{coordinates:{},options:{default:()=>({})},popupOptions:{default:()=>({})},cursor:{default:`pointer`}},emits:[`added`,`update:coordinates`,`removed`,...X,...Z],setup(e,{emit:r}){let i=O(),a=e,o=r,s=t(n),d=C(null),f=C(!0),p=C(!1),m=C(null),h=()=>s.value||null,g=e=>{e&&e.on(`style.load`,()=>{let t=()=>{e.isStyleLoaded()?f.value=!0:(f.value=!1,setTimeout(t,200))};t()})},y=e=>{e instanceof HTMLElement&&(m.value=e)},b=e=>{try{e.setLngLat(a.coordinates)}catch(e){console.error(`Error setting marker coordinates:`,e)}},S=e=>{try{e.getElement().style.cursor=a.cursor||`default`}catch(e){console.error(`Error setting cursor:`,e)}},w=e=>{let t=h();if(t)try{e.addTo(t),o(`added`,{marker:e})}catch(e){console.error(`Error adding marker to map:`,e)}},E=e=>{try{e.remove(),o(`removed`)}catch(e){console.error(`Error removing marker from map:`,e)}},D=e=>{try{let t;X.forEach(n=>{e.on(n,e=>{n===`dragend`&&(t=Array.isArray(a.coordinates)?[e.target.getLngLat().lng,e.target.getLngLat().lat]:e.target.getLngLat(),o(`update:coordinates`,t)),o(n,e)})}),Z.forEach(t=>{e.getElement().addEventListener(t,e=>{o(t,e)})})}catch(e){console.error(`Error setting up marker events:`,e)}};k(d,e=>{p.value=e!==null&&`_map`in e}),k(s,e=>{e&&g(e)},{immediate:!0});let j=e=>{if(!(!f.value||d.value))try{d.value=new I({...a.options,element:e||void 0}),b(d.value),w(d.value),S(d.value),D(d.value)}catch(e){console.error(`Error initializing marker:`,e)}};return k(m,e=>{e&&!d.value&&j(e)}),v(()=>{i.markers||j()}),_(()=>{d.value&&E(d.value)}),(t,n)=>(x(),u(`section`,{id:`marker-${Date.now()}`,class:`absolute`},[T(t.$slots,`markers`,{setRef:y}),p.value&&t.$slots.default?(x(),c(Ye,{key:0,marker:d.value,options:e.popupOptions,coordinates:e.coordinates},{default:A(()=>[T(t.$slots,`default`)]),_:3},8,[`marker`,`options`,`coordinates`])):l(`v-if`,!0)],8,Xe))}});var Qe=$;export{H as VControlAttribution,U as VControlFullscreen,G as VControlGeolocate,ue as VControlLayer,Ce as VControlLayerGroup,Ie as VControlLegend,ee as VControlNavigation,te as VControlScale,Le as VLayerMaplibreCanvas,Ue as VLayerMaplibreCluster,Re as VLayerMaplibreGeojson,ze as VLayerMaplibreImage,Ge as VLayerMaplibreIsochrone,He as VLayerMaplibrePmtile,q as VLayerMaplibreRaster,We as VLayerMaplibreRoute,Be as VLayerMaplibreVector,Ve as VLayerMaplibreVideo,$ as VMap,Ze as VMarker,Ye as VPopup,Qe as default,r as requirePeer};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/lidar.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as e,t}from"./symbols-DXKzIgbY.js";import{a as n}from"./useDeckOverlay-
|
|
1
|
+
import{r as e,t}from"./symbols-DXKzIgbY.js";import{a as n}from"./useDeckOverlay-CI56uIKH.js";import{defineComponent as r,onMounted as i,onUnmounted as a,ref as o}from"vue";const s=[`load`,`loadstart`,`loaderror`,`unload`,`statechange`,`stylechange`,`collapse`,`expand`,`streamingstart`,`streamingstop`,`streamingprogress`,`budgetreached`],c=r({__name:`VControlLidar`,props:{options:{default:void 0},position:{default:`top-right`},defaultUrl:{default:void 0}},emits:s,setup(r,{expose:c,emit:l}){let u={collapsed:!0,pointSize:2,colorScheme:`elevation`,pickable:!1,autoZoom:!0},d=r,f=l,p=e(t),m=o(null);i(async()=>{await h()}),a(()=>{m.value&&p.value&&(p.value.removeControl(m.value),m.value=null)});let h=async()=>{let{LidarControl:e}=await n(`maplibre-gl-lidar`,()=>import(`maplibre-gl-lidar`));m.value=new e(d.options||u),p.value.addControl(m.value,d.position),s.forEach(e=>{m.value.on(e,t=>{f(e,t)})}),d.defaultUrl&&m.value.loadPointCloud(d.defaultUrl)};return c({loadPointCloud:(e,t)=>m.value?.loadPointCloud(e,t),loadPointCloudStreaming:(e,t)=>m.value?.loadPointCloudStreaming(e,t),loadPointCloudEptStreaming:(e,t)=>m.value?.loadPointCloudEptStreaming(e,t),unloadPointCloud:e=>m.value?.unloadPointCloud(e),flyToPointCloud:e=>m.value?.flyToPointCloud(e),setPointSize:e=>m.value?.setPointSize(e),setColorScheme:e=>m.value?.setColorScheme(e),setColormap:e=>m.value?.setColormap(e),getColormap:()=>m.value?.getColormap(),setColorRange:e=>m.value?.setColorRange(e),getColorRange:()=>m.value?.getColorRange(),setOpacity:e=>m.value?.setOpacity(e),setPickable:e=>m.value?.setPickable(e),setUsePercentile:e=>m.value?.setUsePercentile(e),getUsePercentile:()=>m.value?.getUsePercentile(),setElevationRange:(e,t)=>m.value?.setElevationRange(e,t),clearElevationRange:()=>m.value?.clearElevationRange(),setPointBudget:e=>m.value?.setPointBudget(e),setZOffset:e=>m.value?.setZOffset(e),setZOffsetEnabled:e=>m.value?.setZOffsetEnabled(e),getZOffset:()=>m.value?.getZOffset(),setTerrain:e=>m.value?.setTerrain(e),getTerrain:()=>m.value?.getTerrain(),setPickInfoFields:e=>m.value?.setPickInfoFields(e),getPickInfoFields:()=>m.value?.getPickInfoFields(),setClassificationVisibility:(e,t)=>m.value?.setClassificationVisibility(e,t),showAllClassifications:()=>m.value?.showAllClassifications(),hideAllClassifications:()=>m.value?.hideAllClassifications(),getHiddenClassifications:()=>m.value?.getHiddenClassifications(),getAvailableClassifications:()=>m.value?.getAvailableClassifications(),toggle:()=>m.value?.toggle(),expand:()=>m.value?.expand(),collapse:()=>m.value?.collapse(),getState:()=>m.value?.getState(),getPointClouds:()=>m.value?.getPointClouds(),stopStreaming:e=>m.value?.stopStreaming(e),isStreaming:e=>m.value?.isStreaming(e),getStreamingProgress:()=>m.value?.getStreamingProgress(),getMap:()=>m.value?.getMap(),getPanelElement:()=>m.value?.getPanelElement(),getControl:()=>m.value}),()=>{}}});export{c as VControlLidar};
|
|
2
2
|
//# sourceMappingURL=lidar.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as e,t}from"./symbols-DXKzIgbY.js";import{i as n}from"./useDeckOverlay-
|
|
2
|
-
//# sourceMappingURL=line-
|
|
1
|
+
import{r as e,t}from"./symbols-DXKzIgbY.js";import{i as n}from"./useDeckOverlay-CI56uIKH.js";import{defineComponent as r,onBeforeUnmount as i,renderSlot as a,watch as o}from"vue";import{LineLayer as s}from"@deck.gl/layers";const c=r({__name:`VLayerDeckglLine`,props:{id:{},data:{},getSourcePosition:{},getTargetPosition:{},getColor:{},getWidth:{},widthUnits:{default:`pixels`},widthScale:{default:1},widthMinPixels:{default:0},widthMaxPixels:{default:2**53-1},opacity:{default:1},visible:{type:Boolean,default:!0},pickable:{type:Boolean,default:!0},autoHighlight:{type:Boolean,default:!1},highlightColor:{},beforeId:{}},emits:[`click`,`hover`],setup(r,{emit:c}){let l=r,u=c,d=e(t),{addLayer:f,removeLayer:p,updateLayer:m}=n(d),h=()=>new s({id:l.id,data:l.data,getSourcePosition:l.getSourcePosition,getTargetPosition:l.getTargetPosition,getColor:l.getColor??[0,0,0,255],getWidth:l.getWidth??1,widthUnits:l.widthUnits,widthScale:l.widthScale,widthMinPixels:l.widthMinPixels,widthMaxPixels:l.widthMaxPixels,opacity:l.opacity,visible:l.visible,pickable:l.pickable,autoHighlight:l.autoHighlight,highlightColor:l.highlightColor,beforeId:l.beforeId,onClick:e=>u(`click`,e),onHover:e=>u(`hover`,e)}),g=()=>{f(h())};return o(d,e=>{e&&g()},{immediate:!0}),o(()=>[l.data,l.getSourcePosition,l.getTargetPosition,l.getColor,l.opacity,l.visible],()=>m(l.id,h()),{deep:!0}),i(()=>{p(l.id)}),(e,t)=>a(e.$slots,`default`)}});export{c as VLayerDeckglLine};
|
|
2
|
+
//# sourceMappingURL=line-B77d8tio.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"line-
|
|
1
|
+
{"version":3,"file":"line-B77d8tio.js","names":[],"sources":["../src/layers/deckgl/line/VLayerDeckglLine.vue"],"sourcesContent":["<script setup lang=\"ts\">\n /**\n * Render flat straight lines between coordinate pairs.\n *\n * @requires `@deck.gl/core`\n * @requires `@deck.gl/mapbox`\n * @requires `@deck.gl/layers`\n *\n * Install with:\n * `pnpm add @deck.gl/core @deck.gl/mapbox @deck.gl/layers`\n */\n import { onBeforeUnmount, watch } from 'vue';\n import { LineLayer } from '@deck.gl/layers';\n import type { LineLayerProps } from '@deck.gl/layers';\n import type { PickingInfo, Position } from '@deck.gl/core';\n import { injectStrict, MapKey } from '../../../utils';\n import { useDeckOverlay } from '../_shared/useDeckOverlay';\n import type { Color } from '../_shared/types';\n\n type Accessor<In, Out> = Out | ((object: In) => Out);\n\n interface Props<D = unknown> {\n id: string;\n data: D[] | string | Promise<D[]>;\n getSourcePosition: Accessor<D, Position>;\n getTargetPosition: Accessor<D, Position>;\n getColor?: Accessor<D, Color>;\n getWidth?: Accessor<D, number>;\n widthUnits?: 'meters' | 'common' | 'pixels';\n widthScale?: number;\n widthMinPixels?: number;\n widthMaxPixels?: number;\n opacity?: number;\n visible?: boolean;\n pickable?: boolean;\n autoHighlight?: boolean;\n highlightColor?: Color;\n beforeId?: string;\n }\n\n const props = withDefaults(defineProps<Props>(), {\n widthUnits: 'pixels',\n widthScale: 1,\n widthMinPixels: 0,\n widthMaxPixels: Number.MAX_SAFE_INTEGER,\n opacity: 1,\n visible: true,\n pickable: true,\n autoHighlight: false,\n });\n\n const emit = defineEmits<{\n click: [info: PickingInfo];\n hover: [info: PickingInfo];\n }>();\n\n const map = injectStrict(MapKey);\n const { addLayer, removeLayer, updateLayer } = useDeckOverlay(map);\n\n const createLayer = () => {\n return new LineLayer({\n id: props.id,\n data: props.data,\n getSourcePosition: props.getSourcePosition,\n getTargetPosition: props.getTargetPosition,\n getColor: props.getColor ?? [0, 0, 0, 255],\n getWidth: props.getWidth ?? 1,\n widthUnits: props.widthUnits,\n widthScale: props.widthScale,\n widthMinPixels: props.widthMinPixels,\n widthMaxPixels: props.widthMaxPixels,\n opacity: props.opacity,\n visible: props.visible,\n pickable: props.pickable,\n autoHighlight: props.autoHighlight,\n highlightColor: props.highlightColor,\n beforeId: props.beforeId,\n onClick: (info: PickingInfo) => emit('click', info),\n onHover: (info: PickingInfo) => emit('hover', info),\n } as LineLayerProps);\n };\n\n const initializeLayer = () => {\n addLayer(createLayer());\n };\n\n watch(\n map,\n (mapInstance) => {\n if (!mapInstance) return;\n // Register unconditionally once the map exists. addLayer() routes through\n // useDeckOverlay's initOverlay(), which robustly waits for style.load via\n // its own once-listener + polling. Gating here on isStyleLoaded() was racy:\n // if style.load already fired before this watch ran, the one-shot\n // .once('style.load') never fired and the layer was never registered.\n initializeLayer();\n },\n { immediate: true },\n );\n\n watch(\n () => [\n props.data,\n props.getSourcePosition,\n props.getTargetPosition,\n props.getColor,\n props.opacity,\n props.visible,\n ],\n () => updateLayer(props.id, createLayer()),\n { deep: true },\n );\n\n onBeforeUnmount(() => {\n removeLayer(props.id);\n });\n</script>\n\n<template>\n <slot></slot>\n</template>\n"],"mappings":"spBAwCE,IAAM,EAAQ,EAWR,EAAO,EAKP,EAAM,EAAa,CAAM,EACzB,CAAE,WAAU,cAAa,eAAgB,EAAe,CAAG,EAE3D,MACG,IAAI,EAAU,CACnB,GAAI,EAAM,GACV,KAAM,EAAM,KACZ,kBAAmB,EAAM,kBACzB,kBAAmB,EAAM,kBACzB,SAAU,EAAM,UAAY,CAAC,EAAG,EAAG,EAAG,GAAG,EACzC,SAAU,EAAM,UAAY,EAC5B,WAAY,EAAM,WAClB,WAAY,EAAM,WAClB,eAAgB,EAAM,eACtB,eAAgB,EAAM,eACtB,QAAS,EAAM,QACf,QAAS,EAAM,QACf,SAAU,EAAM,SAChB,cAAe,EAAM,cACrB,eAAgB,EAAM,eACtB,SAAU,EAAM,SAChB,QAAU,GAAsB,EAAK,QAAS,CAAI,EAClD,QAAU,GAAsB,EAAK,QAAS,CAAI,CACpD,CAAmB,EAGf,MAAwB,CAC5B,EAAS,EAAY,CAAC,CACxB,SAEA,EACE,EACC,GAAgB,CACV,GAML,EAAgB,CAClB,EACA,CAAE,UAAW,EAAK,CACpB,EAEA,MACQ,CACJ,EAAM,KACN,EAAM,kBACN,EAAM,kBACN,EAAM,SACN,EAAM,QACN,EAAM,OACR,MACM,EAAY,EAAM,GAAI,EAAY,CAAC,EACzC,CAAE,KAAM,EAAK,CACf,EAEA,MAAsB,CACpB,EAAY,EAAM,EAAE,CACtB,CAAC,SAID,EAAa,EAAA,OAAA,SAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as e,t}from"./symbols-DXKzIgbY.js";import{a as n,i as r}from"./useDeckOverlay-
|
|
1
|
+
import{r as e,t}from"./symbols-DXKzIgbY.js";import{a as n,i as r}from"./useDeckOverlay-CI56uIKH.js";import{defineComponent as i,markRaw as a,onBeforeUnmount as o,renderSlot as s,shallowRef as c,toRaw as l,watch as u}from"vue";const d=`pnpm add @deck.gl/core @deck.gl/layers @deck.gl/mapbox @developmentseed/deck.gl-geotiff @developmentseed/deck.gl-raster @developmentseed/geotiff @developmentseed/proj`,f=i({__name:`VLayerMosaic`,props:{id:{},sources:{},renderMode:{default:`trueColor`},customRenderModules:{},colormapData:{},maxCacheSize:{default:1/0},opacity:{default:1},visible:{type:Boolean,default:!0},pickable:{type:Boolean,default:!1},autoHighlight:{type:Boolean,default:!1},highlightColor:{},ndviRange:{default:()=>[-1,1]},beforeId:{}},emits:[`click`,`hover`,`sourceLoad`,`error`],setup(i,{emit:f}){let p=i,m=f,h=e(t),{addLayer:g,removeLayer:_}=r(h),v=``,y=c(null),b={name:`set-alpha-1`,inject:{"fs:DECKGL_FILTER_COLOR":`color = vec4(color.rgb, 1.0);`}},x={name:`false-color-infrared`,inject:{"fs:DECKGL_FILTER_COLOR":`
|
|
2
2
|
float nir = color[3];
|
|
3
3
|
float red = color[0];
|
|
4
4
|
float green = color[1];
|
|
@@ -40,4 +40,4 @@ import{r as e,t}from"./symbols-DXKzIgbY.js";import{a as n,i as r}from"./useDeckO
|
|
|
40
40
|
|
|
41
41
|
color.rgb = result;
|
|
42
42
|
`}};function T(e,t,n,r,i){if(e===`custom`&&i)return i(t);let a=[{module:n.CreateTexture,props:{textureName:t}}];return e===`trueColor`?[...a,{module:b}]:e===`falseColor`?[...a,{module:x},{module:b}]:[...a,{module:S},{module:C,props:{ndviMin:r[0],ndviMax:r[1]}},{module:w},{module:b}]}function E(){let e=y.value;if(!e||!p.sources.length)return null;let{MosaicLayer:t,COGLayer:n,CreateTexture:r,fromUrl:i,resolveEpsg:a}=e,o=l(p.sources),s=l(p.renderMode),c=l(p.ndviRange),u=p.customRenderModules;return new t({id:`${l(p.id)}-mosaic`,sources:o,maxCacheSize:l(p.maxCacheSize),getSource:async e=>{try{let t=await i(e.assets.image.href);return m(`sourceLoad`,e),t}catch(t){throw m(`error`,t,e),t}},renderSource:(e,{data:t,signal:i})=>t?new n({id:`cog-${e.assets.image.href}-${s}`,geotiff:t,epsgResolver:a,getTileData:async(e,t)=>{let{device:n,x:r,y:a}=t,{array:o}=await e.fetchTile(r,a,{signal:i,boundless:!1});if(o.layout===`band-separate`)throw Error(`Band-separate COGs are not supported`);return{texture:n.createTexture({data:o.data,format:`rgba8unorm`,width:o.width,height:o.height}),width:o.width,height:o.height}},renderTile:e=>({image:e.texture,renderPipeline:T(s,e.texture,{CreateTexture:r},c,u)}),signal:i}):null})}async function D(){try{let[e,t,r,i]=await Promise.all([n(`@developmentseed/deck.gl-geotiff`,()=>import(`@developmentseed/deck.gl-geotiff`),d),n(`@developmentseed/deck.gl-raster`,()=>import(`@developmentseed/deck.gl-raster/gpu-modules`),d),n(`@developmentseed/geotiff`,()=>import(`@developmentseed/geotiff`),d),n(`@developmentseed/proj`,()=>import(`@developmentseed/proj`),d)]);y.value=a({MosaicLayer:e.MosaicLayer,COGLayer:e.COGLayer,CreateTexture:t.CreateTexture,fromUrl:r.GeoTIFF.fromUrl,resolveEpsg:i.epsgResolver});let o=E();o&&(v=o.id,g(o))}catch(e){console.error(`[deck.gl-mosaic] Error loading MosaicLayer:`,e),console.error(`Make sure @developmentseed/deck.gl-geotiff, @developmentseed/deck.gl-raster, and @developmentseed/geotiff are installed`),m(`error`,e)}}return u(h,e=>{e&&D()},{immediate:!0}),u(()=>[p.sources,p.renderMode,p.ndviRange,p.opacity,p.visible],()=>{if(y.value){let e=E();e&&(v=e.id,g(e))}},{deep:!0}),o(()=>{v&&_(v)}),(e,t)=>s(e.$slots,`default`)}});export{f as VLayerMosaic};
|
|
43
|
-
//# sourceMappingURL=mosaic-
|
|
43
|
+
//# sourceMappingURL=mosaic-Bm1aKa0Q.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mosaic-DUwBxfGg.js","names":[],"sources":["../src/layers/deckgl/mosaic/VLayerMosaic.vue"],"sourcesContent":["<script setup lang=\"ts\">\n /**\n * Client-side COG mosaic for STAC items — GPU-rendered, no tile server required.\n *\n * @requires `@deck.gl/core`\n * @requires `@deck.gl/mapbox`\n * @requires `@deck.gl/layers`\n * @requires `@developmentseed/deck.gl-geotiff`\n * @requires `@developmentseed/deck.gl-raster`\n * @requires `@developmentseed/geotiff`\n * @requires `@developmentseed/proj`\n *\n * Install with:\n * `pnpm add @deck.gl/core @deck.gl/mapbox @deck.gl/layers @developmentseed/deck.gl-geotiff @developmentseed/deck.gl-raster @developmentseed/geotiff @developmentseed/proj`\n */\n /**\n * VLayerMosaic - Client-side COG mosaic layer for STAC items\n *\n * Uses @developmentseed/deck.gl-geotiff v0.3.0 MosaicLayer for efficient\n * client-side rendering of multiple COGs from STAC APIs.\n *\n * @see https://github.com/developmentseed/deck.gl-raster/blob/main/examples/naip-mosaic/src/App.tsx\n */\n import { onBeforeUnmount, watch, shallowRef, markRaw, toRaw } from 'vue';\n import type { Color, PickingInfo } from '@deck.gl/core';\n import type { GeoTIFF, Overview } from '@developmentseed/geotiff';\n import type { Texture } from '@luma.gl/core';\n import type { RasterModule } from '@developmentseed/deck.gl-raster';\n import type { ShaderModule } from '@luma.gl/shadertools';\n import type {\n COGLayerProps,\n GetTileDataOptions,\n MosaicLayerProps,\n MosaicSource as BaseMosaicSource,\n } from '@developmentseed/deck.gl-geotiff';\n import type { EpsgResolver } from '@developmentseed/proj';\n import { injectStrict, MapKey, requirePeer } from '../../../utils';\n import { useDeckOverlay } from '../_shared/useDeckOverlay';\n\n const MOSAIC_PEER_INSTALL =\n 'pnpm add @deck.gl/core @deck.gl/layers @deck.gl/mapbox @developmentseed/deck.gl-geotiff @developmentseed/deck.gl-raster @developmentseed/geotiff @developmentseed/proj';\n\n /**\n * A STAC-like item with bounding box and COG asset URL\n * Extends the base MosaicSource from deck.gl-geotiff with asset info\n */\n export interface MosaicSource extends BaseMosaicSource {\n /** Asset containing the COG URL */\n assets: {\n image: { href: string };\n };\n }\n\n /**\n * Render mode for the mosaic layer\n */\n export type MosaicRenderMode = 'trueColor' | 'falseColor' | 'ndvi' | 'custom';\n\n /**\n * Custom render module for advanced band manipulation\n */\n export interface RenderModule {\n module: { name: string; inject?: Record<string, string> };\n props?: Record<string, unknown>;\n }\n\n interface Props {\n id: string;\n /**\n * Array of STAC-like items with bbox and COG asset URLs\n */\n sources: MosaicSource[];\n /**\n * Render mode: trueColor (RGB), falseColor (NIR-R-G), ndvi (with colormap)\n */\n renderMode?: MosaicRenderMode;\n /**\n * Custom render modules (only used when renderMode is 'custom')\n */\n customRenderModules?: (texture: Texture) => RenderModule[];\n /**\n * Custom colormap data for NDVI (Uint8ClampedArray of RGBA values, 256 colors)\n * @reserved Currently not implemented - NDVI uses built-in cfastie colormap.\n */\n colormapData?: Uint8ClampedArray;\n /**\n * Maximum number of tiles to cache\n */\n maxCacheSize?: number;\n /**\n * Layer opacity (0-1)\n */\n opacity?: number;\n /**\n * Layer visibility\n */\n visible?: boolean;\n /**\n * Enable picking on this layer\n */\n pickable?: boolean;\n /**\n * Auto highlight on hover\n */\n autoHighlight?: boolean;\n /**\n * Highlight color when autoHighlight is enabled\n */\n highlightColor?: Color;\n /**\n * NDVI range filter: pixels outside [min, max] are discarded.\n * Only applies when renderMode is 'ndvi'. Range: [-1, 1].\n */\n ndviRange?: [number, number];\n /**\n * Insert layer before this layer id\n */\n beforeId?: string;\n }\n\n const props = withDefaults(defineProps<Props>(), {\n renderMode: 'trueColor',\n maxCacheSize: Infinity,\n opacity: 1,\n visible: true,\n pickable: false,\n autoHighlight: false,\n ndviRange: () => [-1, 1] as [number, number],\n });\n\n const emit = defineEmits<{\n click: [info: PickingInfo];\n hover: [info: PickingInfo];\n sourceLoad: [source: MosaicSource];\n error: [error: Error, source?: MosaicSource];\n }>();\n\n const map = injectStrict(MapKey);\n const { addLayer, removeLayer } = useDeckOverlay(map);\n let activeLayerId = '';\n\n interface TextureData {\n texture: Texture;\n width: number;\n height: number;\n }\n\n interface LoadedModules {\n MosaicLayer: typeof import('@developmentseed/deck.gl-geotiff').MosaicLayer;\n COGLayer: typeof import('@developmentseed/deck.gl-geotiff').COGLayer;\n CreateTexture: RasterModule['module'];\n fromUrl: typeof GeoTIFF.fromUrl;\n resolveEpsg: EpsgResolver;\n }\n\n const modules = shallowRef<LoadedModules | null>(null);\n\n // Shader modules for different render modes\n const SetAlpha1 = {\n name: 'set-alpha-1',\n inject: { 'fs:DECKGL_FILTER_COLOR': `color = vec4(color.rgb, 1.0);` },\n };\n\n const FalseColorInfrared = {\n name: 'false-color-infrared',\n inject: {\n 'fs:DECKGL_FILTER_COLOR': `\n float nir = color[3];\n float red = color[0];\n float green = color[1];\n color.rgb = vec3(nir, red, green);\n `,\n },\n };\n\n // --- NDVI Pipeline: 3 separate modules matching upstream pattern ---\n // Uniforms update per-draw via MeshTextureLayer.draw() → setProps() without\n // re-rendering tiles. Baked constants don't work because renderTile only runs\n // when tiles are FIRST FETCHED — cached tiles keep old shader modules.\n\n // Step 1: Compute NDVI from raw RGBA bands, store in color.r\n const NDVICompute = {\n name: 'ndvi-compute',\n inject: {\n 'fs:DECKGL_FILTER_COLOR': `\n float nir_c = color[3];\n float red_c = color[0];\n float sum_c = nir_c + red_c;\n float ndvi_c = sum_c > 0.001 ? (nir_c - red_c) / sum_c : 0.0;\n color = vec4(ndvi_c, ndvi_c, ndvi_c, 1.0);\n `,\n },\n };\n\n // Step 2: Filter by NDVI range — uniforms update per-draw without tile re-render\n const ndviFilterUniformBlock = `\\\nuniform ndviFilterUniforms {\n float ndviMin;\n float ndviMax;\n} ndviFilter;\n`;\n\n const NDVIFilter = {\n name: 'ndviFilter',\n fs: ndviFilterUniformBlock,\n inject: {\n 'fs:DECKGL_FILTER_COLOR': `\n if (color.r < ndviFilter.ndviMin || color.r > ndviFilter.ndviMax) {\n discard;\n }\n `,\n },\n uniformTypes: {\n ndviMin: 'f32',\n ndviMax: 'f32',\n },\n getUniforms: (uniformProps: Record<string, unknown>) => ({\n ndviMin: (uniformProps.ndviMin as number) ?? -1.0,\n ndviMax: (uniformProps.ndviMax as number) ?? 1.0,\n }),\n } as const satisfies ShaderModule<{ ndviMin: number; ndviMax: number }>;\n\n // Step 3: Apply cfastie-inspired colormap gradient from color.r (NDVI value)\n const NDVIColormap = {\n name: 'ndvi-colormap',\n inject: {\n 'fs:DECKGL_FILTER_COLOR': `\n float t = clamp((color.r + 1.0) / 2.0, 0.0, 1.0);\n \n vec3 result;\n if (t < 0.4) {\n float localT = t / 0.4;\n result = mix(vec3(0.0, 0.0, 0.5), vec3(0.5, 0.8, 0.9), localT);\n } else if (t < 0.5) {\n float localT = (t - 0.4) / 0.1;\n result = mix(vec3(0.5, 0.8, 0.9), vec3(0.9, 0.9, 0.4), localT);\n } else if (t < 0.6) {\n float localT = (t - 0.5) / 0.1;\n result = mix(vec3(0.9, 0.9, 0.4), vec3(0.6, 0.8, 0.2), localT);\n } else if (t < 0.75) {\n float localT = (t - 0.6) / 0.15;\n result = mix(vec3(0.6, 0.8, 0.2), vec3(0.1, 0.6, 0.1), localT);\n } else {\n float localT = (t - 0.75) / 0.25;\n result = mix(vec3(0.1, 0.6, 0.1), vec3(0.0, 0.3, 0.0), localT);\n }\n \n color.rgb = result;\n `,\n },\n };\n\n function getRenderModules(\n mode: MosaicRenderMode,\n texture: Texture,\n mods: {\n CreateTexture: RasterModule['module'];\n },\n ndviRange: [number, number],\n customModules?: (texture: Texture) => RenderModule[],\n ): RasterModule[] {\n if (mode === 'custom' && customModules) {\n return customModules(texture) as RasterModule[];\n }\n\n const base: RasterModule[] = [\n { module: mods.CreateTexture, props: { textureName: texture } },\n ];\n\n if (mode === 'trueColor') {\n return [...base, { module: SetAlpha1 }];\n }\n\n if (mode === 'falseColor') {\n return [...base, { module: FalseColorInfrared }, { module: SetAlpha1 }];\n }\n\n // NDVI pipeline: compute → filter → colormap → alpha\n // NDVIFilter uses uniformTypes + getUniforms so uniform values update\n // per-draw via MeshTextureLayer.draw() WITHOUT re-rendering tiles.\n return [\n ...base,\n { module: NDVICompute },\n {\n module: NDVIFilter,\n props: { ndviMin: ndviRange[0], ndviMax: ndviRange[1] },\n },\n { module: NDVIColormap },\n { module: SetAlpha1 },\n ];\n }\n\n function createLayer() {\n const mods = modules.value;\n if (!mods || !props.sources.length) return null;\n\n const { MosaicLayer, COGLayer, CreateTexture, fromUrl, resolveEpsg } = mods;\n\n const rawSources = toRaw(props.sources);\n const renderMode = toRaw(props.renderMode);\n const ndviRange = toRaw(props.ndviRange) as [number, number];\n const customRenderModules = props.customRenderModules;\n\n // Fixed ID matching upstream pattern — deck.gl diffs old vs new layer\n // via setProps, detecting changed renderSource/renderTile callbacks.\n const newId = `${toRaw(props.id)}-mosaic`;\n const layer = new MosaicLayer<MosaicSource, GeoTIFF>({\n id: newId,\n sources: rawSources,\n maxCacheSize: toRaw(props.maxCacheSize),\n\n getSource: async (source) => {\n try {\n const tiff = await fromUrl(source.assets.image.href);\n emit('sourceLoad', source);\n return tiff;\n } catch (error) {\n emit('error', error as Error, source);\n throw error;\n }\n },\n\n renderSource: (source, { data, signal }) => {\n if (!data) return null;\n\n return new COGLayer<TextureData>({\n id: `cog-${source.assets.image.href}-${renderMode}`,\n geotiff: data,\n epsgResolver: resolveEpsg,\n getTileData: async (\n image: GeoTIFF | Overview,\n options: GetTileDataOptions,\n ) => {\n const { device, x, y } = options;\n const tile = await image.fetchTile(x, y, {\n signal,\n boundless: false,\n });\n const { array } = tile;\n if (array.layout === 'band-separate') {\n throw new Error('Band-separate COGs are not supported');\n }\n const texture = device.createTexture({\n data: array.data,\n format: 'rgba8unorm',\n width: array.width,\n height: array.height,\n });\n return {\n texture,\n width: array.width,\n height: array.height,\n };\n },\n renderTile: (tileData: TextureData) => ({\n image: tileData.texture,\n renderPipeline: getRenderModules(\n renderMode,\n tileData.texture,\n { CreateTexture },\n ndviRange,\n customRenderModules,\n ),\n }),\n signal,\n } as COGLayerProps<TextureData>);\n },\n } as MosaicLayerProps<MosaicSource, GeoTIFF>);\n\n return layer;\n }\n\n async function initializeLayer() {\n try {\n const [geotiffModule, rasterModule, devGeotiff, projModule] =\n await Promise.all([\n requirePeer(\n '@developmentseed/deck.gl-geotiff',\n () => import('@developmentseed/deck.gl-geotiff'),\n MOSAIC_PEER_INSTALL,\n ),\n requirePeer(\n '@developmentseed/deck.gl-raster',\n () => import('@developmentseed/deck.gl-raster/gpu-modules'),\n MOSAIC_PEER_INSTALL,\n ),\n requirePeer(\n '@developmentseed/geotiff',\n () => import('@developmentseed/geotiff'),\n MOSAIC_PEER_INSTALL,\n ),\n requirePeer(\n '@developmentseed/proj',\n () => import('@developmentseed/proj'),\n MOSAIC_PEER_INSTALL,\n ),\n ]);\n\n modules.value = markRaw({\n MosaicLayer: geotiffModule.MosaicLayer,\n COGLayer: geotiffModule.COGLayer,\n CreateTexture: rasterModule.CreateTexture,\n fromUrl: devGeotiff.GeoTIFF.fromUrl,\n resolveEpsg: projModule.epsgResolver,\n });\n\n const layer = createLayer();\n if (layer) {\n activeLayerId = (layer as { id: string }).id;\n addLayer(layer);\n }\n } catch (error) {\n console.error('[deck.gl-mosaic] Error loading MosaicLayer:', error);\n console.error(\n 'Make sure @developmentseed/deck.gl-geotiff, @developmentseed/deck.gl-raster, and @developmentseed/geotiff are installed',\n );\n emit('error', error as Error);\n }\n }\n\n watch(\n map,\n (mapInstance) => {\n if (!mapInstance) return;\n // Register unconditionally once the map exists. addLayer() routes through\n // useDeckOverlay's initOverlay(), which robustly waits for style.load via\n // its own once-listener + polling. Gating here on isStyleLoaded() was racy:\n // if style.load already fired before this watch ran, the one-shot\n // .once('style.load') never fired and the layer was never registered.\n initializeLayer();\n },\n { immediate: true },\n );\n\n watch(\n () => [\n props.sources,\n props.renderMode,\n props.ndviRange,\n props.opacity,\n props.visible,\n ],\n () => {\n if (modules.value) {\n const layer = createLayer();\n if (layer) {\n activeLayerId = (layer as { id: string }).id;\n addLayer(layer);\n }\n }\n },\n { deep: true },\n );\n\n onBeforeUnmount(() => {\n if (activeLayerId) {\n removeLayer(activeLayerId);\n }\n });\n</script>\n\n<template>\n <slot></slot>\n</template>\n"],"mappings":"kOAuCE,MAAM,EACJ,6jBAgFF,IAAM,EAAQ,EAUR,EAAO,EAOP,EAAM,EAAa,CAAM,EACzB,CAAE,WAAU,eAAgB,EAAe,CAAG,EAChD,EAAgB,GAgBd,EAAU,EAAiC,IAAI,EAG/C,EAAY,CAChB,KAAM,cACN,OAAQ,CAAE,yBAA0B,+BAAgC,CACtE,EAEM,EAAqB,CACzB,KAAM,uBACN,OAAQ,CACN,yBAA0B;;;;;OAM5B,CACF,EAQM,EAAc,CAClB,KAAM,eACN,OAAQ,CACN,yBAA0B;;;;;;OAO5B,CACF,EAUM,EAAa,CACjB,KAAM,aACN,GAAI;;;;EACJ,OAAQ,CACN,yBAA0B;;;;OAK5B,EACA,aAAc,CACZ,QAAS,MACT,QAAS,KACX,EACA,YAAc,IAA2C,CACvD,QAAU,EAAa,SAAsB,GAC7C,QAAU,EAAa,SAAsB,CAC/C,EACF,EAGM,EAAe,CACnB,KAAM,gBACN,OAAQ,CACN,yBAA0B;;;;;;;;;;;;;;;;;;;;;;OAuB5B,CACF,EAEA,SAAS,EACP,EACA,EACA,EAGA,EACA,EACgB,CAChB,GAAI,IAAS,UAAY,EACvB,OAAO,EAAc,CAAO,EAG9B,IAAM,EAAuB,CAC3B,CAAE,OAAQ,EAAK,cAAe,MAAO,CAAE,YAAa,CAAQ,CAAE,CAChE,EAaA,OAXI,IAAS,YACJ,CAAC,GAAG,EAAM,CAAE,OAAQ,CAAU,CAAC,EAGpC,IAAS,aACJ,CAAC,GAAG,EAAM,CAAE,OAAQ,CAAmB,EAAG,CAAE,OAAQ,CAAU,CAAC,EAMjE,CACL,GAAG,EACH,CAAE,OAAQ,CAAY,EACtB,CACE,OAAQ,EACR,MAAO,CAAE,QAAS,EAAU,GAAI,QAAS,EAAU,EAAG,CACxD,EACA,CAAE,OAAQ,CAAa,EACvB,CAAE,OAAQ,CAAU,CACtB,CACF,CAEA,SAAS,GAAc,CACrB,IAAM,EAAO,EAAQ,MACrB,GAAI,CAAC,GAAQ,CAAC,EAAM,QAAQ,OAAQ,OAAO,KAE3C,GAAM,CAAE,cAAa,WAAU,gBAAe,UAAS,eAAgB,EAEjE,EAAa,EAAM,EAAM,OAAO,EAChC,EAAa,EAAM,EAAM,UAAU,EACnC,EAAY,EAAM,EAAM,SAAS,EACjC,EAAsB,EAAM,oBAoElC,OAAO,IA/DW,EAAmC,CACnD,GAAI,GAFW,EAAM,EAAM,EAAE,EAAE,SAG/B,QAAS,EACT,aAAc,EAAM,EAAM,YAAY,EAEtC,UAAW,KAAO,IAAW,CAC3B,GAAI,CACF,IAAM,EAAO,MAAM,EAAQ,EAAO,OAAO,MAAM,IAAI,EAEnD,OADA,EAAK,aAAc,CAAM,EAClB,CACT,OAAS,EAAO,CAEd,MADA,EAAK,QAAS,EAAgB,CAAM,EAC9B,CACR,CACF,EAEA,cAAe,EAAQ,CAAE,OAAM,YACxB,EAEE,IAAI,EAAsB,CAC/B,GAAI,OAAO,EAAO,OAAO,MAAM,KAAK,GAAG,IACvC,QAAS,EACT,aAAc,EACd,YAAa,MACX,EACA,IACG,CACH,GAAM,CAAE,SAAQ,IAAG,KAAM,EAKnB,CAAE,SAAU,MAJC,EAAM,UAAU,EAAG,EAAG,CACvC,SACA,UAAW,EACb,CAAC,EAED,GAAI,EAAM,SAAW,gBACnB,MAAU,MAAM,sCAAsC,EAQxD,MAAO,CACL,QAPc,EAAO,cAAc,CACnC,KAAM,EAAM,KACZ,OAAQ,aACR,MAAO,EAAM,MACb,OAAQ,EAAM,MAChB,CAEE,EACA,MAAO,EAAM,MACb,OAAQ,EAAM,MAChB,CACF,EACA,WAAa,IAA2B,CACtC,MAAO,EAAS,QAChB,eAAgB,EACd,EACA,EAAS,QACT,CAAE,eAAc,EAChB,EACA,CACF,CACF,GACA,QACF,CAA+B,EA1Cb,IA4CtB,CAEO,CACT,CAEA,eAAe,GAAkB,CAC/B,GAAI,CACF,GAAM,CAAC,EAAe,EAAc,EAAY,GAC9C,MAAM,QAAQ,IAAI,CAChB,EACE,uCACM,OAAO,oCACb,CACF,EACA,EACE,sCACM,OAAO,+CACb,CACF,EACA,EACE,+BACM,OAAO,4BACb,CACF,EACA,EACE,4BACM,OAAO,yBACb,CACF,CACF,CAAC,EAEH,EAAQ,MAAQ,EAAQ,CACtB,YAAa,EAAc,YAC3B,SAAU,EAAc,SACxB,cAAe,EAAa,cAC5B,QAAS,EAAW,QAAQ,QAC5B,YAAa,EAAW,YAC1B,CAAC,EAED,IAAM,EAAQ,EAAY,EACtB,IACF,EAAiB,EAAyB,GAC1C,EAAS,CAAK,EAElB,OAAS,EAAO,CACd,QAAQ,MAAM,8CAA+C,CAAK,EAClE,QAAQ,MACN,yHACF,EACA,EAAK,QAAS,CAAc,CAC9B,CACF,QAEA,EACE,EACC,GAAgB,CACV,GAML,EAAgB,CAClB,EACA,CAAE,UAAW,EAAK,CACpB,EAEA,MACQ,CACJ,EAAM,QACN,EAAM,WACN,EAAM,UACN,EAAM,QACN,EAAM,OACR,MACM,CACJ,GAAI,EAAQ,MAAO,CACjB,IAAM,EAAQ,EAAY,EACtB,IACF,EAAiB,EAAyB,GAC1C,EAAS,CAAK,EAElB,CACF,EACA,CAAE,KAAM,EAAK,CACf,EAEA,MAAsB,CAChB,GACF,EAAY,CAAa,CAE7B,CAAC,SAID,EAAa,EAAA,OAAA,SAAA"}
|
|
1
|
+
{"version":3,"file":"mosaic-Bm1aKa0Q.js","names":[],"sources":["../src/layers/deckgl/mosaic/VLayerMosaic.vue"],"sourcesContent":["<script setup lang=\"ts\">\n /**\n * Client-side COG mosaic for STAC items — GPU-rendered, no tile server required.\n *\n * @requires `@deck.gl/core`\n * @requires `@deck.gl/mapbox`\n * @requires `@deck.gl/layers`\n * @requires `@developmentseed/deck.gl-geotiff`\n * @requires `@developmentseed/deck.gl-raster`\n * @requires `@developmentseed/geotiff`\n * @requires `@developmentseed/proj`\n *\n * Install with:\n * `pnpm add @deck.gl/core @deck.gl/mapbox @deck.gl/layers @developmentseed/deck.gl-geotiff @developmentseed/deck.gl-raster @developmentseed/geotiff @developmentseed/proj`\n */\n /**\n * VLayerMosaic - Client-side COG mosaic layer for STAC items\n *\n * Uses @developmentseed/deck.gl-geotiff v0.3.0 MosaicLayer for efficient\n * client-side rendering of multiple COGs from STAC APIs.\n *\n * @see https://github.com/developmentseed/deck.gl-raster/blob/main/examples/naip-mosaic/src/App.tsx\n */\n import { onBeforeUnmount, watch, shallowRef, markRaw, toRaw } from 'vue';\n import type { Color, PickingInfo } from '@deck.gl/core';\n import type { GeoTIFF, Overview } from '@developmentseed/geotiff';\n import type { Texture } from '@luma.gl/core';\n import type { RasterModule } from '@developmentseed/deck.gl-raster';\n import type { ShaderModule } from '@luma.gl/shadertools';\n import type {\n COGLayerProps,\n GetTileDataOptions,\n MosaicLayerProps,\n MosaicSource as BaseMosaicSource,\n } from '@developmentseed/deck.gl-geotiff';\n import type { EpsgResolver } from '@developmentseed/proj';\n import { injectStrict, MapKey, requirePeer } from '../../../utils';\n import { useDeckOverlay } from '../_shared/useDeckOverlay';\n\n const MOSAIC_PEER_INSTALL =\n 'pnpm add @deck.gl/core @deck.gl/layers @deck.gl/mapbox @developmentseed/deck.gl-geotiff @developmentseed/deck.gl-raster @developmentseed/geotiff @developmentseed/proj';\n\n /**\n * A STAC-like item with bounding box and COG asset URL\n * Extends the base MosaicSource from deck.gl-geotiff with asset info\n */\n export interface MosaicSource extends BaseMosaicSource {\n /** Asset containing the COG URL */\n assets: {\n image: { href: string };\n };\n }\n\n /**\n * Render mode for the mosaic layer\n */\n export type MosaicRenderMode = 'trueColor' | 'falseColor' | 'ndvi' | 'custom';\n\n /**\n * Custom render module for advanced band manipulation\n */\n export interface RenderModule {\n module: { name: string; inject?: Record<string, string> };\n props?: Record<string, unknown>;\n }\n\n interface Props {\n id: string;\n /**\n * Array of STAC-like items with bbox and COG asset URLs\n */\n sources: MosaicSource[];\n /**\n * Render mode: trueColor (RGB), falseColor (NIR-R-G), ndvi (with colormap)\n */\n renderMode?: MosaicRenderMode;\n /**\n * Custom render modules (only used when renderMode is 'custom')\n */\n customRenderModules?: (texture: Texture) => RenderModule[];\n /**\n * Custom colormap data for NDVI (Uint8ClampedArray of RGBA values, 256 colors)\n * @reserved Currently not implemented - NDVI uses built-in cfastie colormap.\n */\n colormapData?: Uint8ClampedArray;\n /**\n * Maximum number of tiles to cache\n */\n maxCacheSize?: number;\n /**\n * Layer opacity (0-1)\n */\n opacity?: number;\n /**\n * Layer visibility\n */\n visible?: boolean;\n /**\n * Enable picking on this layer\n */\n pickable?: boolean;\n /**\n * Auto highlight on hover\n */\n autoHighlight?: boolean;\n /**\n * Highlight color when autoHighlight is enabled\n */\n highlightColor?: Color;\n /**\n * NDVI range filter: pixels outside [min, max] are discarded.\n * Only applies when renderMode is 'ndvi'. Range: [-1, 1].\n */\n ndviRange?: [number, number];\n /**\n * Insert layer before this layer id\n */\n beforeId?: string;\n }\n\n const props = withDefaults(defineProps<Props>(), {\n renderMode: 'trueColor',\n maxCacheSize: Infinity,\n opacity: 1,\n visible: true,\n pickable: false,\n autoHighlight: false,\n ndviRange: () => [-1, 1] as [number, number],\n });\n\n const emit = defineEmits<{\n click: [info: PickingInfo];\n hover: [info: PickingInfo];\n sourceLoad: [source: MosaicSource];\n error: [error: Error, source?: MosaicSource];\n }>();\n\n const map = injectStrict(MapKey);\n const { addLayer, removeLayer } = useDeckOverlay(map);\n let activeLayerId = '';\n\n interface TextureData {\n texture: Texture;\n width: number;\n height: number;\n }\n\n interface LoadedModules {\n MosaicLayer: typeof import('@developmentseed/deck.gl-geotiff').MosaicLayer;\n COGLayer: typeof import('@developmentseed/deck.gl-geotiff').COGLayer;\n CreateTexture: RasterModule['module'];\n fromUrl: typeof GeoTIFF.fromUrl;\n resolveEpsg: EpsgResolver;\n }\n\n const modules = shallowRef<LoadedModules | null>(null);\n\n // Shader modules for different render modes\n const SetAlpha1 = {\n name: 'set-alpha-1',\n inject: { 'fs:DECKGL_FILTER_COLOR': `color = vec4(color.rgb, 1.0);` },\n };\n\n const FalseColorInfrared = {\n name: 'false-color-infrared',\n inject: {\n 'fs:DECKGL_FILTER_COLOR': `\n float nir = color[3];\n float red = color[0];\n float green = color[1];\n color.rgb = vec3(nir, red, green);\n `,\n },\n };\n\n // --- NDVI Pipeline: 3 separate modules matching upstream pattern ---\n // Uniforms update per-draw via MeshTextureLayer.draw() → setProps() without\n // re-rendering tiles. Baked constants don't work because renderTile only runs\n // when tiles are FIRST FETCHED — cached tiles keep old shader modules.\n\n // Step 1: Compute NDVI from raw RGBA bands, store in color.r\n const NDVICompute = {\n name: 'ndvi-compute',\n inject: {\n 'fs:DECKGL_FILTER_COLOR': `\n float nir_c = color[3];\n float red_c = color[0];\n float sum_c = nir_c + red_c;\n float ndvi_c = sum_c > 0.001 ? (nir_c - red_c) / sum_c : 0.0;\n color = vec4(ndvi_c, ndvi_c, ndvi_c, 1.0);\n `,\n },\n };\n\n // Step 2: Filter by NDVI range — uniforms update per-draw without tile re-render\n const ndviFilterUniformBlock = `\\\nuniform ndviFilterUniforms {\n float ndviMin;\n float ndviMax;\n} ndviFilter;\n`;\n\n const NDVIFilter = {\n name: 'ndviFilter',\n fs: ndviFilterUniformBlock,\n inject: {\n 'fs:DECKGL_FILTER_COLOR': `\n if (color.r < ndviFilter.ndviMin || color.r > ndviFilter.ndviMax) {\n discard;\n }\n `,\n },\n uniformTypes: {\n ndviMin: 'f32',\n ndviMax: 'f32',\n },\n getUniforms: (uniformProps: Record<string, unknown>) => ({\n ndviMin: (uniformProps.ndviMin as number) ?? -1.0,\n ndviMax: (uniformProps.ndviMax as number) ?? 1.0,\n }),\n } as const satisfies ShaderModule<{ ndviMin: number; ndviMax: number }>;\n\n // Step 3: Apply cfastie-inspired colormap gradient from color.r (NDVI value)\n const NDVIColormap = {\n name: 'ndvi-colormap',\n inject: {\n 'fs:DECKGL_FILTER_COLOR': `\n float t = clamp((color.r + 1.0) / 2.0, 0.0, 1.0);\n \n vec3 result;\n if (t < 0.4) {\n float localT = t / 0.4;\n result = mix(vec3(0.0, 0.0, 0.5), vec3(0.5, 0.8, 0.9), localT);\n } else if (t < 0.5) {\n float localT = (t - 0.4) / 0.1;\n result = mix(vec3(0.5, 0.8, 0.9), vec3(0.9, 0.9, 0.4), localT);\n } else if (t < 0.6) {\n float localT = (t - 0.5) / 0.1;\n result = mix(vec3(0.9, 0.9, 0.4), vec3(0.6, 0.8, 0.2), localT);\n } else if (t < 0.75) {\n float localT = (t - 0.6) / 0.15;\n result = mix(vec3(0.6, 0.8, 0.2), vec3(0.1, 0.6, 0.1), localT);\n } else {\n float localT = (t - 0.75) / 0.25;\n result = mix(vec3(0.1, 0.6, 0.1), vec3(0.0, 0.3, 0.0), localT);\n }\n \n color.rgb = result;\n `,\n },\n };\n\n function getRenderModules(\n mode: MosaicRenderMode,\n texture: Texture,\n mods: {\n CreateTexture: RasterModule['module'];\n },\n ndviRange: [number, number],\n customModules?: (texture: Texture) => RenderModule[],\n ): RasterModule[] {\n if (mode === 'custom' && customModules) {\n return customModules(texture) as RasterModule[];\n }\n\n const base: RasterModule[] = [\n { module: mods.CreateTexture, props: { textureName: texture } },\n ];\n\n if (mode === 'trueColor') {\n return [...base, { module: SetAlpha1 }];\n }\n\n if (mode === 'falseColor') {\n return [...base, { module: FalseColorInfrared }, { module: SetAlpha1 }];\n }\n\n // NDVI pipeline: compute → filter → colormap → alpha\n // NDVIFilter uses uniformTypes + getUniforms so uniform values update\n // per-draw via MeshTextureLayer.draw() WITHOUT re-rendering tiles.\n return [\n ...base,\n { module: NDVICompute },\n {\n module: NDVIFilter,\n props: { ndviMin: ndviRange[0], ndviMax: ndviRange[1] },\n },\n { module: NDVIColormap },\n { module: SetAlpha1 },\n ];\n }\n\n function createLayer() {\n const mods = modules.value;\n if (!mods || !props.sources.length) return null;\n\n const { MosaicLayer, COGLayer, CreateTexture, fromUrl, resolveEpsg } = mods;\n\n const rawSources = toRaw(props.sources);\n const renderMode = toRaw(props.renderMode);\n const ndviRange = toRaw(props.ndviRange) as [number, number];\n const customRenderModules = props.customRenderModules;\n\n // Fixed ID matching upstream pattern — deck.gl diffs old vs new layer\n // via setProps, detecting changed renderSource/renderTile callbacks.\n const newId = `${toRaw(props.id)}-mosaic`;\n const layer = new MosaicLayer<MosaicSource, GeoTIFF>({\n id: newId,\n sources: rawSources,\n maxCacheSize: toRaw(props.maxCacheSize),\n\n getSource: async (source) => {\n try {\n const tiff = await fromUrl(source.assets.image.href);\n emit('sourceLoad', source);\n return tiff;\n } catch (error) {\n emit('error', error as Error, source);\n throw error;\n }\n },\n\n renderSource: (source, { data, signal }) => {\n if (!data) return null;\n\n return new COGLayer<TextureData>({\n id: `cog-${source.assets.image.href}-${renderMode}`,\n geotiff: data,\n epsgResolver: resolveEpsg,\n getTileData: async (\n image: GeoTIFF | Overview,\n options: GetTileDataOptions,\n ) => {\n const { device, x, y } = options;\n const tile = await image.fetchTile(x, y, {\n signal,\n boundless: false,\n });\n const { array } = tile;\n if (array.layout === 'band-separate') {\n throw new Error('Band-separate COGs are not supported');\n }\n const texture = device.createTexture({\n data: array.data,\n format: 'rgba8unorm',\n width: array.width,\n height: array.height,\n });\n return {\n texture,\n width: array.width,\n height: array.height,\n };\n },\n renderTile: (tileData: TextureData) => ({\n image: tileData.texture,\n renderPipeline: getRenderModules(\n renderMode,\n tileData.texture,\n { CreateTexture },\n ndviRange,\n customRenderModules,\n ),\n }),\n signal,\n } as COGLayerProps<TextureData>);\n },\n } as MosaicLayerProps<MosaicSource, GeoTIFF>);\n\n return layer;\n }\n\n async function initializeLayer() {\n try {\n const [geotiffModule, rasterModule, devGeotiff, projModule] =\n await Promise.all([\n requirePeer(\n '@developmentseed/deck.gl-geotiff',\n () => import('@developmentseed/deck.gl-geotiff'),\n MOSAIC_PEER_INSTALL,\n ),\n requirePeer(\n '@developmentseed/deck.gl-raster',\n () => import('@developmentseed/deck.gl-raster/gpu-modules'),\n MOSAIC_PEER_INSTALL,\n ),\n requirePeer(\n '@developmentseed/geotiff',\n () => import('@developmentseed/geotiff'),\n MOSAIC_PEER_INSTALL,\n ),\n requirePeer(\n '@developmentseed/proj',\n () => import('@developmentseed/proj'),\n MOSAIC_PEER_INSTALL,\n ),\n ]);\n\n modules.value = markRaw({\n MosaicLayer: geotiffModule.MosaicLayer,\n COGLayer: geotiffModule.COGLayer,\n CreateTexture: rasterModule.CreateTexture,\n fromUrl: devGeotiff.GeoTIFF.fromUrl,\n resolveEpsg: projModule.epsgResolver,\n });\n\n const layer = createLayer();\n if (layer) {\n activeLayerId = (layer as { id: string }).id;\n addLayer(layer);\n }\n } catch (error) {\n console.error('[deck.gl-mosaic] Error loading MosaicLayer:', error);\n console.error(\n 'Make sure @developmentseed/deck.gl-geotiff, @developmentseed/deck.gl-raster, and @developmentseed/geotiff are installed',\n );\n emit('error', error as Error);\n }\n }\n\n watch(\n map,\n (mapInstance) => {\n if (!mapInstance) return;\n // Register unconditionally once the map exists. addLayer() routes through\n // useDeckOverlay's initOverlay(), which robustly waits for style.load via\n // its own once-listener + polling. Gating here on isStyleLoaded() was racy:\n // if style.load already fired before this watch ran, the one-shot\n // .once('style.load') never fired and the layer was never registered.\n initializeLayer();\n },\n { immediate: true },\n );\n\n watch(\n () => [\n props.sources,\n props.renderMode,\n props.ndviRange,\n props.opacity,\n props.visible,\n ],\n () => {\n if (modules.value) {\n const layer = createLayer();\n if (layer) {\n activeLayerId = (layer as { id: string }).id;\n addLayer(layer);\n }\n }\n },\n { deep: true },\n );\n\n onBeforeUnmount(() => {\n if (activeLayerId) {\n removeLayer(activeLayerId);\n }\n });\n</script>\n\n<template>\n <slot></slot>\n</template>\n"],"mappings":"kOAuCE,MAAM,EACJ,6jBAgFF,IAAM,EAAQ,EAUR,EAAO,EAOP,EAAM,EAAa,CAAM,EACzB,CAAE,WAAU,eAAgB,EAAe,CAAG,EAChD,EAAgB,GAgBd,EAAU,EAAiC,IAAI,EAG/C,EAAY,CAChB,KAAM,cACN,OAAQ,CAAE,yBAA0B,+BAAgC,CACtE,EAEM,EAAqB,CACzB,KAAM,uBACN,OAAQ,CACN,yBAA0B;;;;;OAM5B,CACF,EAQM,EAAc,CAClB,KAAM,eACN,OAAQ,CACN,yBAA0B;;;;;;OAO5B,CACF,EAUM,EAAa,CACjB,KAAM,aACN,GAAI;;;;EACJ,OAAQ,CACN,yBAA0B;;;;OAK5B,EACA,aAAc,CACZ,QAAS,MACT,QAAS,KACX,EACA,YAAc,IAA2C,CACvD,QAAU,EAAa,SAAsB,GAC7C,QAAU,EAAa,SAAsB,CAC/C,EACF,EAGM,EAAe,CACnB,KAAM,gBACN,OAAQ,CACN,yBAA0B;;;;;;;;;;;;;;;;;;;;;;OAuB5B,CACF,EAEA,SAAS,EACP,EACA,EACA,EAGA,EACA,EACgB,CAChB,GAAI,IAAS,UAAY,EACvB,OAAO,EAAc,CAAO,EAG9B,IAAM,EAAuB,CAC3B,CAAE,OAAQ,EAAK,cAAe,MAAO,CAAE,YAAa,CAAQ,CAAE,CAChE,EAaA,OAXI,IAAS,YACJ,CAAC,GAAG,EAAM,CAAE,OAAQ,CAAU,CAAC,EAGpC,IAAS,aACJ,CAAC,GAAG,EAAM,CAAE,OAAQ,CAAmB,EAAG,CAAE,OAAQ,CAAU,CAAC,EAMjE,CACL,GAAG,EACH,CAAE,OAAQ,CAAY,EACtB,CACE,OAAQ,EACR,MAAO,CAAE,QAAS,EAAU,GAAI,QAAS,EAAU,EAAG,CACxD,EACA,CAAE,OAAQ,CAAa,EACvB,CAAE,OAAQ,CAAU,CACtB,CACF,CAEA,SAAS,GAAc,CACrB,IAAM,EAAO,EAAQ,MACrB,GAAI,CAAC,GAAQ,CAAC,EAAM,QAAQ,OAAQ,OAAO,KAE3C,GAAM,CAAE,cAAa,WAAU,gBAAe,UAAS,eAAgB,EAEjE,EAAa,EAAM,EAAM,OAAO,EAChC,EAAa,EAAM,EAAM,UAAU,EACnC,EAAY,EAAM,EAAM,SAAS,EACjC,EAAsB,EAAM,oBAoElC,OAAO,IA/DW,EAAmC,CACnD,GAAI,GAFW,EAAM,EAAM,EAAE,EAAE,SAG/B,QAAS,EACT,aAAc,EAAM,EAAM,YAAY,EAEtC,UAAW,KAAO,IAAW,CAC3B,GAAI,CACF,IAAM,EAAO,MAAM,EAAQ,EAAO,OAAO,MAAM,IAAI,EAEnD,OADA,EAAK,aAAc,CAAM,EAClB,CACT,OAAS,EAAO,CAEd,MADA,EAAK,QAAS,EAAgB,CAAM,EAC9B,CACR,CACF,EAEA,cAAe,EAAQ,CAAE,OAAM,YACxB,EAEE,IAAI,EAAsB,CAC/B,GAAI,OAAO,EAAO,OAAO,MAAM,KAAK,GAAG,IACvC,QAAS,EACT,aAAc,EACd,YAAa,MACX,EACA,IACG,CACH,GAAM,CAAE,SAAQ,IAAG,KAAM,EAKnB,CAAE,SAAU,MAJC,EAAM,UAAU,EAAG,EAAG,CACvC,SACA,UAAW,EACb,CAAC,EAED,GAAI,EAAM,SAAW,gBACnB,MAAU,MAAM,sCAAsC,EAQxD,MAAO,CACL,QAPc,EAAO,cAAc,CACnC,KAAM,EAAM,KACZ,OAAQ,aACR,MAAO,EAAM,MACb,OAAQ,EAAM,MAChB,CAEE,EACA,MAAO,EAAM,MACb,OAAQ,EAAM,MAChB,CACF,EACA,WAAa,IAA2B,CACtC,MAAO,EAAS,QAChB,eAAgB,EACd,EACA,EAAS,QACT,CAAE,eAAc,EAChB,EACA,CACF,CACF,GACA,QACF,CAA+B,EA1Cb,IA4CtB,CAEO,CACT,CAEA,eAAe,GAAkB,CAC/B,GAAI,CACF,GAAM,CAAC,EAAe,EAAc,EAAY,GAC9C,MAAM,QAAQ,IAAI,CAChB,EACE,uCACM,OAAO,oCACb,CACF,EACA,EACE,sCACM,OAAO,+CACb,CACF,EACA,EACE,+BACM,OAAO,4BACb,CACF,EACA,EACE,4BACM,OAAO,yBACb,CACF,CACF,CAAC,EAEH,EAAQ,MAAQ,EAAQ,CACtB,YAAa,EAAc,YAC3B,SAAU,EAAc,SACxB,cAAe,EAAa,cAC5B,QAAS,EAAW,QAAQ,QAC5B,YAAa,EAAW,YAC1B,CAAC,EAED,IAAM,EAAQ,EAAY,EACtB,IACF,EAAiB,EAAyB,GAC1C,EAAS,CAAK,EAElB,OAAS,EAAO,CACd,QAAQ,MAAM,8CAA+C,CAAK,EAClE,QAAQ,MACN,yHACF,EACA,EAAK,QAAS,CAAc,CAC9B,CACF,QAEA,EACE,EACC,GAAgB,CACV,GAML,EAAgB,CAClB,EACA,CAAE,UAAW,EAAK,CACpB,EAEA,MACQ,CACJ,EAAM,QACN,EAAM,WACN,EAAM,UACN,EAAM,QACN,EAAM,OACR,MACM,CACJ,GAAI,EAAQ,MAAO,CACjB,IAAM,EAAQ,EAAY,EACtB,IACF,EAAiB,EAAyB,GAC1C,EAAS,CAAK,EAElB,CACF,EACA,CAAE,KAAM,EAAK,CACf,EAEA,MAAsB,CAChB,GACF,EAAY,CAAa,CAE7B,CAAC,SAID,EAAa,EAAA,OAAA,SAAA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as e,t}from"./symbols-DXKzIgbY.js";import{a as n,i as r}from"./useDeckOverlay-
|
|
2
|
-
//# sourceMappingURL=multi-cog-
|
|
1
|
+
import{r as e,t}from"./symbols-DXKzIgbY.js";import{a as n,i as r}from"./useDeckOverlay-CI56uIKH.js";import{defineComponent as i,markRaw as a,onBeforeUnmount as o,renderSlot as s,shallowRef as c,toRaw as l,watch as u}from"vue";const d=`pnpm add @deck.gl/core @deck.gl/layers @deck.gl/mapbox @developmentseed/deck.gl-geotiff @developmentseed/deck.gl-raster @developmentseed/geotiff @developmentseed/proj`,f=i({__name:`VLayerMultiCog`,props:{id:{},sources:{},composite:{},renderPipeline:{},maxError:{default:.125},maxCacheSize:{},maxCacheByteSize:{},maxRequests:{default:6},debounceTime:{},refinementStrategy:{default:`best-available`},opacity:{default:1},visible:{type:Boolean,default:!0},pickable:{type:Boolean,default:!1},autoHighlight:{type:Boolean,default:!1},beforeId:{},debug:{type:Boolean,default:!1},debugOpacity:{default:.5},debugLevel:{default:1}},emits:[`click`,`hover`,`geotiffLoad`],setup(i,{emit:f}){let p=i,m=f,h=e(t),{addLayer:g,removeLayer:_,updateLayer:v}=r(h),y=c(null),b=c(null),x=()=>{if(!y.value)return null;let e={id:l(p.id),sources:l(p.sources),opacity:l(p.opacity),visible:l(p.visible),pickable:l(p.pickable),autoHighlight:l(p.autoHighlight),debug:l(p.debug),debugOpacity:l(p.debugOpacity),debugLevel:l(p.debugLevel),maxError:l(p.maxError)};return b.value&&(e.epsgResolver=b.value),p.composite&&(e.composite=l(p.composite)),p.renderPipeline&&(e.renderPipeline=l(p.renderPipeline)),p.maxCacheSize!==void 0&&(e.maxCacheSize=l(p.maxCacheSize)),p.maxCacheByteSize!==void 0&&(e.maxCacheByteSize=l(p.maxCacheByteSize)),p.maxRequests!==6&&(e.maxRequests=l(p.maxRequests)),p.debounceTime!==void 0&&(e.debounceTime=l(p.debounceTime)),p.refinementStrategy!==`best-available`&&(e.refinementStrategy=l(p.refinementStrategy)),p.beforeId!==void 0&&(e.beforeId=l(p.beforeId)),e.onGeoTIFFLoad=(e,t)=>{m(`geotiffLoad`,e,t)},a(new y.value(e))},S=async()=>{try{let[e,t]=await Promise.all([n(`@developmentseed/deck.gl-geotiff`,()=>import(`@developmentseed/deck.gl-geotiff`),d),n(`@developmentseed/proj`,()=>import(`@developmentseed/proj`),d)]);y.value=a(e.MultiCOGLayer),b.value=t.epsgResolver;let r=x();r&&g(r)}catch(e){console.error(`[deck.gl-raster] Error loading MultiCOGLayer:`,e),console.error(`Make sure @developmentseed/deck.gl-geotiff and @developmentseed/proj are installed`)}};return u(h,e=>{e&&S()},{immediate:!0}),u(()=>[p.sources,p.composite,p.renderPipeline,p.opacity,p.visible,p.debug,p.debugOpacity,p.debugLevel,p.maxError],()=>{let e=x();e&&v(p.id,e)},{deep:!0}),o(()=>{_(p.id)}),(e,t)=>s(e.$slots,`default`)}});export{f as VLayerMultiCog};
|
|
2
|
+
//# sourceMappingURL=multi-cog-D2ys9o3u.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi-cog-B2kVLX90.js","names":[],"sources":["../src/layers/deckgl/multi-cog/VLayerMultiCog.vue"],"sourcesContent":["<script setup lang=\"ts\">\n /**\n * Multi-band split-resolution COG compositor (e.g. Sentinel-2 band combinations).\n *\n * @requires `@deck.gl/core`\n * @requires `@deck.gl/mapbox`\n * @requires `@deck.gl/layers`\n * @requires `@developmentseed/deck.gl-geotiff`\n * @requires `@developmentseed/deck.gl-raster`\n * @requires `@developmentseed/geotiff`\n * @requires `@developmentseed/proj`\n *\n * Install with:\n * `pnpm add @deck.gl/core @deck.gl/mapbox @deck.gl/layers @developmentseed/deck.gl-geotiff @developmentseed/deck.gl-raster @developmentseed/geotiff @developmentseed/proj`\n */\n /**\n * VLayerMultiCog — multi-band split-resolution COG compositing.\n *\n * Wraps @developmentseed/deck.gl-geotiff MultiCOGLayer.\n * Use case: render Sentinel-2 or other multi-band imagery where bands live in\n * separate COGs at different native resolutions. The layer opens all sources\n * in parallel, picks the finest as the primary tileset, and the GPU\n * resamples lower-resolution bands to match.\n *\n * @see https://github.com/developmentseed/deck.gl-raster/blob/main/examples/sentinel-2/src/App.tsx\n */\n import { onBeforeUnmount, watch, shallowRef, markRaw, toRaw } from 'vue';\n import type { PickingInfo } from '@deck.gl/core';\n import type { RasterModule } from '@developmentseed/deck.gl-raster';\n import type { MultiCOGSourceConfig } from '@developmentseed/deck.gl-geotiff';\n import type { GeoTIFF } from '@developmentseed/geotiff';\n import { injectStrict, MapKey, requirePeer } from '../../../utils';\n\n const MULTICOG_PEER_INSTALL =\n 'pnpm add @deck.gl/core @deck.gl/layers @deck.gl/mapbox @developmentseed/deck.gl-geotiff @developmentseed/deck.gl-raster @developmentseed/geotiff @developmentseed/proj';\n import { useDeckOverlay } from '../_shared/useDeckOverlay';\n\n /**\n * Maps source band names to RGB(A) output channels for the compositing step.\n */\n export interface MultiCogComposite {\n r: string;\n g?: string;\n b?: string;\n a?: string;\n }\n\n interface Props {\n id: string;\n /**\n * Named sources — each key is the band name. Pass at least one entry per\n * band referenced in `composite`.\n */\n sources: Record<string, MultiCOGSourceConfig>;\n /**\n * Map source band names to RGB(A) output channels. Defaults to passing\n * the first source through to all channels (greyscale) if omitted.\n */\n composite?: MultiCogComposite;\n /**\n * Post-processing render pipeline modules applied after band compositing\n * (e.g. LinearRescale, ColormapSprite, NDVI).\n */\n renderPipeline?: RasterModule[];\n /** Max reprojection error in pixels for mesh refinement. */\n maxError?: number;\n /** Maximum number of tiles to cache. */\n maxCacheSize?: number;\n /** Maximum cached tile byte size. */\n maxCacheByteSize?: number;\n /** Maximum concurrent tile requests. */\n maxRequests?: number;\n /** Tile fetch debounce (ms). */\n debounceTime?: number;\n /** Tile refinement strategy. */\n refinementStrategy?: 'best-available' | 'no-overlap' | 'never';\n /** Layer opacity (0-1). */\n opacity?: number;\n /** Layer visibility. */\n visible?: boolean;\n /** Enable picking. */\n pickable?: boolean;\n /** Auto-highlight on hover. */\n autoHighlight?: boolean;\n /** Insert layer before this layer id. */\n beforeId?: string;\n /** Show debug overlay on tiles. */\n debug?: boolean;\n /** Debug overlay opacity (0-1). */\n debugOpacity?: number;\n /** Debug verbosity: 1=coords, 2=+uv/tiles, 3=+stitched-size/meters/px. */\n debugLevel?: 1 | 2 | 3;\n }\n\n const props = withDefaults(defineProps<Props>(), {\n maxError: 0.125,\n maxRequests: 6,\n refinementStrategy: 'best-available',\n opacity: 1,\n visible: true,\n pickable: false,\n autoHighlight: false,\n debug: false,\n debugOpacity: 0.5,\n debugLevel: 1,\n });\n\n const emit = defineEmits<{\n click: [info: PickingInfo];\n hover: [info: PickingInfo];\n geotiffLoad: [\n sources: Map<string, GeoTIFF>,\n options: {\n primaryKey: string;\n geographicBounds: {\n west: number;\n south: number;\n east: number;\n north: number;\n };\n },\n ];\n }>();\n\n const map = injectStrict(MapKey);\n const { addLayer, removeLayer, updateLayer } = useDeckOverlay(map);\n\n const MultiCOGLayerClass = shallowRef<\n typeof import('@developmentseed/deck.gl-geotiff').MultiCOGLayer | null\n >(null);\n const epsgResolverFn = shallowRef<\n typeof import('@developmentseed/proj').epsgResolver | null\n >(null);\n\n const createLayer = () => {\n if (!MultiCOGLayerClass.value) return null;\n\n const layerProps: Record<string, unknown> = {\n id: toRaw(props.id),\n sources: toRaw(props.sources),\n opacity: toRaw(props.opacity),\n visible: toRaw(props.visible),\n pickable: toRaw(props.pickable),\n autoHighlight: toRaw(props.autoHighlight),\n debug: toRaw(props.debug),\n debugOpacity: toRaw(props.debugOpacity),\n debugLevel: toRaw(props.debugLevel),\n maxError: toRaw(props.maxError),\n };\n\n if (epsgResolverFn.value) {\n layerProps.epsgResolver = epsgResolverFn.value;\n }\n\n if (props.composite) {\n layerProps.composite = toRaw(props.composite);\n }\n if (props.renderPipeline) {\n layerProps.renderPipeline = toRaw(props.renderPipeline);\n }\n if (props.maxCacheSize !== undefined)\n layerProps.maxCacheSize = toRaw(props.maxCacheSize);\n if (props.maxCacheByteSize !== undefined)\n layerProps.maxCacheByteSize = toRaw(props.maxCacheByteSize);\n if (props.maxRequests !== 6)\n layerProps.maxRequests = toRaw(props.maxRequests);\n if (props.debounceTime !== undefined)\n layerProps.debounceTime = toRaw(props.debounceTime);\n if (props.refinementStrategy !== 'best-available')\n layerProps.refinementStrategy = toRaw(props.refinementStrategy);\n if (props.beforeId !== undefined)\n layerProps.beforeId = toRaw(props.beforeId);\n\n layerProps.onGeoTIFFLoad = (\n sources: Map<string, GeoTIFF>,\n options: {\n primaryKey: string;\n geographicBounds: {\n west: number;\n south: number;\n east: number;\n north: number;\n };\n },\n ) => {\n emit('geotiffLoad', sources, options);\n };\n\n const layer = new MultiCOGLayerClass.value(layerProps);\n return markRaw(layer);\n };\n\n const initializeLayer = async () => {\n try {\n const [geotiffModule, projModule] = await Promise.all([\n requirePeer(\n '@developmentseed/deck.gl-geotiff',\n () => import('@developmentseed/deck.gl-geotiff'),\n MULTICOG_PEER_INSTALL,\n ),\n requirePeer(\n '@developmentseed/proj',\n () => import('@developmentseed/proj'),\n MULTICOG_PEER_INSTALL,\n ),\n ]);\n\n MultiCOGLayerClass.value = markRaw(geotiffModule.MultiCOGLayer);\n epsgResolverFn.value = projModule.epsgResolver;\n\n const layer = createLayer();\n if (layer) {\n addLayer(layer);\n }\n } catch (error) {\n console.error('[deck.gl-raster] Error loading MultiCOGLayer:', error);\n console.error(\n 'Make sure @developmentseed/deck.gl-geotiff and @developmentseed/proj are installed',\n );\n }\n };\n\n watch(\n map,\n (mapInstance) => {\n if (!mapInstance) return;\n // Register unconditionally once the map exists. addLayer() routes through\n // useDeckOverlay's initOverlay(), which robustly waits for style.load via\n // its own once-listener + polling. Gating here on isStyleLoaded() was racy:\n // if style.load already fired before this watch ran, the one-shot\n // .once('style.load') never fired and the layer was never registered.\n initializeLayer();\n },\n { immediate: true },\n );\n\n watch(\n () => [\n props.sources,\n props.composite,\n props.renderPipeline,\n props.opacity,\n props.visible,\n props.debug,\n props.debugOpacity,\n props.debugLevel,\n props.maxError,\n ],\n () => {\n const layer = createLayer();\n if (layer) {\n updateLayer(props.id, layer);\n }\n },\n { deep: true },\n );\n\n onBeforeUnmount(() => {\n removeLayer(props.id);\n });\n</script>\n\n<template>\n <slot></slot>\n</template>\n"],"mappings":"kOAiCE,MAAM,EACJ,sqBA4DF,IAAM,EAAQ,EAaR,EAAO,EAiBP,EAAM,EAAa,CAAM,EACzB,CAAE,WAAU,cAAa,eAAgB,EAAe,CAAG,EAE3D,EAAqB,EAEzB,IAAI,EACA,EAAiB,EAErB,IAAI,EAEA,MAAoB,CACxB,GAAI,CAAC,EAAmB,MAAO,OAAO,KAEtC,IAAM,EAAsC,CAC1C,GAAI,EAAM,EAAM,EAAE,EAClB,QAAS,EAAM,EAAM,OAAO,EAC5B,QAAS,EAAM,EAAM,OAAO,EAC5B,QAAS,EAAM,EAAM,OAAO,EAC5B,SAAU,EAAM,EAAM,QAAQ,EAC9B,cAAe,EAAM,EAAM,aAAa,EACxC,MAAO,EAAM,EAAM,KAAK,EACxB,aAAc,EAAM,EAAM,YAAY,EACtC,WAAY,EAAM,EAAM,UAAU,EAClC,SAAU,EAAM,EAAM,QAAQ,CAChC,EAyCA,OAvCI,EAAe,QACjB,EAAW,aAAe,EAAe,OAGvC,EAAM,YACR,EAAW,UAAY,EAAM,EAAM,SAAS,GAE1C,EAAM,iBACR,EAAW,eAAiB,EAAM,EAAM,cAAc,GAEpD,EAAM,eAAiB,IAAA,KACzB,EAAW,aAAe,EAAM,EAAM,YAAY,GAChD,EAAM,mBAAqB,IAAA,KAC7B,EAAW,iBAAmB,EAAM,EAAM,gBAAgB,GACxD,EAAM,cAAgB,IACxB,EAAW,YAAc,EAAM,EAAM,WAAW,GAC9C,EAAM,eAAiB,IAAA,KACzB,EAAW,aAAe,EAAM,EAAM,YAAY,GAChD,EAAM,qBAAuB,mBAC/B,EAAW,mBAAqB,EAAM,EAAM,kBAAkB,GAC5D,EAAM,WAAa,IAAA,KACrB,EAAW,SAAW,EAAM,EAAM,QAAQ,GAE5C,EAAW,eACT,EACA,IASG,CACH,EAAK,cAAe,EAAS,CAAO,CACtC,EAGO,EAAQ,IADG,EAAmB,MAAM,CAC5B,CAAK,CACtB,EAEM,EAAkB,SAAY,CAClC,GAAI,CACF,GAAM,CAAC,EAAe,GAAc,MAAM,QAAQ,IAAI,CACpD,EACE,uCACM,OAAO,oCACb,CACF,EACA,EACE,4BACM,OAAO,yBACb,CACF,CACF,CAAC,EAED,EAAmB,MAAQ,EAAQ,EAAc,aAAa,EAC9D,EAAe,MAAQ,EAAW,aAElC,IAAM,EAAQ,EAAY,EACtB,GACF,EAAS,CAAK,CAElB,OAAS,EAAO,CACd,QAAQ,MAAM,gDAAiD,CAAK,EACpE,QAAQ,MACN,oFACF,CACF,CACF,SAEA,EACE,EACC,GAAgB,CACV,GAML,EAAgB,CAClB,EACA,CAAE,UAAW,EAAK,CACpB,EAEA,MACQ,CACJ,EAAM,QACN,EAAM,UACN,EAAM,eACN,EAAM,QACN,EAAM,QACN,EAAM,MACN,EAAM,aACN,EAAM,WACN,EAAM,QACR,MACM,CACJ,IAAM,EAAQ,EAAY,EACtB,GACF,EAAY,EAAM,GAAI,CAAK,CAE/B,EACA,CAAE,KAAM,EAAK,CACf,EAEA,MAAsB,CACpB,EAAY,EAAM,EAAE,CACtB,CAAC,SAID,EAAa,EAAA,OAAA,SAAA"}
|
|
1
|
+
{"version":3,"file":"multi-cog-D2ys9o3u.js","names":[],"sources":["../src/layers/deckgl/multi-cog/VLayerMultiCog.vue"],"sourcesContent":["<script setup lang=\"ts\">\n /**\n * Multi-band split-resolution COG compositor (e.g. Sentinel-2 band combinations).\n *\n * @requires `@deck.gl/core`\n * @requires `@deck.gl/mapbox`\n * @requires `@deck.gl/layers`\n * @requires `@developmentseed/deck.gl-geotiff`\n * @requires `@developmentseed/deck.gl-raster`\n * @requires `@developmentseed/geotiff`\n * @requires `@developmentseed/proj`\n *\n * Install with:\n * `pnpm add @deck.gl/core @deck.gl/mapbox @deck.gl/layers @developmentseed/deck.gl-geotiff @developmentseed/deck.gl-raster @developmentseed/geotiff @developmentseed/proj`\n */\n /**\n * VLayerMultiCog — multi-band split-resolution COG compositing.\n *\n * Wraps @developmentseed/deck.gl-geotiff MultiCOGLayer.\n * Use case: render Sentinel-2 or other multi-band imagery where bands live in\n * separate COGs at different native resolutions. The layer opens all sources\n * in parallel, picks the finest as the primary tileset, and the GPU\n * resamples lower-resolution bands to match.\n *\n * @see https://github.com/developmentseed/deck.gl-raster/blob/main/examples/sentinel-2/src/App.tsx\n */\n import { onBeforeUnmount, watch, shallowRef, markRaw, toRaw } from 'vue';\n import type { PickingInfo } from '@deck.gl/core';\n import type { RasterModule } from '@developmentseed/deck.gl-raster';\n import type { MultiCOGSourceConfig } from '@developmentseed/deck.gl-geotiff';\n import type { GeoTIFF } from '@developmentseed/geotiff';\n import { injectStrict, MapKey, requirePeer } from '../../../utils';\n\n const MULTICOG_PEER_INSTALL =\n 'pnpm add @deck.gl/core @deck.gl/layers @deck.gl/mapbox @developmentseed/deck.gl-geotiff @developmentseed/deck.gl-raster @developmentseed/geotiff @developmentseed/proj';\n import { useDeckOverlay } from '../_shared/useDeckOverlay';\n\n /**\n * Maps source band names to RGB(A) output channels for the compositing step.\n */\n export interface MultiCogComposite {\n r: string;\n g?: string;\n b?: string;\n a?: string;\n }\n\n interface Props {\n id: string;\n /**\n * Named sources — each key is the band name. Pass at least one entry per\n * band referenced in `composite`.\n */\n sources: Record<string, MultiCOGSourceConfig>;\n /**\n * Map source band names to RGB(A) output channels. Defaults to passing\n * the first source through to all channels (greyscale) if omitted.\n */\n composite?: MultiCogComposite;\n /**\n * Post-processing render pipeline modules applied after band compositing\n * (e.g. LinearRescale, ColormapSprite, NDVI).\n */\n renderPipeline?: RasterModule[];\n /** Max reprojection error in pixels for mesh refinement. */\n maxError?: number;\n /** Maximum number of tiles to cache. */\n maxCacheSize?: number;\n /** Maximum cached tile byte size. */\n maxCacheByteSize?: number;\n /** Maximum concurrent tile requests. */\n maxRequests?: number;\n /** Tile fetch debounce (ms). */\n debounceTime?: number;\n /** Tile refinement strategy. */\n refinementStrategy?: 'best-available' | 'no-overlap' | 'never';\n /** Layer opacity (0-1). */\n opacity?: number;\n /** Layer visibility. */\n visible?: boolean;\n /** Enable picking. */\n pickable?: boolean;\n /** Auto-highlight on hover. */\n autoHighlight?: boolean;\n /** Insert layer before this layer id. */\n beforeId?: string;\n /** Show debug overlay on tiles. */\n debug?: boolean;\n /** Debug overlay opacity (0-1). */\n debugOpacity?: number;\n /** Debug verbosity: 1=coords, 2=+uv/tiles, 3=+stitched-size/meters/px. */\n debugLevel?: 1 | 2 | 3;\n }\n\n const props = withDefaults(defineProps<Props>(), {\n maxError: 0.125,\n maxRequests: 6,\n refinementStrategy: 'best-available',\n opacity: 1,\n visible: true,\n pickable: false,\n autoHighlight: false,\n debug: false,\n debugOpacity: 0.5,\n debugLevel: 1,\n });\n\n const emit = defineEmits<{\n click: [info: PickingInfo];\n hover: [info: PickingInfo];\n geotiffLoad: [\n sources: Map<string, GeoTIFF>,\n options: {\n primaryKey: string;\n geographicBounds: {\n west: number;\n south: number;\n east: number;\n north: number;\n };\n },\n ];\n }>();\n\n const map = injectStrict(MapKey);\n const { addLayer, removeLayer, updateLayer } = useDeckOverlay(map);\n\n const MultiCOGLayerClass = shallowRef<\n typeof import('@developmentseed/deck.gl-geotiff').MultiCOGLayer | null\n >(null);\n const epsgResolverFn = shallowRef<\n typeof import('@developmentseed/proj').epsgResolver | null\n >(null);\n\n const createLayer = () => {\n if (!MultiCOGLayerClass.value) return null;\n\n const layerProps: Record<string, unknown> = {\n id: toRaw(props.id),\n sources: toRaw(props.sources),\n opacity: toRaw(props.opacity),\n visible: toRaw(props.visible),\n pickable: toRaw(props.pickable),\n autoHighlight: toRaw(props.autoHighlight),\n debug: toRaw(props.debug),\n debugOpacity: toRaw(props.debugOpacity),\n debugLevel: toRaw(props.debugLevel),\n maxError: toRaw(props.maxError),\n };\n\n if (epsgResolverFn.value) {\n layerProps.epsgResolver = epsgResolverFn.value;\n }\n\n if (props.composite) {\n layerProps.composite = toRaw(props.composite);\n }\n if (props.renderPipeline) {\n layerProps.renderPipeline = toRaw(props.renderPipeline);\n }\n if (props.maxCacheSize !== undefined)\n layerProps.maxCacheSize = toRaw(props.maxCacheSize);\n if (props.maxCacheByteSize !== undefined)\n layerProps.maxCacheByteSize = toRaw(props.maxCacheByteSize);\n if (props.maxRequests !== 6)\n layerProps.maxRequests = toRaw(props.maxRequests);\n if (props.debounceTime !== undefined)\n layerProps.debounceTime = toRaw(props.debounceTime);\n if (props.refinementStrategy !== 'best-available')\n layerProps.refinementStrategy = toRaw(props.refinementStrategy);\n if (props.beforeId !== undefined)\n layerProps.beforeId = toRaw(props.beforeId);\n\n layerProps.onGeoTIFFLoad = (\n sources: Map<string, GeoTIFF>,\n options: {\n primaryKey: string;\n geographicBounds: {\n west: number;\n south: number;\n east: number;\n north: number;\n };\n },\n ) => {\n emit('geotiffLoad', sources, options);\n };\n\n const layer = new MultiCOGLayerClass.value(layerProps);\n return markRaw(layer);\n };\n\n const initializeLayer = async () => {\n try {\n const [geotiffModule, projModule] = await Promise.all([\n requirePeer(\n '@developmentseed/deck.gl-geotiff',\n () => import('@developmentseed/deck.gl-geotiff'),\n MULTICOG_PEER_INSTALL,\n ),\n requirePeer(\n '@developmentseed/proj',\n () => import('@developmentseed/proj'),\n MULTICOG_PEER_INSTALL,\n ),\n ]);\n\n MultiCOGLayerClass.value = markRaw(geotiffModule.MultiCOGLayer);\n epsgResolverFn.value = projModule.epsgResolver;\n\n const layer = createLayer();\n if (layer) {\n addLayer(layer);\n }\n } catch (error) {\n console.error('[deck.gl-raster] Error loading MultiCOGLayer:', error);\n console.error(\n 'Make sure @developmentseed/deck.gl-geotiff and @developmentseed/proj are installed',\n );\n }\n };\n\n watch(\n map,\n (mapInstance) => {\n if (!mapInstance) return;\n // Register unconditionally once the map exists. addLayer() routes through\n // useDeckOverlay's initOverlay(), which robustly waits for style.load via\n // its own once-listener + polling. Gating here on isStyleLoaded() was racy:\n // if style.load already fired before this watch ran, the one-shot\n // .once('style.load') never fired and the layer was never registered.\n initializeLayer();\n },\n { immediate: true },\n );\n\n watch(\n () => [\n props.sources,\n props.composite,\n props.renderPipeline,\n props.opacity,\n props.visible,\n props.debug,\n props.debugOpacity,\n props.debugLevel,\n props.maxError,\n ],\n () => {\n const layer = createLayer();\n if (layer) {\n updateLayer(props.id, layer);\n }\n },\n { deep: true },\n );\n\n onBeforeUnmount(() => {\n removeLayer(props.id);\n });\n</script>\n\n<template>\n <slot></slot>\n</template>\n"],"mappings":"kOAiCE,MAAM,EACJ,sqBA4DF,IAAM,EAAQ,EAaR,EAAO,EAiBP,EAAM,EAAa,CAAM,EACzB,CAAE,WAAU,cAAa,eAAgB,EAAe,CAAG,EAE3D,EAAqB,EAEzB,IAAI,EACA,EAAiB,EAErB,IAAI,EAEA,MAAoB,CACxB,GAAI,CAAC,EAAmB,MAAO,OAAO,KAEtC,IAAM,EAAsC,CAC1C,GAAI,EAAM,EAAM,EAAE,EAClB,QAAS,EAAM,EAAM,OAAO,EAC5B,QAAS,EAAM,EAAM,OAAO,EAC5B,QAAS,EAAM,EAAM,OAAO,EAC5B,SAAU,EAAM,EAAM,QAAQ,EAC9B,cAAe,EAAM,EAAM,aAAa,EACxC,MAAO,EAAM,EAAM,KAAK,EACxB,aAAc,EAAM,EAAM,YAAY,EACtC,WAAY,EAAM,EAAM,UAAU,EAClC,SAAU,EAAM,EAAM,QAAQ,CAChC,EAyCA,OAvCI,EAAe,QACjB,EAAW,aAAe,EAAe,OAGvC,EAAM,YACR,EAAW,UAAY,EAAM,EAAM,SAAS,GAE1C,EAAM,iBACR,EAAW,eAAiB,EAAM,EAAM,cAAc,GAEpD,EAAM,eAAiB,IAAA,KACzB,EAAW,aAAe,EAAM,EAAM,YAAY,GAChD,EAAM,mBAAqB,IAAA,KAC7B,EAAW,iBAAmB,EAAM,EAAM,gBAAgB,GACxD,EAAM,cAAgB,IACxB,EAAW,YAAc,EAAM,EAAM,WAAW,GAC9C,EAAM,eAAiB,IAAA,KACzB,EAAW,aAAe,EAAM,EAAM,YAAY,GAChD,EAAM,qBAAuB,mBAC/B,EAAW,mBAAqB,EAAM,EAAM,kBAAkB,GAC5D,EAAM,WAAa,IAAA,KACrB,EAAW,SAAW,EAAM,EAAM,QAAQ,GAE5C,EAAW,eACT,EACA,IASG,CACH,EAAK,cAAe,EAAS,CAAO,CACtC,EAGO,EAAQ,IADG,EAAmB,MAAM,CAC5B,CAAK,CACtB,EAEM,EAAkB,SAAY,CAClC,GAAI,CACF,GAAM,CAAC,EAAe,GAAc,MAAM,QAAQ,IAAI,CACpD,EACE,uCACM,OAAO,oCACb,CACF,EACA,EACE,4BACM,OAAO,yBACb,CACF,CACF,CAAC,EAED,EAAmB,MAAQ,EAAQ,EAAc,aAAa,EAC9D,EAAe,MAAQ,EAAW,aAElC,IAAM,EAAQ,EAAY,EACtB,GACF,EAAS,CAAK,CAElB,OAAS,EAAO,CACd,QAAQ,MAAM,gDAAiD,CAAK,EACpE,QAAQ,MACN,oFACF,CACF,CACF,SAEA,EACE,EACC,GAAgB,CACV,GAML,EAAgB,CAClB,EACA,CAAE,UAAW,EAAK,CACpB,EAEA,MACQ,CACJ,EAAM,QACN,EAAM,UACN,EAAM,eACN,EAAM,QACN,EAAM,QACN,EAAM,MACN,EAAM,aACN,EAAM,WACN,EAAM,QACR,MACM,CACJ,IAAM,EAAQ,EAAY,EACtB,GACF,EAAY,EAAM,GAAI,CAAK,CAE/B,EACA,CAAE,KAAM,EAAK,CACf,EAEA,MAAsB,CACpB,EAAY,EAAM,EAAE,CACtB,CAAC,SAID,EAAa,EAAA,OAAA,SAAA"}
|