map-ol-utils 1.1.4 → 1.1.6

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/README.md CHANGED
@@ -750,9 +750,20 @@ const unsubscribe = route.subscribe((state) => {
750
750
 
751
751
  ### 普通航点删除回调
752
752
 
753
+ `removeWaypoint(pointOrUuid?, options?: RouteRemoveWaypointOptions)` 仅在编辑模式删除普通航点,支持本航线 UUID 字符串或 `Feature<Point>`,省略第一个参数时删除选中点。UUID 按原值精确匹配,不存在或为空时返回 `false`,不会回退删除当前选中点。
754
+
755
+ ```ts
756
+ route.setMode('edit')
757
+ route.removeWaypoint('目标航点UUID') // 默认执行删除前拦截
758
+ route.removeWaypoint('目标航点UUID', { intercept: false }) // 本次跳过删除前回调
759
+ route.removeWaypoint(undefined, { intercept: false }) // 删除选中点,本次跳过拦截
760
+ ```
761
+
762
+ `options.intercept` 默认启用。设为 `false` 只跳过 `onBeforeWaypointRemove`;起飞点、当前航线归属、未提交插点和编辑模式校验仍保留,成功后照常触发 `onWaypointRemove`。此设置仅影响当前调用。
763
+
753
764
  `onBeforeWaypointRemove(waypoint: RouteWaypoint)` 在 `removeWaypoint()` 通过校验后、执行删除前同步调用;`onWaypointRemove(waypoint: RouteWaypoint)` 在删除成功、点线和编辑状态更新完成后同步调用。两者仅针对普通航点,参数都是航点顶层副本,`indexNo` 保留各自通知阶段删除前的序号。嵌套业务数据应只读使用。
754
765
 
755
- 起飞点不能删除,尝试删除时返回 `false`,两个回调都不触发。非编辑模式、未选中点、其他航线、已删除的点或尚未结束拖动的临时插点,以及清空航线、销毁、导入替换和取消插点也不触发。
766
+ 起飞点不能删除,尝试删除时返回 `false`,两个回调都不触发。非编辑模式、无参调用时未选中点、其他航线、已删除的点或尚未结束拖动的临时插点,以及清空航线、销毁、导入替换和取消插点也不触发。
756
767
 
757
768
  删除前回调同步返回 `boolean | void`:只有返回 `false` 才阻止删除,返回 `true`、不返回值或未配置回调都继续删除。被阻止时 `removeWaypoint()` 返回 `false`,保留航点、选择和编辑交互,不触发 `onWaypointRemove`;回调自身造成的修改不会撤销。不支持异步返回,不等待 Promise。回调抛错会中止删除并向调用方传播;若回调清空、导入、销毁或切换模式,当前删除停止并返回 `false`。删除后回调可清空、导入或销毁;抛错向调用方传播,已完成的删除不回滚。删除过程的同步状态通知若已销毁控制器,则不再调用删除后回调。
758
769
 
@@ -767,13 +778,24 @@ const unsubscribe = route.subscribe((state) => {
767
778
  | `mode` | 当前互斥操作模式 |
768
779
  | `hasTakeoff` | 是否已有起飞点 |
769
780
  | `waypointCount` | 航点数,包含起飞点,不包含临时飞机与编辑手柄 |
781
+ | `totalDistance` | 相邻航点的球面水平距离之和,单位米;少于两个点时为 0,不计高度差、临时飞机或自动返航段 |
770
782
  | `selectedWaypoint` | 选中航点的普通数据,未选中为 `null` |
771
- | `aircraft` | 实时飞机的经纬度、`heading`、`height`、`speed`,未操控为 `null` |
783
+ | `aircraft` | 操控时返回实时飞机的经纬度、`heading`、`height`、`speed`,其他模式返回末个已记录航点的飞机信息;无航点时为 `null` |
772
784
  | `activeControls` | 合并后的键盘、指针动作,用于按钮高亮 |
773
785
  | `editConfig` | 当前中点或吸附配置 |
774
786
 
775
787
  实时通知只读取飞机与选中点,不逐帧导出整条航线。快照的数组、配置与航点顶层对象独立;航点嵌套业务对象与导出一样仍保留引用,应作为只读数据使用。业务表单、提示文案、权限与后端保存仍由调用方负责。
776
788
 
789
+ 设置起飞点后立即通知 `aircraft`:位置为起飞点,初始航向和高度为 0,`speed` 为控制器配置速度(默认 10 m/s)。非操控期间跟随末个已记录航点的位置、内部航向和高度;导入时航向取 `direction`、高度取 `height`。进入操控后使用实时飞机,退出后恢复末点信息,未打点的移动不保留;清空后为 `null`。`speed` 始终为配置速度,不是实时测速,也不使用业务字段 `pointSpeed`。判断是否正在操控请使用 `mode === 'control'`,不要用 `aircraft !== null`。
790
+
791
+ `totalDistance` 使用 `EPSG:4326` 经纬度计算,按航线几何版本缓存,多个订阅者和飞机帧复用计算结果。新增、导入、删除、修改起飞点和编辑完成后,随状态通知更新;清空归零。拖动中主动调用 `getState()` 会读到当前临时航线长度,取消拖动后恢复。
792
+
793
+ ```ts
794
+ route.subscribe(({ totalDistance }) => {
795
+ console.log(`航线总长度:${totalDistance.toFixed(1)} 米`)
796
+ })
797
+ ```
798
+
777
799
  ### 业务面板与输入
778
800
 
779
801
  操作面板由业务创建、布局并根据状态控制显示。库不创建或删除业务 DOM,负责输入事件、可选激活颜色与生命周期。传入操控区和编辑区的公共容器,无需单独传编辑面板或调用绑定方法;也可以只配置 `input.keyboard: true` 使用键盘,或省略输入配置只使用地图绘制。
@@ -812,6 +834,8 @@ const route = createRouteController({
812
834
 
813
835
  ### 航线样式与数据约定
814
836
 
837
+ 默认起飞点使用橙色 `#FFA01E` 的 23×32 SVG 图标,底部居中锚点对齐地图坐标,替换原圆点,下方显示橙色“起飞点”文字与白色描边。仅在首次渲染时创建图标;起飞点同时为末点时仍叠加飞机样式。传入 `takeoffStyle` 可覆盖默认图标。
838
+
815
839
  不传 `style` 时,库提供起飞点、普通点、连线、末点飞机与航向旋转的完整样式。显式传入整体 `style` 时,未配置的分类继承整体样式;`null` 隐藏整体样式,分类空数组隐藏该分类。`takeoffStyle`、`lineStyle`、`pointStyle`、`aircraftStyle` 和 `midpointStyle` 仍可分别覆盖。自定义飞机样式自行根据 `heading` 设置旋转。图层配置支持 `layerName`、`zIndex`、`visible`、`minZoom` 与 `maxZoom`。
816
840
 
817
841
  `getLayer()` 保留底层数据访问能力,但清空与替换必须使用 `clear()` 或 `importWaypoints()`,不要直接清理数据源导致内部状态失配。首点标记 `isTakeoff`,停止后末点标记 `isAircraft`;操控期间飞机由临时图层显示,不写入导出数据。航点有稳定 UUID,修改位置不改变标识。所有业务属性保存在独立 `extData` 中;高度为有限非负米数,点击新增继承末点高度,操控打点使用飞机高度,插点继承前点高度,其他业务配置不自动继承。
@@ -906,7 +930,7 @@ route.adjustWaypointHeight(1) // 选中航点升高 1 米,最低 0
906
930
  route.setMode('idle') // 完成编辑并保留结果
907
931
  ```
908
932
 
909
- 中点模式拖动固定手柄插入航点,吸附模式沿整条线定位临时点后拖动插入;悬停和单击不插点。拖动与插入会同步线坐标,重复坐标回滚。`getSelectedWaypoint()` 仍可读取底层 Feature;`removeWaypoint(point?)`、`adjustWaypointHeight(delta, point?)` 可省略参数操作当前选择。起飞点不能删除,但可以显式传入起飞点调整高度。删除全部普通点后保留起飞点并移除线。
933
+ 中点模式拖动固定手柄插入航点,吸附模式沿整条线定位临时点后拖动插入;悬停和单击不插点。拖动与插入会同步线坐标,重复坐标回滚。`getSelectedWaypoint()` 仍可读取底层 Feature;`removeWaypoint(pointOrUuid?, options?)` 支持按 UUID 或 Feature 删除,省略目标时操作当前选择;`adjustWaypointHeight(delta, point?)` 省略航点参数时调整当前选择。起飞点不能删除,但可以显式传入起飞点调整高度。删除全部普通点后保留起飞点并移除线。
910
934
 
911
935
  创建配置的 `speed`、`turnSpeed`、`verticalSpeed` 默认分别为 10 m/s、60°/s、1 m/s,均为有限正数,创建后固定。新启动飞控从最后确认的航点及其高度开始,机头朝北;重复进入 `control` 保持当前飞机状态。按球面距离计算位移,移动时视野跟随,手动平移不修改飞机位置;单独转向、升降和打点不改变地图中心。动画帧停顿最多计入 100ms。编辑单次高度步长不受飞控速度影响。临时飞机不进入导出结果,持久化拖动结果应等待拖动结束。
912
936
 
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,s)=>(s=n==null?{}:e(i(n)),o(r||!n||!n.__esModule||!a.call(n,`default`)?t(s,`default`,{value:n,enumerable:!0}):s,n));let c=require("tdt-vts-core"),l=require("ol/format/MVT");l=s(l,1);let u=require("ol/layer/VectorTile");u=s(u,1);let d=require("ol/TileState");d=s(d,1);let f=require("ol/source/VectorTile");f=s(f,1);let p=require("mitt");p=s(p,1);let m=require("ol/source"),h=require("ol/layer/Tile");h=s(h,1);let g=require("ol/format"),_=require("ol/source/WMTS"),v=require("ol/tilegrid"),y=require("ol/layer"),b=require("ol/tilegrid/WMTS");b=s(b,1);let x=require("ol/Observable"),S=require("ol/layer/Image");S=s(S,1);let C=require("ol/source/Raster");C=s(C,1);let w=require("ol/Map");w=s(w,1);let T=require("ol/View");T=s(T,1);let E=require("ol/control"),D=require("gcoord");D=s(D,1);let O=require("ol"),k=require("ol/interaction"),A=require("ol/extent"),j=require("ol/events/condition"),M=require("ol/Feature");M=s(M,1);let N=require("ol/geom/Point");N=s(N,1);let P=require("ol/layer/Vector");P=s(P,1);let F=require("ol/source/Vector");F=s(F,1);let I=require("ol/style"),L=require("ol/interaction/Draw");L=s(L,1);let R=require("ol/sphere"),ee=require("ol/geom/LineString");ee=s(ee,1);let z=require("ol/interaction/Interaction");z=s(z,1);let B=require("ol/style/Circle");B=s(B,1);let V=require("ol/style/Fill");V=s(V,1);let H=require("ol/style/Icon");H=s(H,1);let U=require("ol/style/Stroke");U=s(U,1);let W=require("ol/style/Style");W=s(W,1);let G=require("ol/style/Text");G=s(G,1);let K=require("ol/Collection");K=s(K,1);let te=require("ol/interaction/Select");te=s(te,1);let q=require("ol/interaction/Translate");q=s(q,1);let ne=require("ol/interaction/Snap");ne=s(ne,1);let re=require("ol/format/GeoJSON");re=s(re,1);let J=require("ol/geom"),Y=require("ol/source/Cluster");Y=s(Y,1);let X=/* @__PURE__ */ function(e){return e.LineString=`LineString`,e.MultiLineString=`MultiLineString`,e.Polygon=`Polygon`,e.MultiPolygon=`MultiPolygon`,e.Invalid=`Invalid`,e}({});const Z=async e=>{if(typeof e!=`string`)return e;if(!e.trim())throw TypeError(`style 地址不能为空`);let t=await fetch(e);if(!t.ok)throw Error(`加载 style 失败:HTTP ${t.status}`);return await t.json()},Q=e=>{if(!e.hosts?.length||e.hosts.some(e=>!e.trim()))throw TypeError(`hosts 不能为空`);let t=new c.TdtDecoderWorkerClient(e.restoreMode,e.decoderOptions),n=new l.default({layerName:`mvt:layer`}),r=new f.default({projection:`EPSG:3857`,minZoom:e.minZoom??1,maxZoom:e.maxZoom??18,tileSize:512,wrapX:!0,format:n,attributions:`© <a href="https://www.tianditu.gov.cn/" target="_blank" rel="noopener">天地图</a>`,tileUrlFunction(t){if(!t)return;let[n,r,i]=t;if(n!==void 0&&r!==void 0&&i!==void 0)return(0,c.createTdtVtsUrl)([n,r,i],{token:e.token,hosts:e.hosts,maxZoom:e.maxZoom??18,wrapX:!0})},tileLoadFunction(r,i){let a=r;a.setLoader(async(r,o,s)=>{let l=(0,c.redactTdtToken)(i);try{let o=await t.decode(i),c=n.readFeatures(o.buffer,{extent:r,featureProjection:s});a.setFeatures(c),e.diagnostics?.onDecoded?.(o.stats,l)}catch(t){let n=t instanceof Error?t:Error(String(t));e.diagnostics?.onError?.(n,l),console.error(`天地图私有 VTS 加载失败`,l,n),a.setState(d.default.ERROR)}})}}),i=r.dispose.bind(r);return r.dispose=()=>{t.dispose(),i()},{source:r,decoder:t}},ie=async e=>{let t=await Z(e.style);if(t?.version!==8||!t.sources||!Array.isArray(t.layers))throw TypeError(`style 必须是 Style v8 对象或其 JSON 地址`);let{source:n}=Q({token:e.token,hosts:e.hosts,restoreMode:`auto`}),r=new u.default({declutter:!0,source:n}),i=r.dispose.bind(r);r.dispose=()=>{n.dispose(),i()};try{let{applyBackground:e,applyStyle:n}=await import(`ol-mapbox-style`),i=structuredClone(t);for(let e of i.layers)e.type===`symbol`&&e.layout?.[`text-font`]&&(e.layout[`text-font`]=[`sans-serif`]);return await Promise.all([n(r,i,{projection:`EPSG:4326`,source:`base-tdt-vector-tile`,updateSource:!1}),e(r,i)]),r}catch(e){throw r.dispose(),e}},ae=(0,p.default)();let $;const oe=e=>{$=e},se=()=>{$=void 0},ce=(e,t)=>{if(e.startsWith(`#`)){let n=e.replace(`#`,``);return n.length===3&&(n=n[0]+n[0]+n[1]+n[1]+n[2]+n[2]),`rgba(${parseInt(n.substring(0,2),16)}, ${parseInt(n.substring(2,4),16)}, ${parseInt(n.substring(4,6),16)}, ${t})`}return e},le=()=>$?.getAllLayers().map(e=>e.get(`_dataList`)||[]).flat(2)||[],ue=e=>{let t=e=>!Array.isArray(e)||e.length===0?0:1+t(e[0]),n=e=>{if(!Array.isArray(e)||e.length<3)return!1;let t=e[0],n=e[e.length-1];return t[0]===n[0]&&t[1]===n[1]},r=e=>Array.isArray(e)&&e.length>=2&&typeof e[0]==`number`&&typeof e[1]==`number`,i=e=>Array.isArray(e)&&e.length>=2&&e.every(r),a=e=>Array.isArray(e)?(t(e)===2?[e]:e).every(e=>Array.isArray(e)&&e.length>=4&&n(e)&&e.every(r)):!1,o=t(e);try{return o<2||!e||e.length===0?`Invalid`:o===2&&i(e)?n(e)&&e.length>=4?`Polygon`:`LineString`:o===3&&Array.isArray(e)&&e.every(i)?a(e)?`Polygon`:e.every(e=>!n(e))?`MultiLineString`:`Invalid`:o===4&&Array.isArray(e)&&e.every(e=>a(e))?`MultiPolygon`:`Invalid`}catch(e){return console.error(`Error analyzing coordinates:`,e),`Invalid`}},de=new g.WMTSCapabilities,fe=/* @__PURE__ */ new Map,pe=async e=>{let t=fe.get(e);if(t)return t;let n=await fetch(e);if(!n.ok)throw Error(`WMTS capabilities 请求失败:${n.status}`);let r=de.read(await n.text());return fe.set(e,r),r},me=e=>async t=>{let{style:n,format:r,version:i,layerName:a,matrixSet:o}=t,[s,c]=a.split(`:`),l=`${e}/${s}/${c}/gwc/service/wmts?request=GetCapabilities`,u=await pe(l),d=(0,_.optionsFromCapabilities)(u,{style:n||``,layer:c,version:i||`1.1.0`,format:r||`image/png`,matrixSet:o||`EPSG:4326`});if(!d)throw Error(`Unable to create TileLayer`);return new h.default({zIndex:3,className:a,source:new m.WMTS(d)})},he=(e,t)=>{let n=t.get(`_selectInteraction`);n&&(e.removeInteraction(n),n.dispose(),t.unset(`_selectInteraction`));let r=t.get(`_resolutionChangeKey`);r&&((0,x.unByKey)(r),t.unset(`_resolutionChangeKey`));let i=t.get(`_dynamicMarkerTimer`);i!==void 0&&(clearTimeout(i),t.unset(`_dynamicMarkerTimer`)),t.getSource()?.dispose(),e.removeLayer(t),t.dispose()},ge=`c77eddc667c5bed016fded560baf93e7`,_e=(e=`hzsyvector_dark`)=>{let t={zIndex:-5,preload:1,minZoom:8,maxZoom:21,source:new m.XYZ({tileGrid:new v.TileGrid({tileSize:256,resolutions:[.00549933137253187,.00274966568626595,.00137483284313297,.000687416421566485,.000343708210783242,.000171854105391621,859270526958104e-19,429635263479052e-19,214817631739526e-19,107408815869763e-19,537044079348816e-20,268522039674407e-20,134261019837204e-20],origin:[118.122911693886,31.2869311022836],extent:[116.43263049006,28.6201742126026,123.705594256347,31.9765041681924]}),projection:`EPSG:4326`,urls:[`https://ywtg.citybrain.hangzhou.gov.cn/${e}/{z}/{y}/{x}`,`https://ywtg.citybrain.hangzhou.gov.cn:9456/${e}/{z}/{y}/{x}`,`https://ywtg.citybrain.hangzhou.gov.cn:9457/${e}/{z}/{y}/{x}`,`https://ywtg.citybrain.hangzhou.gov.cn:9458/${e}/{z}/{y}/{x}`,`https://ywtg.citybrain.hangzhou.gov.cn:9459/${e}/{z}/{y}/{x}`]}),properties:{_isBaseLayer:!0,_layerName:e}};return new y.Tile(t)},ve=(e,t=ge)=>{let[n,r]=e.split(`_`),i={preload:1,zIndex:-10,cacheSize:20240,properties:{_isBaseLayer:!0,_layerName:e},source:new m.WMTS({crossOrigin:`anonymous`,projection:`EPSG:4326`,wrapX:!0,layer:n,style:`default`,version:`1.0.0`,format:`image/png`,matrixSet:r,tileGrid:new b.default({tileSize:256,origin:[-180,90],matrixIds:[`1`,`2`,`3`,`4`,`5`,`6`,`7`,`8`,`9`,`10`,`11`,`12`,`13`,`14`,`15`,`16`,`17`,`18`,`19`],resolutions:[.703125,.3515625,.17578125,.087890625,.0439453125,.02197265625,.010986328125,.0054931640625,.00274658203125,.001373291015625,.0006866455078125,.00034332275390625,.000171661376953125,858306884765625e-19,4291534423828125e-20,21457672119140625e-21,10728836059570312e-21,5364418029785156e-21,2682209014892578e-21]}),url:`https://t{0-7}.tianditu.gov.cn/${e}/wmts?tk=${t}`})};return new y.Tile(i)},ye=e=>({baseImgLayer:new y.Tile({className:`img-layer`,source:new m.XYZ({crossOrigin:`anonymous`,tileSize:256,url:`https://t{0-7}.tianditu.gov.cn/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=${e}`}),zIndex:1}),baseCiaLayer:new y.Tile({className:`img-layer`,source:new m.XYZ({crossOrigin:`anonymous`,tileSize:256,url:`https://t{0-7}.tianditu.gov.cn/DataServer?T=cia_w&x={x}&y={y}&l={z}&tk=${e}`}),zIndex:2}),baseVecLayer:new y.Tile({className:`vec-layer`,source:new m.XYZ({crossOrigin:`anonymous`,tileSize:256,url:`https://t{0-7}.tianditu.gov.cn/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=${e}`}),zIndex:1}),baseCvaLayer:new y.Tile({className:`vec-layer`,source:new m.XYZ({crossOrigin:`anonymous`,tileSize:256,url:`https://t{0-7}.tianditu.gov.cn/DataServer?T=cva_w&x={x}&y={y}&l={z}&tk=${e}`}),zIndex:2})}),be=(e=`emap`,t=`3b0cdd02-c366-4363-b6de-081a9f12b364`)=>new y.Tile({preload:1,minZoom:4,maxZoom:20,zIndex:-10,cacheSize:20240,source:new m.XYZ({wrapX:!0,projection:`EPSG:4326`,crossOrigin:`anonymous`,url:`https://ditu{0-6}.zjzwfw.gov.cn/services/wmts/${e}/default/oss/getTile/{z}/{y}/{x}?token=${t}`})}),xe=e=>$.getAllLayers().find(t=>(t.get(`_layerName`)||t.getClassName())===e),Se=e=>{$.getAllLayers().filter(t=>(t.get(`_layerName`)||t.getClassName())===e).forEach(e=>{he($,e)})},Ce=()=>Math.max(1,Math.min(4,globalThis.navigator?.hardwareConcurrency??2)),we=(e,t,n,r={})=>{let i=new C.default({sources:[e],operationType:`image`,operation:(e,t)=>(((e,t)=>{let n=t.ratioArray,r=t.rgbColorArray;if(n&&r){let[t=0,i=0,a=0]=n;for(let n=0;n<e.length;n+=4){let o=e[n],s=e[n+1],c=e[n+2],l=o*t+s*i+c*a;e[n]=r[0]-l,e[n+1]=r[1]-l,e[n+2]=r[2]-l}}})(e[0].data,t),e[0]),threads:r.threads??Ce()});return i.on(`beforeoperations`,e=>{e.data.ratioArray=n,e.data.rgbColorArray=t}),i},Te=(e,t,n,r={})=>new S.default({source:we(e,t,n,r)}),Ee=(e=``)=>{$&&$.getOverlays().getArray().filter(t=>t.get(e||`position`)).forEach(e=>$.removeOverlay(e))},De=()=>Ee(`_isAnimationMarker`),Oe=(e,t)=>{De();let{width:n,height:r,lnglat:i,crsForm:a}=t,o=document.createElement(`div`),s=document.createElement(`img`);s.src=e,s.alt=``,n!==void 0&&(s.width=n),r!==void 0&&(s.height=r),o.append(s);let c=new O.Overlay({element:o,stopEvent:!1,positioning:`bottom-center`,position:D.default.transform([+i[0],+i[1]],a||D.default.WGS84,D.default.WGS84)});c.set(`_isAnimationMarker`,!0),$.addOverlay(c)},ke=(e={id:`popup-container`,positioning:`top-center`})=>new O.Overlay(Object.assign({element:document.getElementById(e.id)||void 0},e)),Ae=()=>{Ee(),$.getAllLayers().forEach(e=>{e.get(`_selectInteraction`)?.getFeatures().clear()})},je=()=>{Ee(),$&&$.getAllLayers().forEach(e=>{e.get(`_isBaseLayer`)||he($,e)})},Me=()=>{Ee(),$.getAllLayers().filter(e=>e.get(`_isVectorLayer`)).forEach(e=>{let t=e.get(`_selectInteraction`);t&&(t.dispatchEvent({type:`select`,selected:[],mapBrowserEvent:void 0,deselected:t.getFeatures().getArray()}),t.getFeatures().clear())})},Ne=e=>{let t=$.getAllLayers().filter(e=>e.get(`_isVectorLayer`));if(t.length){let n=t.find(t=>t.get(`_uuidSet`).has(e)&&t.get(`_selectInteraction`));if(n){let t=(n.getSource()?.getFeatures()||[]).find(t=>t.get(`_uuid`)===e),r=n.get(`_selectInteraction`);if(r){let n=r.getFeatures().getArray();n.find(t=>t.get(`_uuid`)===e)||(r.dispatchEvent({type:`select`,deselected:n,selected:[t],mapBrowserEvent:void 0}),r.getFeatures().push(t))}}}};let Pe=[119.71512016971076,30.122490541963536];const Fe=(e={})=>{if($)return $;let t=Ie(e);return oe(t),t},Ie=(e={})=>{let t=Object.assign({zoom:9.4,maxZoom:18,minZoom:9.4,center:Pe,baseLayer:`vec-layer`,projection:`EPSG:4326`,layers:[_e()],constrainResolution:!1,smoothExtentConstraint:!1,tk:ge},e||{}),n=new w.default({view:new T.default(t),controls:(0,E.defaults)({zoom:!1,rotate:!1,attribution:!1}),interactions:(0,k.defaults)({pinchRotate:!1,doubleClickZoom:!1,altShiftDragRotate:!1}),layers:t.layers||[_e()]});Pe=t.center||Pe,n.activeBaseLayer=t.baseLayer;let r=e=>n.getAllLayers().find(t=>(t.get(`_layerName`)||t.getClassName())===e);n.getLayerByName=r,n.removeLayerByName=e=>{let t=r(e);t&&he(n,t)},n.changeLayersByNames=(e,t)=>{n.getAllLayers().filter(e=>t.includes(e.getClassName())).forEach(t=>t.setVisible(e?.includes(t.getClassName())))};let i,a;return n.on(`pointermove`,e=>{if(a=e.pixel,i!==void 0)return;let t=()=>{i=void 0;let e=n.getTargetElement();a&&e&&(e.style.cursor=n.hasFeatureAtPixel(a)?`pointer`:``)};i=typeof globalThis.requestAnimationFrame==`function`?globalThis.requestAnimationFrame(t):setTimeout(t,16)}),n.set(`_disposePointerMove`,()=>{i!==void 0&&(typeof globalThis.cancelAnimationFrame==`function`?globalThis.cancelAnimationFrame(i):clearTimeout(i),i=void 0)}),n},Le=()=>{if(!$)return;let e=$;e.get(`_disposePointerMove`)?.(),e.unset(`_disposePointerMove`),e.getOverlays().forEach(t=>{e.removeOverlay(t)}),e.getInteractions().clear(),e.getAllLayers().forEach(t=>he(e,t)),e.setTarget(``),e.dispose(),se()},Re=()=>Le(),ze=()=>$,Be=(e=Pe)=>{$&&$.getView().animate({zoom:9.4,center:e,duration:1e3})},Ve=(e={center:Pe,isClearAll:!0})=>{je(),Be(e.center||Pe)},He={padding:[50,50,50,50],duration:1e3},Ue=(e,t=$,n)=>{let r=t.getView();if(e.length===1)r.animate({zoom:14,duration:1e3,center:e[0],...n||{}});else{let t=(0,A.boundingExtent)(e);r.fit(t,{...He,...n||{}})}},We=(e,t=$,n)=>{t.getView().fit(e,{...He,...n||{}})},Ge=(e,t=$,n)=>{let r=e.getSource();if(!r||r.isEmpty())return;let i=r.getExtent();i&&t.getView().fit(i,{...He,...n||{}})},Ke=(e,t)=>{let n=$.getView(),r=n.getZoom();n.animate({center:e,duration:2e3}),t?n.animate({zoom:t-2,duration:1e3},{zoom:t,duration:1e3}):n.animate({zoom:r-2,duration:1e3},{zoom:r+2>12?12:r+2,duration:1e3})},qe=e=>new I.Text({text:e.text,offsetY:e.offsetY,offsetX:e.offsetX,justify:`center`,textAlign:`center`,font:`16px PingFangSC-Semibold`,fill:new I.Fill({color:`rgba(255, 255, 255, 0.8)`})}),Je=(e,t=!1)=>new I.Style({image:new I.Icon({scale:e.scale||1,rotation:e.rotation||0,anchor:e.anchor||[.5,1],src:t&&e.activeImg||e.img}),text:e.showText?qe(e):void 0}),Ye=(e,t)=>{let n=new M.default({geometry:new N.default([+e.lng,+e.lat]),data:Object.assign({},e||{},{layerName:t.layerName})});return n.setStyle(Je(e)),n},Xe=(e,t)=>{let{layerName:n,visible:r=!0,zIndex:i=10}=t,a=new F.default;return e.forEach(e=>a.addFeature(Ye(e,t))),new P.default({zIndex:i,visible:r,source:a,className:n||`marker-layer`})},Ze=(e,t)=>{let n=t>=14?`largeImg`:t>=11?`smallImg`:`img`;e.forEach(e=>{let t=e.get(`data`);t.isSelected||e.setStyle(Je({...t,img:t[n]},!1))})},Qe=(e,t)=>{let n=e.get(`data`),r={...n,isSelected:t};e.set(`data`,r),n.isElastic?Ze([e],$.getView().getZoom()):e.setStyle(Je(r,t))},$e=e=>{e.forEach(e=>{Qe(e,!1)}),e.clear()},et=(e,t)=>{let n=e.map(e=>({...e,isElastic:!0})),r=Xe(n,t),i=r.getSource().getFeatures(),a=$.getView();return Ze(i,a.getZoom()),r.set(`_resolutionChangeKey`,a.on(`change:resolution`,()=>Ze(i,a.getZoom()))),r},tt=(e,t)=>{let n=Ye(e,t),r=new P.default({className:t.layerName||`ol-layer`,source:new F.default({features:[n]})});return $.addLayer(r),{vectorLayer:r}},nt=(e,t)=>{let n=t.getProperties(),{activeStyle:r}=n;if(t.setStyle(r),ae.emit(`selected-feature`,n),e.set(`_hasActive`,!0),e.get(`_isDynamic`)){let t=r.getImage(),i=e.get(`_dynamicMarkerTimer`);i!==void 0&&clearTimeout(i);let a=setTimeout(()=>{e.unset(`_dynamicMarkerTimer`),ae.emit(`dynamic-marker`,Object.assign({},n.rawData||{},{lnglat:n.lnglat,style:n.style,crsForm:n.crsForm,width:t.getWidth(),height:t.getHeight()}))},1e3);e.set(`_dynamicMarkerTimer`,a)}if(e.get(`_isAutoFit`)){let e=$.getView();e.animate({duration:1e3,zoom:e.getZoom(),center:(0,A.getCenter)(t.getGeometry().getExtent())})}},rt=e=>{let t=new k.Select({style:null,multi:!1,hitTolerance:10,layers:[e],condition:t=>{if(!(0,j.singleClick)(t))return!1;let n=!1;return $.forEachFeatureAtPixel(t.pixel,()=>{n=!0},{layerFilter:t=>t===e}),n}});return t.on(`select`,t=>{let{selected:n,deselected:r}=t;if(n.length){let t=n[0];if(e.get(`_isClusterLayer`)){let n=t.get(`features`);n.length===1&&nt(e,n[0])}else nt(e,t)}if(r.length){let t=r[0],n=t.getProperties();t.setStyle(n.unActiveStyle),e.set(`_hasActive`,!1)}}),$.addInteraction(t),e.set(`_selectInteraction`,t),t},it=(e,t,n)=>{let r=new k.Select({style:null,layers:t=>e.includes(t.getClassName())});return r.on(`select`,({deselected:e,selected:r})=>{if(e.length){let t=e[0];Qe(t,!1),n?.(t)}if(r.length){let e=r[0];Qe(e,!0),t?.(e)}}),r},at=e=>{let t=(0,R.getArea)(e,{projection:`EPSG:4326`});return t>1e4?`${Math.round(t/1e6*100)/100} km\xB2`:`${Math.round(t*100)/100} m\xB2`},ot=e=>{let t=(0,R.getLength)(e,{projection:`EPSG:4326`});return t>100?`${Math.round(t/1e3*100)/100} km`:`${Math.round(t*100)/100} m`},st=new I.Style({fill:new I.Fill({color:`rgba(255, 255, 255, 0.2)`}),stroke:new I.Stroke({color:`rgba(0, 0, 0, 0.5)`,lineDash:[10,10],width:2}),image:new I.Circle({radius:5,stroke:new I.Stroke({color:`rgba(0, 0, 0, 0.7)`}),fill:new I.Fill({color:`rgba(255, 255, 255, 0.2)`})})}),ct=/* @__PURE__ */ new WeakMap,lt=e=>{let t=ct.get(e);if(t)return t;let n=new I.Style({text:new I.Text({font:`14px`,fill:new I.Fill({color:`rgba(255, 255, 255, 1)`}),backgroundFill:new I.Fill({color:`rgba(0, 0, 0, 0.7)`}),padding:[3,3,3,3],textBaseline:`bottom`,offsetY:-15}),image:new I.RegularShape({radius:8,points:3,angle:Math.PI,displacement:[0,10],fill:new I.Fill({color:`rgba(0, 0, 0, 0.7)`})})});return ct.set(e,n),n},ut=(e,t=st)=>{let n=t?[t]:[],r=e.getGeometry(),i,a;if(r.getType()===`Polygon`?(i=r.getInteriorPoint(),a=at(r)):r.getType()===`LineString`&&(i=new N.default(r.getLastCoordinate()),a=ot(r)),i&&a){let t=lt(e);t.setGeometry(i),t.getText().setText(a),n.push(t)}return n},dt=(e=`Point`,t,n)=>new L.default({source:t.getSource(),type:e,style:n?e=>ut(e,void 0):void 0}),ft=({geometry:e,interaction:t,isDestroyed:n,vectorLayer:r,aircraftStyle:i,speed:a,turnSpeed:o,verticalSpeed:s,getLastWaypoint:c})=>{let l,u,d=0,f,p,m,h=0,g=0,_=/* @__PURE__ */ new Set,v=()=>{_.clear(),m!==void 0&&f?.cancelAnimationFrame(m),m=void 0},y=e=>{m=void 0;let n=t.getMap();if(!l||!n||!t.getActive()){v();return}let r=l,c=Math.min(Math.max(0,e-h)/1e3,.1);h=e;let u=Number(_.has(`turnRight`))-Number(_.has(`turnLeft`));d=(d+u*o*c+360)%360,i===void 0&&l.getStyle().getImage().setRotation(d*Math.PI/180);let p=Number(_.has(`forward`))-Number(_.has(`backward`)),g=Number(_.has(`right`))-Number(_.has(`left`));if(p||g){let e=n.getView(),t=(0,R.offset)(r.getGeometry().getCoordinates(),a*c,d*Math.PI/180+Math.atan2(g,p));if(r.getGeometry().setCoordinates(t),l!==r||(e.setCenter(t),l!==r))return}let b=Number(_.has(`ascend`))-Number(_.has(`descend`));r.set(`height`,Math.max(0,r.get(`height`)+b*s*c)),l===r&&(l.set(`heading`,d),l===r&&(l.changed(),l===r&&_.size&&m===void 0&&(m=f.requestAnimationFrame(y))))},b=()=>{g++,v(),p?.(),p=void 0,f=void 0;let e=u;if(u=void 0,l=void 0,e){let t=e.getSource();e.setMap(null),e.clearRenderer(),e.setSource(null),t?.clear(!0),t?.dispose()}c()?.set(`isAircraft`,!0,!0),n()||r.changed()};return{get aircraft(){return l},get heading(){return d},get revision(){return g},startRouteControl(){let n=t.getMap(),o=n?.getTargetElement(),s=n?.getSize();if(!n||!o||!s||s[0]<=0||s[1]<=0||!t.getActive())throw Error(`请先将启用的航点交互添加到已就绪的地图`);let m=n.getView(),h=++g,_=()=>{if(h!==g||t.getMap()!==n||n.getView()!==m||!t.getActive()||n.getTargetElement()!==o)throw Error(`飞行操控启动已取消`)};if(l)return l;d=0,n.renderSync(),_();let v=e.getLastCoordinate();return l=new M.default({geometry:new N.default(v),isAircraft:!0,heading:d,height:c()?.get(`extData`)?.height??0,speed:a}),l.setStyle(i??new I.Style({image:new I.Icon({src:`data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2228%22%20height%3D%2236%22%20viewBox%3D%220%200%2028%2036%22%3E%3Cpath%20d%3D%22M14%202%2024%2032%2014%2025%204%2032Z%22%20fill%3D%22%23f97316%22%20stroke%3D%22%23fff%22%20stroke-width%3D%222%22%20stroke-linejoin%3D%22round%22%2F%3E%3C%2Fsvg%3E`,rotateWithView:!0})})),u=new P.default({source:new F.default({features:[l]})}),u.setMap(n),_(),n.on(`change:view`,b),f=o.ownerDocument.defaultView,p=()=>n.un(`change:view`,b),c()?.set(`isAircraft`,!1,!0),r.changed(),_(),l},setRouteControls(e){let n=[`forward`,`backward`,`left`,`right`,`turnLeft`,`turnRight`,`ascend`,`descend`];if(e.some(e=>!n.includes(e)))throw Error(`不支持的飞行动作`);l&&t.getActive()&&(_=new Set(e),_.size?m===void 0&&(h=f.performance.now(),m=f.requestAnimationFrame(y)):v())},stopRouteControl:b}},pt={KeyW:`forward`,KeyS:`backward`,KeyA:`left`,KeyD:`right`,KeyQ:`turnLeft`,KeyE:`turnRight`,KeyZ:`descend`,KeyC:`ascend`,Space:`waypoint`},mt=e=>e===`ascend`||e===`descend`,ht=(e,t)=>{let n=e.getTarget(),r=typeof t.container==`string`?(n?.ownerDocument??globalThis.document)?.getElementById(t.container):t.container;if(typeof t.container==`string`&&!r)throw Error(`找不到航线输入容器:${t.container}`);if(e.getMode()!==`control`&&e.getMode()!==`edit`)return()=>void 0;let i=(n??r)?.ownerDocument,a=i?.defaultView;if(!i||!a)return()=>{e.setRouteControls([]),e.setActiveControls([])};let o=/* @__PURE__ */ new Map,s=/* @__PURE__ */ new Map,c=!!t.keyboard&&!!n&&!n.hasAttribute(`tabindex`);c&&(n.tabIndex=0);let l=t=>e.getMode()===`control`||e.getMode()===`edit`&&mt(t),u=!!t.keyboard&&e.getMode()===`control`,d=/* @__PURE__ */ new Map,f={"background-color":t.activeStyle?.backgroundColor,"border-top-color":t.activeStyle?.borderColor,"border-right-color":t.activeStyle?.borderColor,"border-bottom-color":t.activeStyle?.borderColor,"border-left-color":t.activeStyle?.borderColor,color:t.activeStyle?.color},p=e=>{for(let[e,{original:t,applied:n}]of d){let r=new Set(e.style),i=[.../* @__PURE__ */ new Set([...n.keys(),...r])].map(t=>({property:t,value:e.style.getPropertyValue(t),priority:e.style.getPropertyPriority(t)})).filter(({property:e,value:t,priority:i})=>n.has(e)!==r.has(e)||t!==n.get(e)?.value||i!==n.get(e)?.priority);e.style.cssText=t;for(let{property:t,value:n,priority:r}of i)e.style.setProperty(t,n,r)}if(d.clear(),t.activeStyle&&e.length)for(let t of r?.querySelectorAll(`button[data-route-control]`)??[]){if(t.disabled||!e.includes(t.dataset.routeControl))continue;let n=t.style.cssText;for(let[e,n]of Object.entries(f))typeof n==`string`&&t.style.setProperty(e,n,`important`);let r=new Map(Array.from(t.style,e=>[e,{value:t.style.getPropertyValue(e),priority:t.style.getPropertyPriority(e)}]));d.set(t,{original:n,applied:r})}},m=()=>{let t=[.../* @__PURE__ */ new Set([...o.values(),...[...s.values()].map(({action:e})=>e)])];p(t),e.setRouteControls(e.getMode()===`control`?t.filter(e=>e!==`waypoint`):[]),e.setActiveControls(t)},h=(e,t)=>{try{t.hasPointerCapture(e)&&t.releasePointerCapture(e)}catch{}},g=()=>{if(!o.size&&!s.size)return;o.clear();let e=[...s.entries()];s.clear();for(let[t,{button:n}]of e)h(t,n);m()},_=e=>{let t=e?.closest?.(`button[data-route-control]`);if(!t||t.disabled||!r?.contains(t))return;let n=t.dataset.routeControl;if(Object.values(pt).includes(n)&&l(n))return{button:t,action:n}},v=e=>!!e?.closest(`input, textarea, select, a, [contenteditable]:not([contenteditable="false"])`),y=t=>{e.getMode()===`edit`&&mt(t)?e.adjustWaypointHeight(t===`ascend`?1:-1):e.getMode()===`control`&&t===`waypoint`&&e.addRouteWaypoint()},b=e=>{if(e.defaultPrevented||v(i.activeElement)||i.hidden)return;if(e.ctrlKey||e.altKey||e.metaKey||e.isComposing){g();return}let n=_(e.target),a=!!n&&(e.code===`Space`||e.code===`Enter`),s=a?n.action:t.keyboard?pt[e.code]:void 0;if(!s||!l(s))return;let c=i.activeElement?.closest(`button`);(a||!c||(u||r?.contains(c))&&e.code!==`Space`&&e.code!==`Enter`)&&(e.preventDefault(),!(e.repeat||o.has(e.code))&&(o.set(e.code,s),m(),y(s)))},x=e=>{o.delete(e.code)&&(e.preventDefault(),m())},S=e=>{if(e.button!==0||i.hidden)return;let t=_(e.target);if(t){e.preventDefault(),t.button.focus({preventScroll:!0}),s.set(e.pointerId,t);try{t.button.setPointerCapture(e.pointerId)}catch{}m()}},C=e=>{let t=s.get(e.pointerId);t&&(s.delete(e.pointerId),h(e.pointerId,t.button),m())},w=e=>{let t=_(e.target);t&&!i.hidden&&y(t.action)},T=e=>{v(e.target)&&g()},E=()=>{i.hidden&&g()},D=new Set(u?[]:[t.keyboard?n:void 0,r]);u&&i.addEventListener(`keydown`,b);for(let e of D)e?.addEventListener(`keydown`,b);return i.addEventListener(`keyup`,x,!0),i.addEventListener(`focusin`,T),i.addEventListener(`visibilitychange`,E),r&&(i.addEventListener(`pointerup`,C),i.addEventListener(`pointercancel`,C)),r?.addEventListener(`pointerdown`,S),r?.addEventListener(`lostpointercapture`,C),r?.addEventListener(`click`,w),()=>{u&&i.removeEventListener(`keydown`,b);for(let e of D)e?.removeEventListener(`keydown`,b);i.removeEventListener(`keyup`,x,!0),i.removeEventListener(`focusin`,T),i.removeEventListener(`visibilitychange`,E),r&&(i.removeEventListener(`pointerup`,C),i.removeEventListener(`pointercancel`,C)),r?.removeEventListener(`pointerdown`,S),r?.removeEventListener(`lostpointercapture`,C),r?.removeEventListener(`click`,w),g(),c&&n.getAttribute(`tabindex`)===`0`&&n.removeAttribute(`tabindex`)}},gt=()=>{let e=new W.default({image:new B.default({radius:9,fill:new V.default({color:`#22c55e`}),stroke:new U.default({color:`#fff`,width:2})}),text:new G.default({text:`起飞`,offsetY:-20,fill:new V.default({color:`#15803d`}),stroke:new U.default({color:`#fff`,width:3})}),zIndex:2}),t,n=new W.default({fill:new V.default({color:`rgba(59, 130, 246, .2)`}),stroke:new U.default({color:`#3b82f6`,width:3}),image:new B.default({radius:6,fill:new V.default({color:`#3b82f6`})})}),r=e=>(t??=new W.default({image:new H.default({src:`data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2228%22%20height%3D%2236%22%20viewBox%3D%220%200%2028%2036%22%3E%3Cpath%20d%3D%22M14%202%2024%2032%2014%2025%204%2032Z%22%20fill%3D%22%23f97316%22%20stroke%3D%22%23fff%22%20stroke-width%3D%222%22%20stroke-linejoin%3D%22round%22%2F%3E%3C%2Fsvg%3E`,rotateWithView:!0}),zIndex:3}),t.getImage().setRotation((e.get(`heading`)??0)*Math.PI/180),t);return{style:n,lineStyle:n,takeoffStyle:t=>t.get(`isAircraft`)?[e,r(t)]:e,pointStyle:e=>e.get(`isAircraft`)?r(e):n,aircraftStyle:r}},_t=()=>{let e=crypto.getRandomValues(/* @__PURE__ */ new Uint8Array(16));e[6]=e[6]&15|64,e[8]=e[8]&63|128;let t=Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(``);return`${t.slice(0,8)}-${t.slice(8,12)}-${t.slice(12,16)}-${t.slice(16,20)}-${t.slice(20)}`},vt=e=>e.map((e,t)=>{let[n,r]=e.getGeometry().getCoordinates(),i=e.get(`extData`)??{};return{...i,uuid:e.get(`uuid`),waylineId:i.waylineId??``,indexNo:t,pointSpeed:i.pointSpeed??0,height:i.height??0,gimbalPichAngle:i.gimbalPichAngle??0,direction:i.direction??e.get(`heading`)??0,shootType:i.shootType??``,supportLightType:i.supportLightType??``,longitude:n,latitude:r}}),yt=(e,{takeoffStyle:t,pointStyle:n})=>{if(!Array.isArray(e))throw Error(`航点必须为数组`);let r=/* @__PURE__ */ new Set,i=/* @__PURE__ */ new Set;for(let t of e){if(!t||typeof t!=`object`)throw Error(`航点必须为对象`);if(t.uuid!==void 0){if(typeof t.uuid!=`string`||!t.uuid.trim())throw Error(`uuid 必须为非空白字符串`);if(i.has(t.uuid))throw Error(`导入航点存在重复 uuid`);i.add(t.uuid)}if(!Number.isInteger(t.indexNo)||t.indexNo<0)throw Error(`indexNo 必须为非负整数`);if(!Number.isFinite(t.longitude)||Math.abs(t.longitude)>180||!Number.isFinite(t.latitude)||Math.abs(t.latitude)>90)throw Error(`航点经纬度必须为有效的 EPSG:4326 坐标`);for(let e of[`direction`,`pointSpeed`,`gimbalPichAngle`])if(t[e]!==void 0&&!Number.isFinite(t[e]))throw Error(`${e} 必须为有限数值`);if(t.pointSpeed!==void 0&&t.pointSpeed<0)throw Error(`pointSpeed 不能为负数`);if(t.height!==void 0&&(!Number.isFinite(t.height)||t.height<0))throw Error(`height 必须为有限非负数`);if(t.waylineId!==void 0&&typeof t.waylineId!=`string`)throw Error(`waylineId 必须为字符串`);if(t.shootType!==void 0&&![``,`time`,`distance`,`none`].includes(t.shootType))throw Error(`不支持的 shootType`);if(t.supportLightType!==void 0&&(typeof t.supportLightType!=`string`||t.supportLightType!==``&&t.supportLightType.split(`,`).some(e=>![`ir`,`visable`].includes(e))))throw Error(`supportLightType 仅支持 ir、visable 或逗号分隔的组合`);let e=`${t.longitude},${t.latitude}`;if(r.has(e))throw Error(`导入航点存在重复位置`);r.add(e)}return[...e].sort((e,t)=>e.indexNo-t.indexNo).map((r,i)=>{let a={...r,height:r.height??0};delete a.uuid,delete a.indexNo,delete a.longitude,delete a.latitude;let o=new M.default({uuid:r.uuid??_t(),geometry:new N.default([r.longitude,r.latitude]),extData:a,heading:r.direction??0,isTakeoff:i===0,isAircraft:i===e.length-1});return o.setStyle(i===0?t:n),o})},bt=(e={},t={mode:`midpoint`,pixelTolerance:10})=>{if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`编辑配置必须为对象`);let{mode:n=t.mode,pixelTolerance:r=t.pixelTolerance}=e;if(n!==`midpoint`&&n!==`snap`)throw Error(`编辑模式必须为 midpoint 或 snap`);if(!Number.isFinite(r)||r<=0)throw Error(`吸附距离必须为有限正数`);return{mode:n,pixelTolerance:r}},xt=({interaction:e,vectorLayer:t,source:n,points:r,layerOptions:i,midpointStyle:a,pointStyle:o,onDuplicate:s,onInsert:c,getTakeoff:l,isDestroyed:u,isEditing:d,getEditConfig:f,syncPath:p})=>{let m,h,g,_=()=>{let e=h;h=void 0,m=void 0,g=void 0,e?.()};return{get pendingInsertion(){return g?.()},get select(){return m},clearEditing:_,updateEditing:()=>{if(_(),u()||h)return;let v=e.getMap();if(!d()||!v||!e.getActive())return;let y=f(),b=new F.default,x=new P.default({...i,source:b,style:a??new I.Style({image:new I.Circle({radius:5,fill:new I.Fill({color:`#fff`}),stroke:new I.Stroke({color:`#3b82f6`,width:2})})}),zIndex:1/0}),S=()=>{x.setVisible(t.getVisible()),b.clear(),y.mode===`snap`?O():r.slice(1).forEach((e,t)=>{let n=r[t].getGeometry().getCoordinates(),i=e.getGeometry().getCoordinates();b.addFeature(new M.default({geometry:new N.default([(n[0]+i[0])/2,(n[1]+i[1])/2]),insertIndex:t+1}))})},C=new te.default({layers:[t],filter:e=>e!==l()&&r.includes(e),hitTolerance:6});m=C;let w=new q.default({condition:j.primaryAction,filter:e=>e!==l()&&(r.includes(e)||b.hasFeature(e)),hitTolerance:6}),T=new K.default,E=y.mode===`snap`?new ne.default({features:T,pixelTolerance:y.pixelTolerance}):void 0;E?.on(`snap`,e=>{if(D||!t.getVisible())return;let n=e.feature.get(`insertIndex`);if(!e.segment||typeof n!=`number`){b.clear();return}let r=b.getFeatures()[0];r||(r=new M.default(new N.default(e.vertex)),b.addFeature(r)),r.set(`insertIndex`,n),r.getGeometry().setCoordinates(e.vertex)}),E?.on(`unsnap`,()=>{D||b.clear()});let D;g=()=>D?.inserted?D.point:void 0;let O=()=>{T.clear(),!D&&t.getVisible()&&r.forEach((e,t)=>{T.push(new M.default(e.getGeometry().clone())),t>0&&T.push(new M.default({geometry:new ee.default([r[t-1].getGeometry().getCoordinates(),e.getGeometry().getCoordinates()]),insertIndex:t}))})};if(E){let e=E.handleEvent.bind(E);E.handleEvent=t=>{let n=e(t);return t.type===`pointerdown`&&!D&&b.getFeatures().length&&v.renderSync(),n}}let k=()=>{if(!D)return;let e=D;D=void 0,!u()&&(e.inserted?(r.splice(r.indexOf(e.point),1),n.removeFeature(e.point)):e.point.getGeometry().setCoordinates(e.coordinate),p(),S())};w.on(`translatestart`,e=>{let t=e.features.item(0);D={point:t,coordinate:t.getGeometry().getCoordinates(),insertIndex:t.get(`insertIndex`),inserted:!1,moved:!1},T.clear()}),w.on(`translating`,e=>{let t=D;if(t&&(t.moved=!0,E&&t.point.getGeometry().setCoordinates(e.coordinate),D===t)){if(t.insertIndex!==void 0&&!t.inserted){let{point:e,insertIndex:i}=t;if(e.unset(`insertIndex`),e.setProperties({uuid:_t(),extData:{height:r[i-1].get(`extData`)?.height??0},isTakeoff:!1,isAircraft:!1,heading:r[i-1].get(`heading`)}),e.setStyle(o),r.splice(i,0,e),t.inserted=!0,n.addFeature(e),D!==t)return}p(),D===t&&S()}}),w.on(`translateend`,()=>{if(!D)return;let{point:t,moved:n,inserted:i}=D,a=t.getGeometry().getCoordinates();n&&r.some(e=>{let n=e.getGeometry().getCoordinates();return e!==t&&n[0]===a[0]&&n[1]===a[1]})?(k(),s?.(a.slice())):(D=void 0,S(),n&&e.changed(),i&&c(t))}),C.on(`select`,()=>e.changed());let A=()=>{C.getFeatures().clear(),k(),t.un(`change:visible`,S),v.removeInteraction(w),v.removeInteraction(C),E&&(v.removeInteraction(E),E.dispose()),T.clear(),w.dispose(),C.dispose(),x.setMap(null),x.clearRenderer(),x.setSource(null),b.clear(),b.dispose()};h=A,t.on(`change:visible`,S),S(),x.setMap(v),h===A&&(v.addInteraction(C),h===A&&(v.addInteraction(w),h===A&&E&&v.addInteraction(E)))}}},St=(e={})=>{let t=e.style===void 0?gt():{},{map:n=$,layerName:r,style:i=t.style,takeoffStyle:a=t.takeoffStyle,lineStyle:o=t.lineStyle,pointStyle:s=t.pointStyle,aircraftStyle:c=t.aircraftStyle,midpointStyle:l,edit:u,onDuplicate:d,onWaypointAdd:f,onBeforeWaypointRemove:p,onWaypointRemove:m,input:h,speed:g=10,turnSpeed:_=60,verticalSpeed:v=1,...y}=e,b=bt(u);if([g,_,v].some(e=>!Number.isFinite(e)||e<=0))throw Error(`飞行速度、转向速度和升降速度必须为有限正数`);if(!n)throw Error(`请先创建地图实例或通过 config.map 指定地图`);let x=new F.default,S=new P.default({...y,className:r||`ol-layer`,source:x,style:i});S.set(`_layerName`,r);let C=new ee.default([]),w=new M.default(C);w.setStyle(o);let T,E,D=[],O=!1,k=0,A=0,j=`idle`,I=[],L,R,B=0,V=/* @__PURE__ */ new Set,H=e=>{B++;try{return e()}finally{B--,!B&&!O&&J.changed()}},U=()=>{if(!(B||O))for(let e of[...V]){if(O)break;V.has(e)&&e(Z.getState())}},W=()=>{let e=L;L=void 0,e?.(),I=[]},G=()=>{W(),!O&&J.getMap()&&J.getActive()&&(h?.keyboard||h?.container!==void 0)&&(L=ht({getMode:()=>j,getTarget:()=>n.getTargetElement()??void 0,setRouteControls:e=>Z.setRouteControls(e),addRouteWaypoint:()=>Z.addRouteWaypoint(),adjustWaypointHeight:e=>Z.adjustWaypointHeight(e),setActiveControls:e=>{I=[...e],U()}},{...h}))},K=()=>{W(),R?.(),R=void 0,Y.stopRouteControl(),X.clearEditing()},te=e=>C.getCoordinates().findIndex(t=>t[0]===e[0]&&t[1]===e[1]),q=e=>{if(!f||O||!e||e===T)return;let t=D.indexOf(e);t!==-1&&f({...vt([e])[0],indexNo:t})},ne=e=>{if(te(e)!==-1){d?.(e.slice());return}let t=k;if(C.appendCoordinate(e),O||t!==k)return;let n=new M.default({uuid:_t(),geometry:new N.default(e),extData:{height:Y.aircraft?.get(`height`)??E?.get(`extData`)?.height??0},isTakeoff:C.getCoordinates().length===1,isAircraft:!Y.aircraft,heading:Y.heading});if(n.setStyle(n.get(`isTakeoff`)?a:s),E?.set(`isAircraft`,!1,!0),E=n,T||=n,D.push(n),x.addFeature(n),!(O||t!==k))return C.getCoordinates().length===2&&x.addFeature(w),J.changed(),n},re=()=>{if(O)return;let e=k;T=D[0],E=D.at(-1);for(let t of D){let n=t===T;if(t.get(`isTakeoff`)!==n&&t.setStyle(n?a:s),O||e!==k||(t.setProperties({isTakeoff:n,isAircraft:t===E}),O||e!==k))return}C.setCoordinates(D.map(e=>e.getGeometry().getCoordinates())),!(O||e!==k)&&(D.length>1&&!x.hasFeature(w)&&x.addFeature(w),D.length<2&&x.hasFeature(w)&&x.removeFeature(w))},J=new z.default({handleEvent(e){if(O||!J.getActive()||e.type!==`singleclick`||j!==`draw`&&j!==`takeoff`)return!0;let t=e.coordinate.slice();if(!Number.isFinite(t[0])||!Number.isFinite(t[1])||Math.abs(t[0])>180||Math.abs(t[1])>90)return!0;let n=j===`takeoff`,r=te(t);if(r!==-1&&(!n||r>0))return d?.(t.slice()),!1;let i;return H(()=>{let e=k,r=A;if(n&&T){let n=C.getCoordinates();if(n[0]=t,C.setCoordinates(n),O||e!==k)return;T.getGeometry().setCoordinates(t)}else i=ne(t);n&&!O&&e===k&&r===A&&Z.setMode(`idle`)}),q(i),!1}}),Y=ft({speed:g,turnSpeed:_,verticalSpeed:v,interaction:J,geometry:C,vectorLayer:S,aircraftStyle:c,getLastWaypoint:()=>E,isDestroyed:()=>O}),X=xt({interaction:J,vectorLayer:S,source:x,points:D,layerOptions:y,midpointStyle:l,pointStyle:s,onDuplicate:d,onInsert:q,getTakeoff:()=>T,isDestroyed:()=>O,isEditing:()=>j===`edit`,getEditConfig:()=>b,syncPath:re});J.on(`change`,U),J.on(`change:active`,()=>{!J.getActive()&&!O&&Z.setMode(`idle`)});let Z=Object.assign(J,{getState(){let e=X.select?.getFeatures().item(0),t=Y.aircraft,n=t?.getGeometry().getCoordinates();return{mode:j,hasTakeoff:!!T,waypointCount:D.length,selectedWaypoint:e?{...vt([e])[0],indexNo:D.indexOf(e)}:null,aircraft:t&&n?{longitude:n[0],latitude:n[1],heading:t.get(`heading`),height:t.get(`height`),speed:t.get(`speed`)}:null,activeControls:[...I],editConfig:{...b}}},subscribe(e){if(O)throw Error(`航线已销毁`);V.add(e);try{e(Z.getState())}catch(t){throw V.delete(e),t}return()=>{V.delete(e)}},setMode(e){if(O)throw Error(`航线已销毁`);if(![`idle`,`takeoff`,`draw`,`control`,`edit`].includes(e))throw Error(`不支持的航线模式`);if([`draw`,`control`,`edit`].includes(e)&&!T)throw Error(`请先设置起飞点`);if(e!==j){if(e!==`idle`&&J.getMap()!==n)throw Error(`航线交互已移除,请重新创建航线`);if(e===`control`){let e=n.getSize();if(!n.getTargetElement()||!e||e[0]<=0||e[1]<=0)throw Error(`请先将地图挂载到已就绪的容器`);if(n.getView().getProjection().getCode()!==`EPSG:4326`)throw Error(`航线仅支持 EPSG:4326`)}H(()=>{let t=++A,r=()=>O||t!==A,i=j;if(K(),!r()&&(j=e,e!==`idle`&&z.default.prototype.setActive.call(J,!0),!r()))try{if(e===`control`){let e=Y.startRouteControl();if(r())return;e.on(`change`,U),R=()=>e.un(`change`,U)}if(X.updateEditing(),r()||(G(),r()))return;h?.keyboard&&e!==`idle`&&n.getTargetElement()?.focus({preventScroll:!0})}catch(e){throw r()||(K(),r())||(j=i===`control`?`idle`:i,X.updateEditing(),G()),e}})}},setEditConfig(e){if(O)throw Error(`航线已销毁`);let t=bt(e,b);H(()=>{b=t,j===`edit`&&X.updateEditing()})},clear(){Z.importWaypoints([])},exportWaypoints(){return vt(D)},importWaypoints(e){if(O)throw Error(`航线已销毁,请创建新的 Route`);let t=yt(e,{takeoffStyle:a,pointStyle:s});H(()=>{++A;let e=++k,n=()=>O||e!==k;if(K(),!n()&&(j=j===`edit`&&t.length?`edit`:`idle`,D.length=0,T=void 0,E=void 0,x.clear(!0),!n())){for(let e of t)D.push(e);T=D[0],E=D.at(-1),C.setCoordinates(D.map(e=>e.getGeometry().getCoordinates())),!n()&&(x.addFeatures(D.length>1?[...D,w]:D),!n()&&(X.updateEditing(),n()||G()))}})},destroy(){O||(O=!0,++A,j=`idle`,V.clear(),K(),n.un(`change:target`,Q),n.un(`change:view`,Q),J.getMap()?.removeInteraction(J),z.default.prototype.setMap.call(J,null),J.setActive(!1),D.length=0,T=void 0,E=void 0,C.setCoordinates([]),n.removeLayer(S),S.clearRenderer(),S.setSource(null),x.clear(!0),x.dispose(),J.dispose())},setMap(e){if(O)e?.removeInteraction(J);else{if(e&&e!==n)throw Error(`航线不能迁移到其他地图`);e!==J.getMap()&&H(()=>{++A,K(),j=`idle`,z.default.prototype.setMap.call(J,e),G()})}},setActive(e){z.default.prototype.setActive.call(J,e&&!O)},getSelectedWaypoint(){return X.select?.getFeatures().item(0)},adjustWaypointHeight(e,t=X.select?.getFeatures().item(0)){if(!Number.isFinite(e))throw Error(`高度变化必须为有限数值`);if(O||j!==`edit`||!J.getActive()||!t||!D.includes(t))return!1;let n=t.get(`extData`)??{},r=Math.max(0,(n.height??0)+e);if(!Number.isFinite(r))throw Error(`高度必须为有限数值`);return r!==(n.height??0)&&(t.set(`extData`,{...n,height:r}),!O&&D.includes(t)&&J.changed(),!0)},removeWaypoint(e=X.select?.getFeatures().item(0)){if(!X.select||!e||e===T||e===X.pendingInsertion||!D.includes(e))return!1;let t=A,n=k;if(p?.({...vt([e])[0],indexNo:D.indexOf(e)})===!1||O||t!==A||n!==k||!D.includes(e))return!1;if(X.clearEditing(),!D.includes(e))return X.updateEditing(),J.changed(),!1;let r=D.indexOf(e),i=m?{...vt([e])[0],indexNo:r}:void 0;return D.splice(r,1),x.removeFeature(e),re(),X.updateEditing(),J.changed(),!O&&i&&m?.(i),!0},getLayer(){return S},hasTakeoff(){return!!T},setRouteControls(e){Y.setRouteControls(e)},addRouteWaypoint(){Y.aircraft&&J.getActive()&&q(ne(Y.aircraft.getGeometry().getCoordinates()))}}),Q=()=>{O||H(()=>{++A,K(),j=`idle`,G()})};try{n.addLayer(S),n.addInteraction(Z),n.on(`change:target`,Q),n.on(`change:view`,Q),G()}catch(e){throw Z.destroy(),e}return Z},Ct=(e,t,n)=>{let{layerName:r}=n||{},i=Object.assign({className:r||`ol-layer`,source:new F.default({features:new re.default().readFeatures(e)}),style:t||new I.Style({stroke:new I.Stroke({color:`red`,lineDash:[10],width:3}),fill:new I.Fill({color:`rgba(0, 0, 255, 0.1)`})})},n||{});return new P.default(i)},wt=(e,t,n,r)=>t&&n?.get(e[t])||r,Tt=(e,t)=>{let{key:n,crsForm:r}=t,i=[];return e.forEach(e=>{try{let t=e[n],r=Array.isArray(t)?t:JSON.parse(t||`[]`);if(r.length){let t=e.geoType||ue(r);t!==`Invalid`&&i.push({type:`Feature`,properties:{...e},geometry:{type:t,coordinates:r}})}}catch(e){console.error(`创建线状数据失败:${e}`)}}),D.default.transform({type:`FeatureCollection`,features:i},r||D.default.WGS84,D.default.WGS84)},Et=(e,t)=>{let{isLine:n,colorMap:r,fillColor:i,colorKey:a,strokeColor:o,fillOpacity:s,strokeWeight:c,activeFillColor:l,activeFillOpacity:u,activeStrokeColor:d,activeStrokeWeight:f}=t||{},p=e.getProperties(),m=new I.Style({stroke:new I.Stroke({width:f??c??4,color:d||wt(p,a,r,o)})}),h=new I.Style({stroke:new I.Stroke({width:c??2,color:wt(p,a,r,o)})});return n||(m.setFill(new I.Fill({color:ce(l||i||``,u??s??1)||ce(wt(p,a,r,i)||``,s??1)})),h.setFill(new I.Fill({color:ce(wt(p,a,r,i)||``,s??1)}))),e.setProperties({activeStyle:m,unActiveStyle:h}),h},Dt=(e,t)=>{let n=Tt(e,t),r=new g.GeoJSON().readFeatures(n),i=r.map(e=>{let t={...e.getProperties()};return delete t.geometry,t});return r.forEach(e=>{e.setStyle(Et(e,t))}),{features:r,acceptedData:i}},Ot=(e,t)=>{let{isAutoFit:n,layerName:r,openClick:i}=t,{features:a,acceptedData:o}=Dt(e,t),s=new P.default({zIndex:5,className:r||`ol-layer`,source:new F.default({features:a})});return i&&rt(s),s.setProperties({_isCustom:!0,_isAutoFit:n,_isVectorLayer:!0,_vectorConfig:t,_layerName:r,_dataList:o,_uuidSet:new Set(o.map(e=>e._uuid))}),s},kt=(e,t,n)=>{let r=e.getSource(),{_vectorConfig:i}=e.getProperties()||{},{features:a,acceptedData:o}=Dt(t,Object.assign({},i,{crsForm:n??i?.crsForm}));r.addFeatures(a);let s=new Set(e.get(`_uuidSet`)||[]);o.forEach(e=>s.add(e._uuid)),e.set(`_uuidSet`,s),e.set(`_dataList`,[...e.get(`_dataList`)||[],...o])},At=(e=[],t)=>Ot(e,Object.assign({},t,{isLine:!1})),jt=(e=[],t)=>Ot(e,Object.assign({},t,{isLine:!0})),Mt=e=>t=>{let{baseUrl:n,markerIcon:r,statusNum:i=5,activeScale:a=1.3,markerSize:o=[32,32]}=t,s=e(n),[c,l]=o,u=Array(i*2);for(let e=0;e<i;e++){let t=s(`${r}-${e}`,`.webp`);u[e]=new I.Style({zIndex:88+e,image:new I.Icon({width:c,height:l,src:t,anchor:[.5,1]})});let n=s(`${r}-${e}-active`,`.webp`);u[e+i]=new I.Style({zIndex:120,image:new I.Icon({width:c*a,height:l*a,anchor:[.5,1],src:n||t})})}return u},Nt=(e,t=[])=>e.map(e=>{let{crsForm:n}=e,r=D.default.transform([+e.lnglat[0],+e.lnglat[1]],n||D.default.WGS84,D.default.WGS84),i=new O.Feature({geometry:new J.Point(r)});return i.setProperties({...e,unActiveStyle:t[e.style],activeStyle:t[e.style+t.length/2]}),i.setStyle(t[e.style]),i}),Pt=(e,t,n={})=>{let r=e.get(`_massMarksStyles`),i=e?.getSource(),{clear:a}=n,o=Nt(t,r);a&&i?.clear(),i?.addFeatures(o);let s=[...a?[]:e.get(`_dataList`)||[],...t];e.set(`_dataList`,s),e.set(`_uuidSet`,new Set(s.map(e=>e._uuid)))},Ft=(e,t=[])=>{let n=new P.default({zIndex:2e3,source:new F.default({features:Nt(e,t)})});return n.setProperties({_isCustom:!0,_isVectorLayer:!0,_isMassMarksLayer:!0,_statusNum:t.length/2,_dataList:[...e],_uuidSet:new Set(e.map(e=>e._uuid)||[])}),n},It=e=>(t=[],n,r=!0)=>{let{offset:i=[0,0],baseUrl:a,hasLine:o,hasFace:s,layerName:c,isDynamic:l,isAutoFit:u,statusNum:d,markerIcon:f,marksStyles:p,markerSize:m,activeScale:h,vectorConfig:g}=n,_=p||Mt(e)({baseUrl:a,markerIcon:f,markerSize:m,statusNum:d||5,activeScale:h||1.3}),v=Ft(t,_);if(r&&(v.setProperties({_offset:i,_isAutoFit:u}),rt(v)),o){let e=Ot(t,Object.assign({},{key:`line`,isLine:!0,openClick:!1,strokeWeight:4,strokeColor:`rgba(29, 235, 255, 0.8)`},g||{}));$.addLayer(e)}if(s){let e=Ot(t,Object.assign({},{isLine:!1,key:`faceList`,strokeWeight:1,openClick:!1,fillColor:`#4247DF`,strokeStyle:`dashed`,strokeColor:`#4247DF`},g||{}));$.addLayer(e)}return v.setProperties({_isCustom:!0,_offset:i,_hasLine:o,_hasFace:s,className:c,_layerName:c,_isVectorLayer:!0,_isDynamic:l,_massMarksStyles:_}),$.addLayer(v),v},Lt=(e=[])=>{let t=new I.Style({}),n=new Set(e),r=[];return $.getAllLayers().filter(e=>e.get(`_isMassMarksLayer`)).forEach(e=>{e.getSource().getFeatures().forEach(e=>{let i=e.getProperties();n.has(i.status)?(r.push(i),e.setStyle(i.unActiveStyle)):e.setStyle(t)})}),r},Rt=(e,t)=>{let n=$.getAllLayers().filter(t=>(t.get(`_layerName`)||t.getClassName())===e&&t.get(`_isMassMarksLayer`)),r=new I.Style({});n.forEach(e=>{e.getSource().getFeatures().forEach(e=>{let n=e.getProperties();t.has(n.id)?e.setStyle(n.unActiveStyle):e.setStyle(r)})})},zt=(e,t)=>{let n=e.length,r={},{distance:i,minDistance:a,openClick:o,buildStyle:s,singleStyles:c,computedRadius:l,layerName:u=`cluster-layer`}=t,d=e=>(e/n)**(1/18);r[1]=c;let f=e=>{let t=e.get(`features`).length,n=r[t],i=l?l(t):d(t);if(n||(n=new I.Style({image:new B.default({radius:i*20,stroke:new I.Stroke({width:2,color:`hsla(${180-i*180}, 100%, 40%, 1)`}),fill:new I.Fill({color:`hsla(${180-i*180}, 100%, 50%, 1)`})}),text:new I.Text({text:t.toString(),fill:new I.Fill({color:`hsla(${180-i*180}, 100%, 10%, 1)`}),textBaseline:`middle`})}),r[t]=n),Array.isArray(n)){let t=e.get(`features`)[0].get(`styleIndex`)??0;return n[t]}return n},p=new P.default({zIndex:200,className:u,source:new Y.default({distance:i||80,minDistance:a||0,source:new F.default({features:e.map(e=>{let t=new O.Feature(new J.Point(e.lnglat));t.setProperties(e);let n=e.style??0;return t.setProperties({unActiveStyle:c[n],activeStyle:c[n+c.length/2]}),t})})}),style:e=>s?s(e):f(e)});return p.setProperties({_isCustom:!0,_isVectorLayer:!0,_isClusterLayer:!0}),o&&rt(p),p};exports.GeometryType=X,exports.activeFeatureByUid=Ne,exports.addFeaturesByLayer=Pt,exports.addMassMarksLayer=It,exports.appendFeaturesByLayer=kt,exports.baseLayers=ye,exports.buildMassMarksStyles=Mt,exports.changeFeaturesVisibleByIds=Rt,exports.changeLayer=Te,exports.changeSource=we,exports.changeUnselectStyle=$e,exports.createAnimationMarker=Oe,exports.createBaseLayer=_e,exports.createBusinessLayer=Ot,exports.createClusterLayer=zt,exports.createDrawInteraction=dt,exports.createElasticMarkerLayer=et,exports.createGeoJsonLayer=Ct,exports.createIconStyle=Je,exports.createLayerSelectByNames=it,exports.createMap=Ie,exports.createMapInstance=Fe,exports.createMapWorldLayer=ve,exports.createMarker=Ye,exports.createMarkersLayer=Xe,exports.createMassMarksLayer=Ft,exports.createMoveMarkerLayer=tt,exports.createOverlay=ke,exports.createRouteController=St,exports.createSelectByLayer=rt,exports.createTdtVectorSource=Q,exports.createTdtVtsLayer=ie,exports.createText=qe,exports.createVectorFaceLayer=At,exports.createVectorLineLayer=jt,exports.createWmtsLayer=me,exports.createZheJiangLayer=be,exports.disposeInstance=Re,exports.disposeMap=Le,exports.emitter=ae,exports.flyToAnimate=Ke,exports.getDrawStyle=ut,exports.getLayerByName=xe,exports.getLayersDataList=le,exports.getMapInstance=ze,Object.defineProperty(exports,"instance",{enumerable:!0,get:function(){return $}}),exports.removeAllLayers=je,exports.removeLayerByName=Se,exports.removeOverlays=Ee,exports.resetActiveFeature=Me,exports.resetActiveVector=Ae,exports.resetMap=Ve,exports.resetZoomAndCenter=Be,exports.setFitViewByCoords=Ue,exports.setFitViewByGeom=We,exports.setFitViewByLayer=Ge,exports.updateMarksLayersByStatus=Lt,Object.keys(c).forEach(function(e){e!=="default"&&!Object.prototype.hasOwnProperty.call(exports,e)&&Object.defineProperty(exports,e,{enumerable:!0,get:function(){return c[e]}})});
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,s)=>(s=n==null?{}:e(i(n)),o(r||!n||!n.__esModule||!a.call(n,`default`)?t(s,`default`,{value:n,enumerable:!0}):s,n));let c=require("tdt-vts-core"),l=require("ol/format/MVT");l=s(l,1);let u=require("ol/layer/VectorTile");u=s(u,1);let d=require("ol/TileState");d=s(d,1);let f=require("ol/source/VectorTile");f=s(f,1);let p=require("mitt");p=s(p,1);let m=require("ol/source"),h=require("ol/layer/Tile");h=s(h,1);let g=require("ol/format"),_=require("ol/source/WMTS"),v=require("ol/tilegrid"),y=require("ol/layer"),b=require("ol/tilegrid/WMTS");b=s(b,1);let x=require("ol/Observable"),S=require("ol/layer/Image");S=s(S,1);let C=require("ol/source/Raster");C=s(C,1);let w=require("ol/Map");w=s(w,1);let T=require("ol/View");T=s(T,1);let E=require("ol/control"),D=require("gcoord");D=s(D,1);let O=require("ol"),k=require("ol/interaction"),A=require("ol/extent"),j=require("ol/events/condition"),M=require("ol/Feature");M=s(M,1);let N=require("ol/geom/Point");N=s(N,1);let P=require("ol/layer/Vector");P=s(P,1);let F=require("ol/source/Vector");F=s(F,1);let I=require("ol/style"),L=require("ol/interaction/Draw");L=s(L,1);let ee=require("ol/sphere"),te=require("ol/geom/LineString");te=s(te,1);let R=require("ol/interaction/Interaction");R=s(R,1);let z=require("ol/style/Circle");z=s(z,1);let B=require("ol/style/Fill");B=s(B,1);let V=require("ol/style/Icon");V=s(V,1);let H=require("ol/style/Stroke");H=s(H,1);let U=require("ol/style/Style");U=s(U,1);let W=require("ol/style/Text");W=s(W,1);let G=require("ol/Collection");G=s(G,1);let ne=require("ol/interaction/Select");ne=s(ne,1);let K=require("ol/interaction/Translate");K=s(K,1);let q=require("ol/interaction/Snap");q=s(q,1);let re=require("ol/format/GeoJSON");re=s(re,1);let ie=require("ol/geom"),ae=require("ol/source/Cluster");ae=s(ae,1);let oe=/* @__PURE__ */ function(e){return e.LineString=`LineString`,e.MultiLineString=`MultiLineString`,e.Polygon=`Polygon`,e.MultiPolygon=`MultiPolygon`,e.Invalid=`Invalid`,e}({});const J=async e=>{if(typeof e!=`string`)return e;if(!e.trim())throw TypeError(`style 地址不能为空`);let t=await fetch(e);if(!t.ok)throw Error(`加载 style 失败:HTTP ${t.status}`);return await t.json()},Y=e=>{if(!e.hosts?.length||e.hosts.some(e=>!e.trim()))throw TypeError(`hosts 不能为空`);let t=new c.TdtDecoderWorkerClient(e.restoreMode,e.decoderOptions),n=new l.default({layerName:`mvt:layer`}),r=new f.default({projection:`EPSG:3857`,minZoom:e.minZoom??1,maxZoom:e.maxZoom??18,tileSize:512,wrapX:!0,format:n,attributions:`© <a href="https://www.tianditu.gov.cn/" target="_blank" rel="noopener">天地图</a>`,tileUrlFunction(t){if(!t)return;let[n,r,i]=t;if(n!==void 0&&r!==void 0&&i!==void 0)return(0,c.createTdtVtsUrl)([n,r,i],{token:e.token,hosts:e.hosts,maxZoom:e.maxZoom??18,wrapX:!0})},tileLoadFunction(r,i){let a=r;a.setLoader(async(r,o,s)=>{let l=(0,c.redactTdtToken)(i);try{let o=await t.decode(i),c=n.readFeatures(o.buffer,{extent:r,featureProjection:s});a.setFeatures(c),e.diagnostics?.onDecoded?.(o.stats,l)}catch(t){let n=t instanceof Error?t:Error(String(t));e.diagnostics?.onError?.(n,l),console.error(`天地图私有 VTS 加载失败`,l,n),a.setState(d.default.ERROR)}})}}),i=r.dispose.bind(r);return r.dispose=()=>{t.dispose(),i()},{source:r,decoder:t}},X=async e=>{let t=await J(e.style);if(t?.version!==8||!t.sources||!Array.isArray(t.layers))throw TypeError(`style 必须是 Style v8 对象或其 JSON 地址`);let{source:n}=Y({token:e.token,hosts:e.hosts,restoreMode:`auto`}),r=new u.default({declutter:!0,source:n}),i=r.dispose.bind(r);r.dispose=()=>{n.dispose(),i()};try{let{applyBackground:e,applyStyle:n}=await import(`ol-mapbox-style`),i=structuredClone(t);for(let e of i.layers)e.type===`symbol`&&e.layout?.[`text-font`]&&(e.layout[`text-font`]=[`sans-serif`]);return await Promise.all([n(r,i,{projection:`EPSG:4326`,source:`base-tdt-vector-tile`,updateSource:!1}),e(r,i)]),r}catch(e){throw r.dispose(),e}},Z=(0,p.default)();let Q;const se=e=>{Q=e},ce=()=>{Q=void 0},le=(e,t)=>{if(e.startsWith(`#`)){let n=e.replace(`#`,``);return n.length===3&&(n=n[0]+n[0]+n[1]+n[1]+n[2]+n[2]),`rgba(${parseInt(n.substring(0,2),16)}, ${parseInt(n.substring(2,4),16)}, ${parseInt(n.substring(4,6),16)}, ${t})`}return e},ue=()=>Q?.getAllLayers().map(e=>e.get(`_dataList`)||[]).flat(2)||[],de=e=>{let t=e=>!Array.isArray(e)||e.length===0?0:1+t(e[0]),n=e=>{if(!Array.isArray(e)||e.length<3)return!1;let t=e[0],n=e[e.length-1];return t[0]===n[0]&&t[1]===n[1]},r=e=>Array.isArray(e)&&e.length>=2&&typeof e[0]==`number`&&typeof e[1]==`number`,i=e=>Array.isArray(e)&&e.length>=2&&e.every(r),a=e=>Array.isArray(e)?(t(e)===2?[e]:e).every(e=>Array.isArray(e)&&e.length>=4&&n(e)&&e.every(r)):!1,o=t(e);try{return o<2||!e||e.length===0?`Invalid`:o===2&&i(e)?n(e)&&e.length>=4?`Polygon`:`LineString`:o===3&&Array.isArray(e)&&e.every(i)?a(e)?`Polygon`:e.every(e=>!n(e))?`MultiLineString`:`Invalid`:o===4&&Array.isArray(e)&&e.every(e=>a(e))?`MultiPolygon`:`Invalid`}catch(e){return console.error(`Error analyzing coordinates:`,e),`Invalid`}},fe=new g.WMTSCapabilities,pe=/* @__PURE__ */ new Map,me=async e=>{let t=pe.get(e);if(t)return t;let n=await fetch(e);if(!n.ok)throw Error(`WMTS capabilities 请求失败:${n.status}`);let r=fe.read(await n.text());return pe.set(e,r),r},he=e=>async t=>{let{style:n,format:r,version:i,layerName:a,matrixSet:o}=t,[s,c]=a.split(`:`),l=`${e}/${s}/${c}/gwc/service/wmts?request=GetCapabilities`,u=await me(l),d=(0,_.optionsFromCapabilities)(u,{style:n||``,layer:c,version:i||`1.1.0`,format:r||`image/png`,matrixSet:o||`EPSG:4326`});if(!d)throw Error(`Unable to create TileLayer`);return new h.default({zIndex:3,className:a,source:new m.WMTS(d)})},ge=(e,t)=>{let n=t.get(`_selectInteraction`);n&&(e.removeInteraction(n),n.dispose(),t.unset(`_selectInteraction`));let r=t.get(`_resolutionChangeKey`);r&&((0,x.unByKey)(r),t.unset(`_resolutionChangeKey`));let i=t.get(`_dynamicMarkerTimer`);i!==void 0&&(clearTimeout(i),t.unset(`_dynamicMarkerTimer`)),t.getSource()?.dispose(),e.removeLayer(t),t.dispose()},_e=`c77eddc667c5bed016fded560baf93e7`,ve=(e=`hzsyvector_dark`)=>{let t={zIndex:-5,preload:1,minZoom:8,maxZoom:21,source:new m.XYZ({tileGrid:new v.TileGrid({tileSize:256,resolutions:[.00549933137253187,.00274966568626595,.00137483284313297,.000687416421566485,.000343708210783242,.000171854105391621,859270526958104e-19,429635263479052e-19,214817631739526e-19,107408815869763e-19,537044079348816e-20,268522039674407e-20,134261019837204e-20],origin:[118.122911693886,31.2869311022836],extent:[116.43263049006,28.6201742126026,123.705594256347,31.9765041681924]}),projection:`EPSG:4326`,urls:[`https://ywtg.citybrain.hangzhou.gov.cn/${e}/{z}/{y}/{x}`,`https://ywtg.citybrain.hangzhou.gov.cn:9456/${e}/{z}/{y}/{x}`,`https://ywtg.citybrain.hangzhou.gov.cn:9457/${e}/{z}/{y}/{x}`,`https://ywtg.citybrain.hangzhou.gov.cn:9458/${e}/{z}/{y}/{x}`,`https://ywtg.citybrain.hangzhou.gov.cn:9459/${e}/{z}/{y}/{x}`]}),properties:{_isBaseLayer:!0,_layerName:e}};return new y.Tile(t)},ye=(e,t=_e)=>{let[n,r]=e.split(`_`),i={preload:1,zIndex:-10,cacheSize:20240,properties:{_isBaseLayer:!0,_layerName:e},source:new m.WMTS({crossOrigin:`anonymous`,projection:`EPSG:4326`,wrapX:!0,layer:n,style:`default`,version:`1.0.0`,format:`image/png`,matrixSet:r,tileGrid:new b.default({tileSize:256,origin:[-180,90],matrixIds:[`1`,`2`,`3`,`4`,`5`,`6`,`7`,`8`,`9`,`10`,`11`,`12`,`13`,`14`,`15`,`16`,`17`,`18`,`19`],resolutions:[.703125,.3515625,.17578125,.087890625,.0439453125,.02197265625,.010986328125,.0054931640625,.00274658203125,.001373291015625,.0006866455078125,.00034332275390625,.000171661376953125,858306884765625e-19,4291534423828125e-20,21457672119140625e-21,10728836059570312e-21,5364418029785156e-21,2682209014892578e-21]}),url:`https://t{0-7}.tianditu.gov.cn/${e}/wmts?tk=${t}`})};return new y.Tile(i)},be=e=>({baseImgLayer:new y.Tile({className:`img-layer`,source:new m.XYZ({crossOrigin:`anonymous`,tileSize:256,url:`https://t{0-7}.tianditu.gov.cn/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=${e}`}),zIndex:1}),baseCiaLayer:new y.Tile({className:`img-layer`,source:new m.XYZ({crossOrigin:`anonymous`,tileSize:256,url:`https://t{0-7}.tianditu.gov.cn/DataServer?T=cia_w&x={x}&y={y}&l={z}&tk=${e}`}),zIndex:2}),baseVecLayer:new y.Tile({className:`vec-layer`,source:new m.XYZ({crossOrigin:`anonymous`,tileSize:256,url:`https://t{0-7}.tianditu.gov.cn/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=${e}`}),zIndex:1}),baseCvaLayer:new y.Tile({className:`vec-layer`,source:new m.XYZ({crossOrigin:`anonymous`,tileSize:256,url:`https://t{0-7}.tianditu.gov.cn/DataServer?T=cva_w&x={x}&y={y}&l={z}&tk=${e}`}),zIndex:2})}),xe=(e=`emap`,t=`3b0cdd02-c366-4363-b6de-081a9f12b364`)=>new y.Tile({preload:1,minZoom:4,maxZoom:20,zIndex:-10,cacheSize:20240,source:new m.XYZ({wrapX:!0,projection:`EPSG:4326`,crossOrigin:`anonymous`,url:`https://ditu{0-6}.zjzwfw.gov.cn/services/wmts/${e}/default/oss/getTile/{z}/{y}/{x}?token=${t}`})}),Se=e=>Q.getAllLayers().find(t=>(t.get(`_layerName`)||t.getClassName())===e),Ce=e=>{Q.getAllLayers().filter(t=>(t.get(`_layerName`)||t.getClassName())===e).forEach(e=>{ge(Q,e)})},we=()=>Math.max(1,Math.min(4,globalThis.navigator?.hardwareConcurrency??2)),Te=(e,t,n,r={})=>{let i=new C.default({sources:[e],operationType:`image`,operation:(e,t)=>(((e,t)=>{let n=t.ratioArray,r=t.rgbColorArray;if(n&&r){let[t=0,i=0,a=0]=n;for(let n=0;n<e.length;n+=4){let o=e[n],s=e[n+1],c=e[n+2],l=o*t+s*i+c*a;e[n]=r[0]-l,e[n+1]=r[1]-l,e[n+2]=r[2]-l}}})(e[0].data,t),e[0]),threads:r.threads??we()});return i.on(`beforeoperations`,e=>{e.data.ratioArray=n,e.data.rgbColorArray=t}),i},Ee=(e,t,n,r={})=>new S.default({source:Te(e,t,n,r)}),De=(e=``)=>{Q&&Q.getOverlays().getArray().filter(t=>t.get(e||`position`)).forEach(e=>Q.removeOverlay(e))},Oe=()=>De(`_isAnimationMarker`),ke=(e,t)=>{Oe();let{width:n,height:r,lnglat:i,crsForm:a}=t,o=document.createElement(`div`),s=document.createElement(`img`);s.src=e,s.alt=``,n!==void 0&&(s.width=n),r!==void 0&&(s.height=r),o.append(s);let c=new O.Overlay({element:o,stopEvent:!1,positioning:`bottom-center`,position:D.default.transform([+i[0],+i[1]],a||D.default.WGS84,D.default.WGS84)});c.set(`_isAnimationMarker`,!0),Q.addOverlay(c)},Ae=(e={id:`popup-container`,positioning:`top-center`})=>new O.Overlay(Object.assign({element:document.getElementById(e.id)||void 0},e)),je=()=>{De(),Q.getAllLayers().forEach(e=>{e.get(`_selectInteraction`)?.getFeatures().clear()})},Me=()=>{De(),Q&&Q.getAllLayers().forEach(e=>{e.get(`_isBaseLayer`)||ge(Q,e)})},Ne=()=>{De(),Q.getAllLayers().filter(e=>e.get(`_isVectorLayer`)).forEach(e=>{let t=e.get(`_selectInteraction`);t&&(t.dispatchEvent({type:`select`,selected:[],mapBrowserEvent:void 0,deselected:t.getFeatures().getArray()}),t.getFeatures().clear())})},Pe=e=>{let t=Q.getAllLayers().filter(e=>e.get(`_isVectorLayer`));if(t.length){let n=t.find(t=>t.get(`_uuidSet`).has(e)&&t.get(`_selectInteraction`));if(n){let t=(n.getSource()?.getFeatures()||[]).find(t=>t.get(`_uuid`)===e),r=n.get(`_selectInteraction`);if(r){let n=r.getFeatures().getArray();n.find(t=>t.get(`_uuid`)===e)||(r.dispatchEvent({type:`select`,deselected:n,selected:[t],mapBrowserEvent:void 0}),r.getFeatures().push(t))}}}};let $=[119.71512016971076,30.122490541963536];const Fe=(e={})=>{if(Q)return Q;let t=Ie(e);return se(t),t},Ie=(e={})=>{let t=Object.assign({zoom:9.4,maxZoom:18,minZoom:9.4,center:$,baseLayer:`vec-layer`,projection:`EPSG:4326`,layers:[ve()],constrainResolution:!1,smoothExtentConstraint:!1,tk:_e},e||{}),n=new w.default({view:new T.default(t),controls:(0,E.defaults)({zoom:!1,rotate:!1,attribution:!1}),interactions:(0,k.defaults)({pinchRotate:!1,doubleClickZoom:!1,altShiftDragRotate:!1}),layers:t.layers||[ve()]});$=t.center||$,n.activeBaseLayer=t.baseLayer;let r=e=>n.getAllLayers().find(t=>(t.get(`_layerName`)||t.getClassName())===e);n.getLayerByName=r,n.removeLayerByName=e=>{let t=r(e);t&&ge(n,t)},n.changeLayersByNames=(e,t)=>{n.getAllLayers().filter(e=>t.includes(e.getClassName())).forEach(t=>t.setVisible(e?.includes(t.getClassName())))};let i,a;return n.on(`pointermove`,e=>{if(a=e.pixel,i!==void 0)return;let t=()=>{i=void 0;let e=n.getTargetElement();a&&e&&(e.style.cursor=n.hasFeatureAtPixel(a)?`pointer`:``)};i=typeof globalThis.requestAnimationFrame==`function`?globalThis.requestAnimationFrame(t):setTimeout(t,16)}),n.set(`_disposePointerMove`,()=>{i!==void 0&&(typeof globalThis.cancelAnimationFrame==`function`?globalThis.cancelAnimationFrame(i):clearTimeout(i),i=void 0)}),n},Le=()=>{if(!Q)return;let e=Q;e.get(`_disposePointerMove`)?.(),e.unset(`_disposePointerMove`),e.getOverlays().forEach(t=>{e.removeOverlay(t)}),e.getInteractions().clear(),e.getAllLayers().forEach(t=>ge(e,t)),e.setTarget(``),e.dispose(),ce()},Re=()=>Le(),ze=()=>Q,Be=(e=$)=>{Q&&Q.getView().animate({zoom:9.4,center:e,duration:1e3})},Ve=(e={center:$,isClearAll:!0})=>{Me(),Be(e.center||$)},He={padding:[50,50,50,50],duration:1e3},Ue=(e,t=Q,n)=>{let r=t.getView();if(e.length===1)r.animate({zoom:14,duration:1e3,center:e[0],...n||{}});else{let t=(0,A.boundingExtent)(e);r.fit(t,{...He,...n||{}})}},We=(e,t=Q,n)=>{t.getView().fit(e,{...He,...n||{}})},Ge=(e,t=Q,n)=>{let r=e.getSource();if(!r||r.isEmpty())return;let i=r.getExtent();i&&t.getView().fit(i,{...He,...n||{}})},Ke=(e,t)=>{let n=Q.getView(),r=n.getZoom();n.animate({center:e,duration:2e3}),t?n.animate({zoom:t-2,duration:1e3},{zoom:t,duration:1e3}):n.animate({zoom:r-2,duration:1e3},{zoom:r+2>12?12:r+2,duration:1e3})},qe=e=>new I.Text({text:e.text,offsetY:e.offsetY,offsetX:e.offsetX,justify:`center`,textAlign:`center`,font:`16px PingFangSC-Semibold`,fill:new I.Fill({color:`rgba(255, 255, 255, 0.8)`})}),Je=(e,t=!1)=>new I.Style({image:new I.Icon({scale:e.scale||1,rotation:e.rotation||0,anchor:e.anchor||[.5,1],src:t&&e.activeImg||e.img}),text:e.showText?qe(e):void 0}),Ye=(e,t)=>{let n=new M.default({geometry:new N.default([+e.lng,+e.lat]),data:Object.assign({},e||{},{layerName:t.layerName})});return n.setStyle(Je(e)),n},Xe=(e,t)=>{let{layerName:n,visible:r=!0,zIndex:i=10}=t,a=new F.default;return e.forEach(e=>a.addFeature(Ye(e,t))),new P.default({zIndex:i,visible:r,source:a,className:n||`marker-layer`})},Ze=(e,t)=>{let n=t>=14?`largeImg`:t>=11?`smallImg`:`img`;e.forEach(e=>{let t=e.get(`data`);t.isSelected||e.setStyle(Je({...t,img:t[n]},!1))})},Qe=(e,t)=>{let n=e.get(`data`),r={...n,isSelected:t};e.set(`data`,r),n.isElastic?Ze([e],Q.getView().getZoom()):e.setStyle(Je(r,t))},$e=e=>{e.forEach(e=>{Qe(e,!1)}),e.clear()},et=(e,t)=>{let n=e.map(e=>({...e,isElastic:!0})),r=Xe(n,t),i=r.getSource().getFeatures(),a=Q.getView();return Ze(i,a.getZoom()),r.set(`_resolutionChangeKey`,a.on(`change:resolution`,()=>Ze(i,a.getZoom()))),r},tt=(e,t)=>{let n=Ye(e,t),r=new P.default({className:t.layerName||`ol-layer`,source:new F.default({features:[n]})});return Q.addLayer(r),{vectorLayer:r}},nt=(e,t)=>{let n=t.getProperties(),{activeStyle:r}=n;if(t.setStyle(r),Z.emit(`selected-feature`,n),e.set(`_hasActive`,!0),e.get(`_isDynamic`)){let t=r.getImage(),i=e.get(`_dynamicMarkerTimer`);i!==void 0&&clearTimeout(i);let a=setTimeout(()=>{e.unset(`_dynamicMarkerTimer`),Z.emit(`dynamic-marker`,Object.assign({},n.rawData||{},{lnglat:n.lnglat,style:n.style,crsForm:n.crsForm,width:t.getWidth(),height:t.getHeight()}))},1e3);e.set(`_dynamicMarkerTimer`,a)}if(e.get(`_isAutoFit`)){let e=Q.getView();e.animate({duration:1e3,zoom:e.getZoom(),center:(0,A.getCenter)(t.getGeometry().getExtent())})}},rt=e=>{let t=new k.Select({style:null,multi:!1,hitTolerance:10,layers:[e],condition:t=>{if(!(0,j.singleClick)(t))return!1;let n=!1;return Q.forEachFeatureAtPixel(t.pixel,()=>{n=!0},{layerFilter:t=>t===e}),n}});return t.on(`select`,t=>{let{selected:n,deselected:r}=t;if(n.length){let t=n[0];if(e.get(`_isClusterLayer`)){let n=t.get(`features`);n.length===1&&nt(e,n[0])}else nt(e,t)}if(r.length){let t=r[0],n=t.getProperties();t.setStyle(n.unActiveStyle),e.set(`_hasActive`,!1)}}),Q.addInteraction(t),e.set(`_selectInteraction`,t),t},it=(e,t,n)=>{let r=new k.Select({style:null,layers:t=>e.includes(t.getClassName())});return r.on(`select`,({deselected:e,selected:r})=>{if(e.length){let t=e[0];Qe(t,!1),n?.(t)}if(r.length){let e=r[0];Qe(e,!0),t?.(e)}}),r},at=e=>{let t=(0,ee.getArea)(e,{projection:`EPSG:4326`});return t>1e4?`${Math.round(t/1e6*100)/100} km\xB2`:`${Math.round(t*100)/100} m\xB2`},ot=e=>{let t=(0,ee.getLength)(e,{projection:`EPSG:4326`});return t>100?`${Math.round(t/1e3*100)/100} km`:`${Math.round(t*100)/100} m`},st=new I.Style({fill:new I.Fill({color:`rgba(255, 255, 255, 0.2)`}),stroke:new I.Stroke({color:`rgba(0, 0, 0, 0.5)`,lineDash:[10,10],width:2}),image:new I.Circle({radius:5,stroke:new I.Stroke({color:`rgba(0, 0, 0, 0.7)`}),fill:new I.Fill({color:`rgba(255, 255, 255, 0.2)`})})}),ct=/* @__PURE__ */ new WeakMap,lt=e=>{let t=ct.get(e);if(t)return t;let n=new I.Style({text:new I.Text({font:`14px`,fill:new I.Fill({color:`rgba(255, 255, 255, 1)`}),backgroundFill:new I.Fill({color:`rgba(0, 0, 0, 0.7)`}),padding:[3,3,3,3],textBaseline:`bottom`,offsetY:-15}),image:new I.RegularShape({radius:8,points:3,angle:Math.PI,displacement:[0,10],fill:new I.Fill({color:`rgba(0, 0, 0, 0.7)`})})});return ct.set(e,n),n},ut=(e,t=st)=>{let n=t?[t]:[],r=e.getGeometry(),i,a;if(r.getType()===`Polygon`?(i=r.getInteriorPoint(),a=at(r)):r.getType()===`LineString`&&(i=new N.default(r.getLastCoordinate()),a=ot(r)),i&&a){let t=lt(e);t.setGeometry(i),t.getText().setText(a),n.push(t)}return n},dt=(e=`Point`,t,n)=>new L.default({source:t.getSource(),type:e,style:n?e=>ut(e,void 0):void 0}),ft=({geometry:e,interaction:t,isDestroyed:n,vectorLayer:r,aircraftStyle:i,speed:a,turnSpeed:o,verticalSpeed:s,getLastWaypoint:c})=>{let l,u,d=0,f,p,m,h=0,g=0,_=/* @__PURE__ */ new Set,v=()=>{_.clear(),m!==void 0&&f?.cancelAnimationFrame(m),m=void 0},y=e=>{m=void 0;let n=t.getMap();if(!l||!n||!t.getActive()){v();return}let r=l,c=Math.min(Math.max(0,e-h)/1e3,.1);h=e;let u=Number(_.has(`turnRight`))-Number(_.has(`turnLeft`));d=(d+u*o*c+360)%360,i===void 0&&l.getStyle().getImage().setRotation(d*Math.PI/180);let p=Number(_.has(`forward`))-Number(_.has(`backward`)),g=Number(_.has(`right`))-Number(_.has(`left`));if(p||g){let e=n.getView(),t=(0,ee.offset)(r.getGeometry().getCoordinates(),a*c,d*Math.PI/180+Math.atan2(g,p));if(r.getGeometry().setCoordinates(t),l!==r||(e.setCenter(t),l!==r))return}let b=Number(_.has(`ascend`))-Number(_.has(`descend`));r.set(`height`,Math.max(0,r.get(`height`)+b*s*c)),l===r&&(l.set(`heading`,d),l===r&&(l.changed(),l===r&&_.size&&m===void 0&&(m=f.requestAnimationFrame(y))))},b=()=>{g++,v(),p?.(),p=void 0,f=void 0;let e=u;if(u=void 0,l=void 0,e){let t=e.getSource();e.setMap(null),e.clearRenderer(),e.setSource(null),t?.clear(!0),t?.dispose()}c()?.set(`isAircraft`,!0,!0),n()||r.changed()};return{get aircraft(){return l},get heading(){return d},get revision(){return g},startRouteControl(){let n=t.getMap(),o=n?.getTargetElement(),s=n?.getSize();if(!n||!o||!s||s[0]<=0||s[1]<=0||!t.getActive())throw Error(`请先将启用的航点交互添加到已就绪的地图`);let m=n.getView(),h=++g,_=()=>{if(h!==g||t.getMap()!==n||n.getView()!==m||!t.getActive()||n.getTargetElement()!==o)throw Error(`飞行操控启动已取消`)};if(l)return l;d=0,n.renderSync(),_();let v=e.getLastCoordinate();return l=new M.default({geometry:new N.default(v),isAircraft:!0,heading:d,height:c()?.get(`extData`)?.height??0,speed:a}),l.setStyle(i??new I.Style({image:new I.Icon({src:`data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2228%22%20height%3D%2236%22%20viewBox%3D%220%200%2028%2036%22%3E%3Cpath%20d%3D%22M14%202%2024%2032%2014%2025%204%2032Z%22%20fill%3D%22%23f97316%22%20stroke%3D%22%23fff%22%20stroke-width%3D%222%22%20stroke-linejoin%3D%22round%22%2F%3E%3C%2Fsvg%3E`,rotateWithView:!0})})),u=new P.default({source:new F.default({features:[l]})}),u.setMap(n),_(),n.on(`change:view`,b),f=o.ownerDocument.defaultView,p=()=>n.un(`change:view`,b),c()?.set(`isAircraft`,!1,!0),r.changed(),_(),l},setRouteControls(e){let n=[`forward`,`backward`,`left`,`right`,`turnLeft`,`turnRight`,`ascend`,`descend`];if(e.some(e=>!n.includes(e)))throw Error(`不支持的飞行动作`);l&&t.getActive()&&(_=new Set(e),_.size?m===void 0&&(h=f.performance.now(),m=f.requestAnimationFrame(y)):v())},stopRouteControl:b}},pt={KeyW:`forward`,KeyS:`backward`,KeyA:`left`,KeyD:`right`,KeyQ:`turnLeft`,KeyE:`turnRight`,KeyZ:`descend`,KeyC:`ascend`,Space:`waypoint`},mt=e=>e===`ascend`||e===`descend`,ht=(e,t)=>{let n=e.getTarget(),r=typeof t.container==`string`?(n?.ownerDocument??globalThis.document)?.getElementById(t.container):t.container;if(typeof t.container==`string`&&!r)throw Error(`找不到航线输入容器:${t.container}`);if(e.getMode()!==`control`&&e.getMode()!==`edit`)return()=>void 0;let i=(n??r)?.ownerDocument,a=i?.defaultView;if(!i||!a)return()=>{e.setRouteControls([]),e.setActiveControls([])};let o=/* @__PURE__ */ new Map,s=/* @__PURE__ */ new Map,c=!!t.keyboard&&!!n&&!n.hasAttribute(`tabindex`);c&&(n.tabIndex=0);let l=t=>e.getMode()===`control`||e.getMode()===`edit`&&mt(t),u=!!t.keyboard&&e.getMode()===`control`,d=/* @__PURE__ */ new Map,f={"background-color":t.activeStyle?.backgroundColor,"border-top-color":t.activeStyle?.borderColor,"border-right-color":t.activeStyle?.borderColor,"border-bottom-color":t.activeStyle?.borderColor,"border-left-color":t.activeStyle?.borderColor,color:t.activeStyle?.color},p=e=>{for(let[e,{original:t,applied:n}]of d){let r=new Set(e.style),i=[.../* @__PURE__ */ new Set([...n.keys(),...r])].map(t=>({property:t,value:e.style.getPropertyValue(t),priority:e.style.getPropertyPriority(t)})).filter(({property:e,value:t,priority:i})=>n.has(e)!==r.has(e)||t!==n.get(e)?.value||i!==n.get(e)?.priority);e.style.cssText=t;for(let{property:t,value:n,priority:r}of i)e.style.setProperty(t,n,r)}if(d.clear(),t.activeStyle&&e.length)for(let t of r?.querySelectorAll(`button[data-route-control]`)??[]){if(t.disabled||!e.includes(t.dataset.routeControl))continue;let n=t.style.cssText;for(let[e,n]of Object.entries(f))typeof n==`string`&&t.style.setProperty(e,n,`important`);let r=new Map(Array.from(t.style,e=>[e,{value:t.style.getPropertyValue(e),priority:t.style.getPropertyPriority(e)}]));d.set(t,{original:n,applied:r})}},m=()=>{let t=[.../* @__PURE__ */ new Set([...o.values(),...[...s.values()].map(({action:e})=>e)])];p(t),e.setRouteControls(e.getMode()===`control`?t.filter(e=>e!==`waypoint`):[]),e.setActiveControls(t)},h=(e,t)=>{try{t.hasPointerCapture(e)&&t.releasePointerCapture(e)}catch{}},g=()=>{if(!o.size&&!s.size)return;o.clear();let e=[...s.entries()];s.clear();for(let[t,{button:n}]of e)h(t,n);m()},_=e=>{let t=e?.closest?.(`button[data-route-control]`);if(!t||t.disabled||!r?.contains(t))return;let n=t.dataset.routeControl;if(Object.values(pt).includes(n)&&l(n))return{button:t,action:n}},v=e=>!!e?.closest(`input, textarea, select, a, [contenteditable]:not([contenteditable="false"])`),y=t=>{e.getMode()===`edit`&&mt(t)?e.adjustWaypointHeight(t===`ascend`?1:-1):e.getMode()===`control`&&t===`waypoint`&&e.addRouteWaypoint()},b=e=>{if(e.defaultPrevented||v(i.activeElement)||i.hidden)return;if(e.ctrlKey||e.altKey||e.metaKey||e.isComposing){g();return}let n=_(e.target),a=!!n&&(e.code===`Space`||e.code===`Enter`),s=a?n.action:t.keyboard?pt[e.code]:void 0;if(!s||!l(s))return;let c=i.activeElement?.closest(`button`);(a||!c||(u||r?.contains(c))&&e.code!==`Space`&&e.code!==`Enter`)&&(e.preventDefault(),!(e.repeat||o.has(e.code))&&(o.set(e.code,s),m(),y(s)))},x=e=>{o.delete(e.code)&&(e.preventDefault(),m())},S=e=>{if(e.button!==0||i.hidden)return;let t=_(e.target);if(t){e.preventDefault(),t.button.focus({preventScroll:!0}),s.set(e.pointerId,t);try{t.button.setPointerCapture(e.pointerId)}catch{}m()}},C=e=>{let t=s.get(e.pointerId);t&&(s.delete(e.pointerId),h(e.pointerId,t.button),m())},w=e=>{let t=_(e.target);t&&!i.hidden&&y(t.action)},T=e=>{v(e.target)&&g()},E=()=>{i.hidden&&g()},D=new Set(u?[]:[t.keyboard?n:void 0,r]);u&&i.addEventListener(`keydown`,b);for(let e of D)e?.addEventListener(`keydown`,b);return i.addEventListener(`keyup`,x,!0),i.addEventListener(`focusin`,T),i.addEventListener(`visibilitychange`,E),r&&(i.addEventListener(`pointerup`,C),i.addEventListener(`pointercancel`,C)),r?.addEventListener(`pointerdown`,S),r?.addEventListener(`lostpointercapture`,C),r?.addEventListener(`click`,w),()=>{u&&i.removeEventListener(`keydown`,b);for(let e of D)e?.removeEventListener(`keydown`,b);i.removeEventListener(`keyup`,x,!0),i.removeEventListener(`focusin`,T),i.removeEventListener(`visibilitychange`,E),r&&(i.removeEventListener(`pointerup`,C),i.removeEventListener(`pointercancel`,C)),r?.removeEventListener(`pointerdown`,S),r?.removeEventListener(`lostpointercapture`,C),r?.removeEventListener(`click`,w),g(),c&&n.getAttribute(`tabindex`)===`0`&&n.removeAttribute(`tabindex`)}},gt=()=>{let e,t,n=new U.default({fill:new B.default({color:`rgba(59, 130, 246, .2)`}),stroke:new H.default({color:`#3b82f6`,width:3}),image:new z.default({radius:6,fill:new B.default({color:`#3b82f6`})})}),r=e=>(t??=new U.default({image:new V.default({src:`data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2228%22%20height%3D%2236%22%20viewBox%3D%220%200%2028%2036%22%3E%3Cpath%20d%3D%22M14%202%2024%2032%2014%2025%204%2032Z%22%20fill%3D%22%23f97316%22%20stroke%3D%22%23fff%22%20stroke-width%3D%222%22%20stroke-linejoin%3D%22round%22%2F%3E%3C%2Fsvg%3E`,rotateWithView:!0}),zIndex:3}),t.getImage().setRotation((e.get(`heading`)??0)*Math.PI/180),t);return{style:n,lineStyle:n,takeoffStyle:t=>(e??=new U.default({image:new V.default({src:`data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2223%22%20height%3D%2232%22%20viewBox%3D%220%200%2023%2032%22%20fill%3D%22none%22%3E%3Cpath%20d%3D%22M14.952%2025.08L14.676%2025.362C17.076%2025.722%2018.732%2026.466%2018.732%2027.33C18.732%2028.542%2015.468%2029.532%2011.442%2029.532C7.416%2029.532%204.152%2028.548%204.152%2027.33C4.152%2026.46%205.832%2025.71%208.256%2025.35L7.98%2025.074C3.354%2025.5%20-3.51563e-08%2026.754%200%2028.242C0%2030.072%205.124%2031.56%2011.442%2031.56C17.76%2031.56%2022.884%2030.072%2022.884%2028.242C22.872%2026.76%2019.548%2025.506%2014.952%2025.08ZM3.336%2019.512L11.484%2027.654L19.572%2019.506V19.5C21.618%2017.43%2022.89%2014.586%2022.89%2011.442C22.89%205.124%2017.766%200%2011.448%200C5.13%200%200.0059996%205.124%200.00599957%2011.442C0.00599957%2014.586%201.278%2017.436%203.336%2019.512ZM11.694%206.198H16.122V10.386H13.38V12.168C13.38%2012.498%2013.56%2012.666%2013.92%2012.666H14.418C14.712%2012.666%2014.898%2012.582%2014.994%2012.42C15.09%2012.258%2015.15%2011.712%2015.186%2010.782C15.78%2011.04%2016.278%2011.238%2016.668%2011.364C16.566%2012.222%2016.452%2012.78%2016.32%2013.038C16.11%2013.668%2015.564%2013.974%2014.664%2013.974H13.38C12.402%2013.974%2011.91%2013.458%2011.91%2012.42V9.06H14.652V7.506H11.694V6.198ZM8.814%2013.908V10.62H6.09V9.294H8.196V8.298H6.456V6.972H8.196V5.592H9.678V6.972H11.274V8.298H9.678V9.294H11.58V10.62H10.236V11.82H11.442V13.146H10.236V14.508C10.59%2014.55%2011.334%2014.574%2012.48%2014.574C13.566%2014.574%2015.012%2014.55%2016.824%2014.514C16.632%2014.988%2016.458%2015.498%2016.302%2016.056C13.428%2016.056%2011.418%2016.02%2010.266%2015.954C9.114%2015.888%208.298%2015.438%207.794%2014.616C7.644%2015.264%207.44%2015.834%207.194%2016.314C6.924%2016.02%206.546%2015.612%206.06%2015.096C6.528%2014.16%206.756%2012.816%206.75%2011.058H8.13C8.13%2011.688%208.106%2012.276%208.058%2012.828C8.244%2013.272%208.49%2013.632%208.814%2013.908Z%22%20fill%3D%22%23FFA01E%22%2F%3E%3C%2Fsvg%3E`,anchor:[.5,1]}),text:new W.default({text:`起飞点`,offsetY:28,fill:new B.default({color:`#FFA01E`}),stroke:new H.default({color:`#fff`,width:3})}),zIndex:2}),t.get(`isAircraft`)?[e,r(t)]:e),pointStyle:e=>e.get(`isAircraft`)?r(e):n,aircraftStyle:r}},_t=()=>{let e=crypto.getRandomValues(/* @__PURE__ */ new Uint8Array(16));e[6]=e[6]&15|64,e[8]=e[8]&63|128;let t=Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(``);return`${t.slice(0,8)}-${t.slice(8,12)}-${t.slice(12,16)}-${t.slice(16,20)}-${t.slice(20)}`},vt=e=>e.map((e,t)=>{let[n,r]=e.getGeometry().getCoordinates(),i=e.get(`extData`)??{};return{...i,uuid:e.get(`uuid`),waylineId:i.waylineId??``,indexNo:t,pointSpeed:i.pointSpeed??0,height:i.height??0,gimbalPichAngle:i.gimbalPichAngle??0,direction:i.direction??e.get(`heading`)??0,shootType:i.shootType??``,supportLightType:i.supportLightType??``,longitude:n,latitude:r}}),yt=(e,{takeoffStyle:t,pointStyle:n})=>{if(!Array.isArray(e))throw Error(`航点必须为数组`);let r=/* @__PURE__ */ new Set,i=/* @__PURE__ */ new Set;for(let t of e){if(!t||typeof t!=`object`)throw Error(`航点必须为对象`);if(t.uuid!==void 0){if(typeof t.uuid!=`string`||!t.uuid.trim())throw Error(`uuid 必须为非空白字符串`);if(i.has(t.uuid))throw Error(`导入航点存在重复 uuid`);i.add(t.uuid)}if(!Number.isInteger(t.indexNo)||t.indexNo<0)throw Error(`indexNo 必须为非负整数`);if(!Number.isFinite(t.longitude)||Math.abs(t.longitude)>180||!Number.isFinite(t.latitude)||Math.abs(t.latitude)>90)throw Error(`航点经纬度必须为有效的 EPSG:4326 坐标`);for(let e of[`direction`,`pointSpeed`,`gimbalPichAngle`])if(t[e]!==void 0&&!Number.isFinite(t[e]))throw Error(`${e} 必须为有限数值`);if(t.pointSpeed!==void 0&&t.pointSpeed<0)throw Error(`pointSpeed 不能为负数`);if(t.height!==void 0&&(!Number.isFinite(t.height)||t.height<0))throw Error(`height 必须为有限非负数`);if(t.waylineId!==void 0&&typeof t.waylineId!=`string`)throw Error(`waylineId 必须为字符串`);if(t.shootType!==void 0&&![``,`time`,`distance`,`none`].includes(t.shootType))throw Error(`不支持的 shootType`);if(t.supportLightType!==void 0&&(typeof t.supportLightType!=`string`||t.supportLightType!==``&&t.supportLightType.split(`,`).some(e=>![`ir`,`visable`].includes(e))))throw Error(`supportLightType 仅支持 ir、visable 或逗号分隔的组合`);let e=`${t.longitude},${t.latitude}`;if(r.has(e))throw Error(`导入航点存在重复位置`);r.add(e)}return[...e].sort((e,t)=>e.indexNo-t.indexNo).map((r,i)=>{let a={...r,height:r.height??0};delete a.uuid,delete a.indexNo,delete a.longitude,delete a.latitude;let o=new M.default({uuid:r.uuid??_t(),geometry:new N.default([r.longitude,r.latitude]),extData:a,heading:r.direction??0,isTakeoff:i===0,isAircraft:i===e.length-1});return o.setStyle(i===0?t:n),o})},bt=(e={},t={mode:`midpoint`,pixelTolerance:10})=>{if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`编辑配置必须为对象`);let{mode:n=t.mode,pixelTolerance:r=t.pixelTolerance}=e;if(n!==`midpoint`&&n!==`snap`)throw Error(`编辑模式必须为 midpoint 或 snap`);if(!Number.isFinite(r)||r<=0)throw Error(`吸附距离必须为有限正数`);return{mode:n,pixelTolerance:r}},xt=({interaction:e,vectorLayer:t,source:n,points:r,layerOptions:i,midpointStyle:a,pointStyle:o,onDuplicate:s,onInsert:c,getTakeoff:l,isDestroyed:u,isEditing:d,getEditConfig:f,syncPath:p})=>{let m,h,g,_=()=>{let e=h;h=void 0,m=void 0,g=void 0,e?.()};return{get pendingInsertion(){return g?.()},get select(){return m},clearEditing:_,updateEditing:()=>{if(_(),u()||h)return;let v=e.getMap();if(!d()||!v||!e.getActive())return;let y=f(),b=new F.default,x=new P.default({...i,source:b,style:a??new I.Style({image:new I.Circle({radius:5,fill:new I.Fill({color:`#fff`}),stroke:new I.Stroke({color:`#3b82f6`,width:2})})}),zIndex:1/0}),S=()=>{x.setVisible(t.getVisible()),b.clear(),y.mode===`snap`?O():r.slice(1).forEach((e,t)=>{let n=r[t].getGeometry().getCoordinates(),i=e.getGeometry().getCoordinates();b.addFeature(new M.default({geometry:new N.default([(n[0]+i[0])/2,(n[1]+i[1])/2]),insertIndex:t+1}))})},C=new ne.default({layers:[t],filter:e=>e!==l()&&r.includes(e),hitTolerance:6});m=C;let w=new K.default({condition:j.primaryAction,filter:e=>e!==l()&&(r.includes(e)||b.hasFeature(e)),hitTolerance:6}),T=new G.default,E=y.mode===`snap`?new q.default({features:T,pixelTolerance:y.pixelTolerance}):void 0;E?.on(`snap`,e=>{if(D||!t.getVisible())return;let n=e.feature.get(`insertIndex`);if(!e.segment||typeof n!=`number`){b.clear();return}let r=b.getFeatures()[0];r||(r=new M.default(new N.default(e.vertex)),b.addFeature(r)),r.set(`insertIndex`,n),r.getGeometry().setCoordinates(e.vertex)}),E?.on(`unsnap`,()=>{D||b.clear()});let D;g=()=>D?.inserted?D.point:void 0;let O=()=>{T.clear(),!D&&t.getVisible()&&r.forEach((e,t)=>{T.push(new M.default(e.getGeometry().clone())),t>0&&T.push(new M.default({geometry:new te.default([r[t-1].getGeometry().getCoordinates(),e.getGeometry().getCoordinates()]),insertIndex:t}))})};if(E){let e=E.handleEvent.bind(E);E.handleEvent=t=>{let n=e(t);return t.type===`pointerdown`&&!D&&b.getFeatures().length&&v.renderSync(),n}}let k=()=>{if(!D)return;let e=D;D=void 0,!u()&&(e.inserted?(r.splice(r.indexOf(e.point),1),n.removeFeature(e.point)):e.point.getGeometry().setCoordinates(e.coordinate),p(),S())};w.on(`translatestart`,e=>{let t=e.features.item(0);D={point:t,coordinate:t.getGeometry().getCoordinates(),insertIndex:t.get(`insertIndex`),inserted:!1,moved:!1},T.clear()}),w.on(`translating`,e=>{let t=D;if(t&&(t.moved=!0,E&&t.point.getGeometry().setCoordinates(e.coordinate),D===t)){if(t.insertIndex!==void 0&&!t.inserted){let{point:e,insertIndex:i}=t;if(e.unset(`insertIndex`),e.setProperties({uuid:_t(),extData:{height:r[i-1].get(`extData`)?.height??0},isTakeoff:!1,isAircraft:!1,heading:r[i-1].get(`heading`)}),e.setStyle(o),r.splice(i,0,e),t.inserted=!0,n.addFeature(e),D!==t)return}p(),D===t&&S()}}),w.on(`translateend`,()=>{if(!D)return;let{point:t,moved:n,inserted:i}=D,a=t.getGeometry().getCoordinates();n&&r.some(e=>{let n=e.getGeometry().getCoordinates();return e!==t&&n[0]===a[0]&&n[1]===a[1]})?(k(),s?.(a.slice())):(D=void 0,S(),n&&e.changed(),i&&c(t))}),C.on(`select`,()=>e.changed());let A=()=>{C.getFeatures().clear(),k(),t.un(`change:visible`,S),v.removeInteraction(w),v.removeInteraction(C),E&&(v.removeInteraction(E),E.dispose()),T.clear(),w.dispose(),C.dispose(),x.setMap(null),x.clearRenderer(),x.setSource(null),b.clear(),b.dispose()};h=A,t.on(`change:visible`,S),S(),x.setMap(v),h===A&&(v.addInteraction(C),h===A&&(v.addInteraction(w),h===A&&E&&v.addInteraction(E)))}}},St=(e={})=>{let t=e.style===void 0?gt():{},{map:n=Q,layerName:r,style:i=t.style,takeoffStyle:a=t.takeoffStyle,lineStyle:o=t.lineStyle,pointStyle:s=t.pointStyle,aircraftStyle:c=t.aircraftStyle,midpointStyle:l,edit:u,onDuplicate:d,onWaypointAdd:f,onBeforeWaypointRemove:p,onWaypointRemove:m,input:h,speed:g=10,turnSpeed:_=60,verticalSpeed:v=1,...y}=e,b=bt(u);if([g,_,v].some(e=>!Number.isFinite(e)||e<=0))throw Error(`飞行速度、转向速度和升降速度必须为有限正数`);if(!n)throw Error(`请先创建地图实例或通过 config.map 指定地图`);let x=new F.default,S=new P.default({...y,className:r||`ol-layer`,source:x,style:i});S.set(`_layerName`,r);let C=new te.default([]),w=-1,T=0,E=new M.default(C);E.setStyle(o);let D,O,k=[],A=!1,j=0,I=0,L=`idle`,z=[],B,V,H=0,U=/* @__PURE__ */ new Set,W=e=>{H++;try{return e()}finally{H--,!H&&!A&&J.changed()}},G=()=>{if(!(H||A))for(let e of[...U]){if(A)break;U.has(e)&&e(Z.getState())}},ne=()=>{let e=B;B=void 0,e?.(),z=[]},K=()=>{ne(),!A&&J.getMap()&&J.getActive()&&(h?.keyboard||h?.container!==void 0)&&(B=ht({getMode:()=>L,getTarget:()=>n.getTargetElement()??void 0,setRouteControls:e=>Z.setRouteControls(e),addRouteWaypoint:()=>Z.addRouteWaypoint(),adjustWaypointHeight:e=>Z.adjustWaypointHeight(e),setActiveControls:e=>{z=[...e],G()}},{...h}))},q=()=>{ne(),V?.(),V=void 0,Y.stopRouteControl(),X.clearEditing()},re=e=>C.getCoordinates().findIndex(t=>t[0]===e[0]&&t[1]===e[1]),ie=e=>{if(!f||A||!e||e===D)return;let t=k.indexOf(e);t!==-1&&f({...vt([e])[0],indexNo:t})},ae=e=>{if(re(e)!==-1){d?.(e.slice());return}let t=j;if(C.appendCoordinate(e),A||t!==j)return;let n=new M.default({uuid:_t(),geometry:new N.default(e),extData:{height:Y.aircraft?.get(`height`)??O?.get(`extData`)?.height??0},isTakeoff:C.getCoordinates().length===1,isAircraft:!Y.aircraft,heading:Y.heading});if(n.setStyle(n.get(`isTakeoff`)?a:s),O?.set(`isAircraft`,!1,!0),O=n,D||=n,k.push(n),x.addFeature(n),!(A||t!==j))return C.getCoordinates().length===2&&x.addFeature(E),J.changed(),n},oe=()=>{if(A)return;let e=j;D=k[0],O=k.at(-1);for(let t of k){let n=t===D;if(t.get(`isTakeoff`)!==n&&t.setStyle(n?a:s),A||e!==j||(t.setProperties({isTakeoff:n,isAircraft:t===O}),A||e!==j))return}C.setCoordinates(k.map(e=>e.getGeometry().getCoordinates())),!(A||e!==j)&&(k.length>1&&!x.hasFeature(E)&&x.addFeature(E),k.length<2&&x.hasFeature(E)&&x.removeFeature(E))},J=new R.default({handleEvent(e){if(A||!J.getActive()||e.type!==`singleclick`||L!==`draw`&&L!==`takeoff`)return!0;let t=e.coordinate.slice();if(!Number.isFinite(t[0])||!Number.isFinite(t[1])||Math.abs(t[0])>180||Math.abs(t[1])>90)return!0;let n=L===`takeoff`,r=re(t);if(r!==-1&&(!n||r>0))return d?.(t.slice()),!1;let i;return W(()=>{let e=j,r=I;if(n&&D){let n=C.getCoordinates();if(n[0]=t,C.setCoordinates(n),A||e!==j)return;D.getGeometry().setCoordinates(t)}else i=ae(t);n&&!A&&e===j&&r===I&&Z.setMode(`idle`)}),ie(i),!1}}),Y=ft({speed:g,turnSpeed:_,verticalSpeed:v,interaction:J,geometry:C,vectorLayer:S,aircraftStyle:c,getLastWaypoint:()=>O,isDestroyed:()=>A}),X=xt({interaction:J,vectorLayer:S,source:x,points:k,layerOptions:y,midpointStyle:l,pointStyle:s,onDuplicate:d,onInsert:ie,getTakeoff:()=>D,isDestroyed:()=>A,isEditing:()=>L===`edit`,getEditConfig:()=>b,syncPath:oe});J.on(`change`,G),J.on(`change:active`,()=>{!J.getActive()&&!A&&Z.setMode(`idle`)});let Z=Object.assign(J,{getState(){w!==C.getRevision()&&(T=(0,ee.getLength)(C,{projection:`EPSG:4326`}),w=C.getRevision());let e=X.select?.getFeatures().item(0),t=Y.aircraft??O,n=t?.getGeometry().getCoordinates();return{mode:L,hasTakeoff:!!D,waypointCount:k.length,totalDistance:T,selectedWaypoint:e?{...vt([e])[0],indexNo:k.indexOf(e)}:null,aircraft:t&&n?{longitude:n[0],latitude:n[1],heading:t.get(`heading`)??0,height:Y.aircraft?t.get(`height`):t.get(`extData`)?.height??0,speed:g}:null,activeControls:[...z],editConfig:{...b}}},subscribe(e){if(A)throw Error(`航线已销毁`);U.add(e);try{e(Z.getState())}catch(t){throw U.delete(e),t}return()=>{U.delete(e)}},setMode(e){if(A)throw Error(`航线已销毁`);if(![`idle`,`takeoff`,`draw`,`control`,`edit`].includes(e))throw Error(`不支持的航线模式`);if([`draw`,`control`,`edit`].includes(e)&&!D)throw Error(`请先设置起飞点`);if(e!==L){if(e!==`idle`&&J.getMap()!==n)throw Error(`航线交互已移除,请重新创建航线`);if(e===`control`){let e=n.getSize();if(!n.getTargetElement()||!e||e[0]<=0||e[1]<=0)throw Error(`请先将地图挂载到已就绪的容器`);if(n.getView().getProjection().getCode()!==`EPSG:4326`)throw Error(`航线仅支持 EPSG:4326`)}W(()=>{let t=++I,r=()=>A||t!==I,i=L;if(q(),!r()&&(L=e,e!==`idle`&&R.default.prototype.setActive.call(J,!0),!r()))try{if(e===`control`){let e=Y.startRouteControl();if(r())return;e.on(`change`,G),V=()=>e.un(`change`,G)}if(X.updateEditing(),r()||(K(),r()))return;h?.keyboard&&e!==`idle`&&n.getTargetElement()?.focus({preventScroll:!0})}catch(e){throw r()||(q(),r())||(L=i===`control`?`idle`:i,X.updateEditing(),K()),e}})}},setEditConfig(e){if(A)throw Error(`航线已销毁`);let t=bt(e,b);W(()=>{b=t,L===`edit`&&X.updateEditing()})},clear(){Z.importWaypoints([])},exportWaypoints(){return vt(k)},importWaypoints(e){if(A)throw Error(`航线已销毁,请创建新的 Route`);let t=yt(e,{takeoffStyle:a,pointStyle:s});W(()=>{++I;let e=++j,n=()=>A||e!==j;if(q(),!n()&&(L=L===`edit`&&t.length?`edit`:`idle`,k.length=0,D=void 0,O=void 0,x.clear(!0),!n())){for(let e of t)k.push(e);D=k[0],O=k.at(-1),C.setCoordinates(k.map(e=>e.getGeometry().getCoordinates())),!n()&&(x.addFeatures(k.length>1?[...k,E]:k),!n()&&(X.updateEditing(),n()||K()))}})},destroy(){A||(A=!0,++I,L=`idle`,U.clear(),q(),n.un(`change:target`,se),n.un(`change:view`,se),J.getMap()?.removeInteraction(J),R.default.prototype.setMap.call(J,null),J.setActive(!1),k.length=0,D=void 0,O=void 0,C.setCoordinates([]),n.removeLayer(S),S.clearRenderer(),S.setSource(null),x.clear(!0),x.dispose(),J.dispose())},setMap(e){if(A)e?.removeInteraction(J);else{if(e&&e!==n)throw Error(`航线不能迁移到其他地图`);e!==J.getMap()&&W(()=>{++I,q(),L=`idle`,R.default.prototype.setMap.call(J,e),K()})}},setActive(e){R.default.prototype.setActive.call(J,e&&!A)},getSelectedWaypoint(){return X.select?.getFeatures().item(0)},adjustWaypointHeight(e,t=X.select?.getFeatures().item(0)){if(!Number.isFinite(e))throw Error(`高度变化必须为有限数值`);if(A||L!==`edit`||!J.getActive()||!t||!k.includes(t))return!1;let n=t.get(`extData`)??{},r=Math.max(0,(n.height??0)+e);if(!Number.isFinite(r))throw Error(`高度必须为有限数值`);return r!==(n.height??0)&&(t.set(`extData`,{...n,height:r}),!A&&k.includes(t)&&J.changed(),!0)},removeWaypoint(e=X.select?.getFeatures().item(0),t={}){if(typeof e==`string`){let t=e;e=k.find(e=>e.get(`uuid`)===t)}if(!X.select||!e||e===D||e===X.pendingInsertion||!k.includes(e))return!1;let n=I,r=j;if((t.intercept===!1?void 0:p?.({...vt([e])[0],indexNo:k.indexOf(e)}))===!1||A||n!==I||r!==j||!k.includes(e))return!1;if(X.clearEditing(),!k.includes(e))return X.updateEditing(),J.changed(),!1;let i=k.indexOf(e),a=m?{...vt([e])[0],indexNo:i}:void 0;return k.splice(i,1),x.removeFeature(e),oe(),X.updateEditing(),J.changed(),!A&&a&&m?.(a),!0},getLayer(){return S},hasTakeoff(){return!!D},setRouteControls(e){Y.setRouteControls(e)},addRouteWaypoint(){Y.aircraft&&J.getActive()&&ie(ae(Y.aircraft.getGeometry().getCoordinates()))}}),se=()=>{A||W(()=>{++I,q(),L=`idle`,K()})};try{n.addLayer(S),n.addInteraction(Z),n.on(`change:target`,se),n.on(`change:view`,se),K()}catch(e){throw Z.destroy(),e}return Z},Ct=(e,t,n)=>{let{layerName:r}=n||{},i=Object.assign({className:r||`ol-layer`,source:new F.default({features:new re.default().readFeatures(e)}),style:t||new I.Style({stroke:new I.Stroke({color:`red`,lineDash:[10],width:3}),fill:new I.Fill({color:`rgba(0, 0, 255, 0.1)`})})},n||{});return new P.default(i)},wt=(e,t,n,r)=>t&&n?.get(e[t])||r,Tt=(e,t)=>{let{key:n,crsForm:r}=t,i=[];return e.forEach(e=>{try{let t=e[n],r=Array.isArray(t)?t:JSON.parse(t||`[]`);if(r.length){let t=e.geoType||de(r);t!==`Invalid`&&i.push({type:`Feature`,properties:{...e},geometry:{type:t,coordinates:r}})}}catch(e){console.error(`创建线状数据失败:${e}`)}}),D.default.transform({type:`FeatureCollection`,features:i},r||D.default.WGS84,D.default.WGS84)},Et=(e,t)=>{let{isLine:n,colorMap:r,fillColor:i,colorKey:a,strokeColor:o,fillOpacity:s,strokeWeight:c,activeFillColor:l,activeFillOpacity:u,activeStrokeColor:d,activeStrokeWeight:f}=t||{},p=e.getProperties(),m=new I.Style({stroke:new I.Stroke({width:f??c??4,color:d||wt(p,a,r,o)})}),h=new I.Style({stroke:new I.Stroke({width:c??2,color:wt(p,a,r,o)})});return n||(m.setFill(new I.Fill({color:le(l||i||``,u??s??1)||le(wt(p,a,r,i)||``,s??1)})),h.setFill(new I.Fill({color:le(wt(p,a,r,i)||``,s??1)}))),e.setProperties({activeStyle:m,unActiveStyle:h}),h},Dt=(e,t)=>{let n=Tt(e,t),r=new g.GeoJSON().readFeatures(n),i=r.map(e=>{let t={...e.getProperties()};return delete t.geometry,t});return r.forEach(e=>{e.setStyle(Et(e,t))}),{features:r,acceptedData:i}},Ot=(e,t)=>{let{isAutoFit:n,layerName:r,openClick:i}=t,{features:a,acceptedData:o}=Dt(e,t),s=new P.default({zIndex:5,className:r||`ol-layer`,source:new F.default({features:a})});return i&&rt(s),s.setProperties({_isCustom:!0,_isAutoFit:n,_isVectorLayer:!0,_vectorConfig:t,_layerName:r,_dataList:o,_uuidSet:new Set(o.map(e=>e._uuid))}),s},kt=(e,t,n)=>{let r=e.getSource(),{_vectorConfig:i}=e.getProperties()||{},{features:a,acceptedData:o}=Dt(t,Object.assign({},i,{crsForm:n??i?.crsForm}));r.addFeatures(a);let s=new Set(e.get(`_uuidSet`)||[]);o.forEach(e=>s.add(e._uuid)),e.set(`_uuidSet`,s),e.set(`_dataList`,[...e.get(`_dataList`)||[],...o])},At=(e=[],t)=>Ot(e,Object.assign({},t,{isLine:!1})),jt=(e=[],t)=>Ot(e,Object.assign({},t,{isLine:!0})),Mt=e=>t=>{let{baseUrl:n,markerIcon:r,statusNum:i=5,activeScale:a=1.3,markerSize:o=[32,32]}=t,s=e(n),[c,l]=o,u=Array(i*2);for(let e=0;e<i;e++){let t=s(`${r}-${e}`,`.webp`);u[e]=new I.Style({zIndex:88+e,image:new I.Icon({width:c,height:l,src:t,anchor:[.5,1]})});let n=s(`${r}-${e}-active`,`.webp`);u[e+i]=new I.Style({zIndex:120,image:new I.Icon({width:c*a,height:l*a,anchor:[.5,1],src:n||t})})}return u},Nt=(e,t=[])=>e.map(e=>{let{crsForm:n}=e,r=D.default.transform([+e.lnglat[0],+e.lnglat[1]],n||D.default.WGS84,D.default.WGS84),i=new O.Feature({geometry:new ie.Point(r)});return i.setProperties({...e,unActiveStyle:t[e.style],activeStyle:t[e.style+t.length/2]}),i.setStyle(t[e.style]),i}),Pt=(e,t,n={})=>{let r=e.get(`_massMarksStyles`),i=e?.getSource(),{clear:a}=n,o=Nt(t,r);a&&i?.clear(),i?.addFeatures(o);let s=[...a?[]:e.get(`_dataList`)||[],...t];e.set(`_dataList`,s),e.set(`_uuidSet`,new Set(s.map(e=>e._uuid)))},Ft=(e,t=[])=>{let n=new P.default({zIndex:2e3,source:new F.default({features:Nt(e,t)})});return n.setProperties({_isCustom:!0,_isVectorLayer:!0,_isMassMarksLayer:!0,_statusNum:t.length/2,_dataList:[...e],_uuidSet:new Set(e.map(e=>e._uuid)||[])}),n},It=e=>(t=[],n,r=!0)=>{let{offset:i=[0,0],baseUrl:a,hasLine:o,hasFace:s,layerName:c,isDynamic:l,isAutoFit:u,statusNum:d,markerIcon:f,marksStyles:p,markerSize:m,activeScale:h,vectorConfig:g}=n,_=p||Mt(e)({baseUrl:a,markerIcon:f,markerSize:m,statusNum:d||5,activeScale:h||1.3}),v=Ft(t,_);if(r&&(v.setProperties({_offset:i,_isAutoFit:u}),rt(v)),o){let e=Ot(t,Object.assign({},{key:`line`,isLine:!0,openClick:!1,strokeWeight:4,strokeColor:`rgba(29, 235, 255, 0.8)`},g||{}));Q.addLayer(e)}if(s){let e=Ot(t,Object.assign({},{isLine:!1,key:`faceList`,strokeWeight:1,openClick:!1,fillColor:`#4247DF`,strokeStyle:`dashed`,strokeColor:`#4247DF`},g||{}));Q.addLayer(e)}return v.setProperties({_isCustom:!0,_offset:i,_hasLine:o,_hasFace:s,className:c,_layerName:c,_isVectorLayer:!0,_isDynamic:l,_massMarksStyles:_}),Q.addLayer(v),v},Lt=(e=[])=>{let t=new I.Style({}),n=new Set(e),r=[];return Q.getAllLayers().filter(e=>e.get(`_isMassMarksLayer`)).forEach(e=>{e.getSource().getFeatures().forEach(e=>{let i=e.getProperties();n.has(i.status)?(r.push(i),e.setStyle(i.unActiveStyle)):e.setStyle(t)})}),r},Rt=(e,t)=>{let n=Q.getAllLayers().filter(t=>(t.get(`_layerName`)||t.getClassName())===e&&t.get(`_isMassMarksLayer`)),r=new I.Style({});n.forEach(e=>{e.getSource().getFeatures().forEach(e=>{let n=e.getProperties();t.has(n.id)?e.setStyle(n.unActiveStyle):e.setStyle(r)})})},zt=(e,t)=>{let n=e.length,r={},{distance:i,minDistance:a,openClick:o,buildStyle:s,singleStyles:c,computedRadius:l,layerName:u=`cluster-layer`}=t,d=e=>(e/n)**(1/18);r[1]=c;let f=e=>{let t=e.get(`features`).length,n=r[t],i=l?l(t):d(t);if(n||(n=new I.Style({image:new z.default({radius:i*20,stroke:new I.Stroke({width:2,color:`hsla(${180-i*180}, 100%, 40%, 1)`}),fill:new I.Fill({color:`hsla(${180-i*180}, 100%, 50%, 1)`})}),text:new I.Text({text:t.toString(),fill:new I.Fill({color:`hsla(${180-i*180}, 100%, 10%, 1)`}),textBaseline:`middle`})}),r[t]=n),Array.isArray(n)){let t=e.get(`features`)[0].get(`styleIndex`)??0;return n[t]}return n},p=new P.default({zIndex:200,className:u,source:new ae.default({distance:i||80,minDistance:a||0,source:new F.default({features:e.map(e=>{let t=new O.Feature(new ie.Point(e.lnglat));t.setProperties(e);let n=e.style??0;return t.setProperties({unActiveStyle:c[n],activeStyle:c[n+c.length/2]}),t})})}),style:e=>s?s(e):f(e)});return p.setProperties({_isCustom:!0,_isVectorLayer:!0,_isClusterLayer:!0}),o&&rt(p),p};exports.GeometryType=oe,exports.activeFeatureByUid=Pe,exports.addFeaturesByLayer=Pt,exports.addMassMarksLayer=It,exports.appendFeaturesByLayer=kt,exports.baseLayers=be,exports.buildMassMarksStyles=Mt,exports.changeFeaturesVisibleByIds=Rt,exports.changeLayer=Ee,exports.changeSource=Te,exports.changeUnselectStyle=$e,exports.createAnimationMarker=ke,exports.createBaseLayer=ve,exports.createBusinessLayer=Ot,exports.createClusterLayer=zt,exports.createDrawInteraction=dt,exports.createElasticMarkerLayer=et,exports.createGeoJsonLayer=Ct,exports.createIconStyle=Je,exports.createLayerSelectByNames=it,exports.createMap=Ie,exports.createMapInstance=Fe,exports.createMapWorldLayer=ye,exports.createMarker=Ye,exports.createMarkersLayer=Xe,exports.createMassMarksLayer=Ft,exports.createMoveMarkerLayer=tt,exports.createOverlay=Ae,exports.createRouteController=St,exports.createSelectByLayer=rt,exports.createTdtVectorSource=Y,exports.createTdtVtsLayer=X,exports.createText=qe,exports.createVectorFaceLayer=At,exports.createVectorLineLayer=jt,exports.createWmtsLayer=he,exports.createZheJiangLayer=xe,exports.disposeInstance=Re,exports.disposeMap=Le,exports.emitter=Z,exports.flyToAnimate=Ke,exports.getDrawStyle=ut,exports.getLayerByName=Se,exports.getLayersDataList=ue,exports.getMapInstance=ze,Object.defineProperty(exports,"instance",{enumerable:!0,get:function(){return Q}}),exports.removeAllLayers=Me,exports.removeLayerByName=Ce,exports.removeOverlays=De,exports.resetActiveFeature=Ne,exports.resetActiveVector=je,exports.resetMap=Ve,exports.resetZoomAndCenter=Be,exports.setFitViewByCoords=Ue,exports.setFitViewByGeom=We,exports.setFitViewByLayer=Ge,exports.updateMarksLayersByStatus=Lt,Object.keys(c).forEach(function(e){e!=="default"&&!Object.prototype.hasOwnProperty.call(exports,e)&&Object.defineProperty(exports,e,{enumerable:!0,get:function(){return c[e]}})});
package/dist/index.d.cts CHANGED
@@ -178,6 +178,11 @@ export interface RouteWaypoint {
178
178
  longitude: number;
179
179
  latitude: number;
180
180
  }
181
+ /** 单次普通航点删除选项。 */
182
+ export type RouteRemoveWaypointOptions = {
183
+ /** 默认执行 onBeforeWaypointRemove;false 仅跳过此前置回调,不跳过删除校验或完成回调。 */
184
+ intercept?: boolean;
185
+ };
181
186
  /** 航线编辑配置;中点编辑与整线吸附编辑互斥,不影响飞行操控。 */
182
187
  export type RouteEditConfig = {
183
188
  /** midpoint 显示固定中点;snap 沿整条线定位临时编辑点;默认 midpoint。 */
@@ -205,7 +210,10 @@ export type RouteState = {
205
210
  mode: RouteMode;
206
211
  hasTakeoff: boolean;
207
212
  waypointCount: number;
213
+ /** 相邻航点的球面水平距离之和(米),包含起飞点,不含高度差、临时飞机及自动返航段。 */
214
+ totalDistance: number;
208
215
  selectedWaypoint: RouteWaypoint | null;
216
+ /** 操控时为实时飞机,否则为末个已记录航点的飞机信息;无航点时为 null。 */
209
217
  aircraft: {
210
218
  longitude: number;
211
219
  latitude: number;
@@ -459,8 +467,8 @@ export declare const createRouteController: (config?: RouteConfig) => Interactio
459
467
  adjustWaypointHeight(delta: number, point?: Feature$1<Point$1, {
460
468
  [x: string]: any;
461
469
  }> | undefined): boolean;
462
- /** 删除指定普通航点,省略参数时删除选中点;起飞点、非编辑状态或其他航线的点返回 false。 */
463
- removeWaypoint(point?: Feature$1<Point$1> | undefined): boolean;
470
+ /** 按 UUID 或 Feature 删除普通航点,省略参数删除选中点;intercept: false 仅跳过删除前回调。 */
471
+ removeWaypoint(point?: Feature$1<Point$1> | string | undefined, options?: RouteRemoveWaypointOptions): boolean;
464
472
  /** 获取自动创建的航线图层;移除交互后图层和结果仍保留。 */
465
473
  getLayer(): VectorLayer<VectorSource<Feature$1<import("ol/geom").Geometry, {
466
474
  [x: string]: any;
package/dist/index.d.mts CHANGED
@@ -178,6 +178,11 @@ export interface RouteWaypoint {
178
178
  longitude: number;
179
179
  latitude: number;
180
180
  }
181
+ /** 单次普通航点删除选项。 */
182
+ export type RouteRemoveWaypointOptions = {
183
+ /** 默认执行 onBeforeWaypointRemove;false 仅跳过此前置回调,不跳过删除校验或完成回调。 */
184
+ intercept?: boolean;
185
+ };
181
186
  /** 航线编辑配置;中点编辑与整线吸附编辑互斥,不影响飞行操控。 */
182
187
  export type RouteEditConfig = {
183
188
  /** midpoint 显示固定中点;snap 沿整条线定位临时编辑点;默认 midpoint。 */
@@ -205,7 +210,10 @@ export type RouteState = {
205
210
  mode: RouteMode;
206
211
  hasTakeoff: boolean;
207
212
  waypointCount: number;
213
+ /** 相邻航点的球面水平距离之和(米),包含起飞点,不含高度差、临时飞机及自动返航段。 */
214
+ totalDistance: number;
208
215
  selectedWaypoint: RouteWaypoint | null;
216
+ /** 操控时为实时飞机,否则为末个已记录航点的飞机信息;无航点时为 null。 */
209
217
  aircraft: {
210
218
  longitude: number;
211
219
  latitude: number;
@@ -459,8 +467,8 @@ export declare const createRouteController: (config?: RouteConfig) => Interactio
459
467
  adjustWaypointHeight(delta: number, point?: Feature$1<Point, {
460
468
  [x: string]: any;
461
469
  }> | undefined): boolean;
462
- /** 删除指定普通航点,省略参数时删除选中点;起飞点、非编辑状态或其他航线的点返回 false。 */
463
- removeWaypoint(point?: Feature$1<Point> | undefined): boolean;
470
+ /** 按 UUID 或 Feature 删除普通航点,省略参数删除选中点;intercept: false 仅跳过删除前回调。 */
471
+ removeWaypoint(point?: Feature$1<Point> | string | undefined, options?: RouteRemoveWaypointOptions): boolean;
464
472
  /** 获取自动创建的航线图层;移除交互后图层和结果仍保留。 */
465
473
  getLayer(): VectorLayer<VectorSource<Feature$1<import("ol/geom").Geometry, {
466
474
  [x: string]: any;
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{TdtDecoderWorkerClient as e,createTdtVtsUrl as t,redactTdtToken as n}from"tdt-vts-core";import r from"ol/format/MVT";import i from"ol/layer/VectorTile";import a from"ol/TileState";import o from"ol/source/VectorTile";import s from"mitt";import{WMTS as c,XYZ as l}from"ol/source";import u from"ol/layer/Tile";import{GeoJSON as d,WMTSCapabilities as f}from"ol/format";import{optionsFromCapabilities as p}from"ol/source/WMTS";import{TileGrid as m}from"ol/tilegrid";import{Tile as h}from"ol/layer";import g from"ol/tilegrid/WMTS";import{unByKey as _}from"ol/Observable";import v from"ol/layer/Image";import y from"ol/source/Raster";import b from"ol/Map";import x from"ol/View";import{defaults as S}from"ol/control";import C from"gcoord";import{Feature as w,Overlay as T}from"ol";import{Select as E,defaults as D}from"ol/interaction";import{boundingExtent as O,getCenter as k}from"ol/extent";import{primaryAction as A,singleClick as j}from"ol/events/condition";import M from"ol/Feature";import N from"ol/geom/Point";import P from"ol/layer/Vector";import F from"ol/source/Vector";import{Circle as I,Fill as L,Icon as R,RegularShape as z,Stroke as B,Style as V,Text as H}from"ol/style";import ee from"ol/interaction/Draw";import{getArea as U,getLength as W,offset as te}from"ol/sphere";import ne from"ol/geom/LineString";import G from"ol/interaction/Interaction";import K from"ol/style/Circle";import q from"ol/style/Fill";import re from"ol/style/Icon";import J from"ol/style/Stroke";import Y from"ol/style/Style";import X from"ol/style/Text";import Z from"ol/Collection";import ie from"ol/interaction/Select";import ae from"ol/interaction/Translate";import oe from"ol/interaction/Snap";import se from"ol/format/GeoJSON";import{Point as ce}from"ol/geom";import le from"ol/source/Cluster";export*from"tdt-vts-core";let ue=/* @__PURE__ */ function(e){return e.LineString=`LineString`,e.MultiLineString=`MultiLineString`,e.Polygon=`Polygon`,e.MultiPolygon=`MultiPolygon`,e.Invalid=`Invalid`,e}({});const de=async e=>{if(typeof e!=`string`)return e;if(!e.trim())throw TypeError(`style 地址不能为空`);let t=await fetch(e);if(!t.ok)throw Error(`加载 style 失败:HTTP ${t.status}`);return await t.json()},fe=i=>{if(!i.hosts?.length||i.hosts.some(e=>!e.trim()))throw TypeError(`hosts 不能为空`);let s=new e(i.restoreMode,i.decoderOptions),c=new r({layerName:`mvt:layer`}),l=new o({projection:`EPSG:3857`,minZoom:i.minZoom??1,maxZoom:i.maxZoom??18,tileSize:512,wrapX:!0,format:c,attributions:`© <a href="https://www.tianditu.gov.cn/" target="_blank" rel="noopener">天地图</a>`,tileUrlFunction(e){if(!e)return;let[n,r,a]=e;if(n!==void 0&&r!==void 0&&a!==void 0)return t([n,r,a],{token:i.token,hosts:i.hosts,maxZoom:i.maxZoom??18,wrapX:!0})},tileLoadFunction(e,t){let r=e;r.setLoader(async(e,o,l)=>{let u=n(t);try{let n=await s.decode(t),a=c.readFeatures(n.buffer,{extent:e,featureProjection:l});r.setFeatures(a),i.diagnostics?.onDecoded?.(n.stats,u)}catch(e){let t=e instanceof Error?e:Error(String(e));i.diagnostics?.onError?.(t,u),console.error(`天地图私有 VTS 加载失败`,u,t),r.setState(a.ERROR)}})}}),u=l.dispose.bind(l);return l.dispose=()=>{s.dispose(),u()},{source:l,decoder:s}},pe=async e=>{let t=await de(e.style);if(t?.version!==8||!t.sources||!Array.isArray(t.layers))throw TypeError(`style 必须是 Style v8 对象或其 JSON 地址`);let{source:n}=fe({token:e.token,hosts:e.hosts,restoreMode:`auto`}),r=new i({declutter:!0,source:n}),a=r.dispose.bind(r);r.dispose=()=>{n.dispose(),a()};try{let{applyBackground:e,applyStyle:n}=await import(`ol-mapbox-style`),i=structuredClone(t);for(let e of i.layers)e.type===`symbol`&&e.layout?.[`text-font`]&&(e.layout[`text-font`]=[`sans-serif`]);return await Promise.all([n(r,i,{projection:`EPSG:4326`,source:`base-tdt-vector-tile`,updateSource:!1}),e(r,i)]),r}catch(e){throw r.dispose(),e}},me=s();let Q;const he=e=>{Q=e},ge=()=>{Q=void 0},_e=(e,t)=>{if(e.startsWith(`#`)){let n=e.replace(`#`,``);return n.length===3&&(n=n[0]+n[0]+n[1]+n[1]+n[2]+n[2]),`rgba(${parseInt(n.substring(0,2),16)}, ${parseInt(n.substring(2,4),16)}, ${parseInt(n.substring(4,6),16)}, ${t})`}return e},ve=()=>Q?.getAllLayers().map(e=>e.get(`_dataList`)||[]).flat(2)||[],ye=e=>{let t=e=>!Array.isArray(e)||e.length===0?0:1+t(e[0]),n=e=>{if(!Array.isArray(e)||e.length<3)return!1;let t=e[0],n=e[e.length-1];return t[0]===n[0]&&t[1]===n[1]},r=e=>Array.isArray(e)&&e.length>=2&&typeof e[0]==`number`&&typeof e[1]==`number`,i=e=>Array.isArray(e)&&e.length>=2&&e.every(r),a=e=>Array.isArray(e)?(t(e)===2?[e]:e).every(e=>Array.isArray(e)&&e.length>=4&&n(e)&&e.every(r)):!1,o=t(e);try{return o<2||!e||e.length===0?`Invalid`:o===2&&i(e)?n(e)&&e.length>=4?`Polygon`:`LineString`:o===3&&Array.isArray(e)&&e.every(i)?a(e)?`Polygon`:e.every(e=>!n(e))?`MultiLineString`:`Invalid`:o===4&&Array.isArray(e)&&e.every(e=>a(e))?`MultiPolygon`:`Invalid`}catch(e){return console.error(`Error analyzing coordinates:`,e),`Invalid`}},be=new f,xe=/* @__PURE__ */ new Map,Se=async e=>{let t=xe.get(e);if(t)return t;let n=await fetch(e);if(!n.ok)throw Error(`WMTS capabilities 请求失败:${n.status}`);let r=be.read(await n.text());return xe.set(e,r),r},Ce=e=>async t=>{let{style:n,format:r,version:i,layerName:a,matrixSet:o}=t,[s,l]=a.split(`:`),d=`${e}/${s}/${l}/gwc/service/wmts?request=GetCapabilities`,f=await Se(d),m=p(f,{style:n||``,layer:l,version:i||`1.1.0`,format:r||`image/png`,matrixSet:o||`EPSG:4326`});if(!m)throw Error(`Unable to create TileLayer`);return new u({zIndex:3,className:a,source:new c(m)})},we=(e,t)=>{let n=t.get(`_selectInteraction`);n&&(e.removeInteraction(n),n.dispose(),t.unset(`_selectInteraction`));let r=t.get(`_resolutionChangeKey`);r&&(_(r),t.unset(`_resolutionChangeKey`));let i=t.get(`_dynamicMarkerTimer`);i!==void 0&&(clearTimeout(i),t.unset(`_dynamicMarkerTimer`)),t.getSource()?.dispose(),e.removeLayer(t),t.dispose()},Te=`c77eddc667c5bed016fded560baf93e7`,Ee=(e=`hzsyvector_dark`)=>{let t={zIndex:-5,preload:1,minZoom:8,maxZoom:21,source:new l({tileGrid:new m({tileSize:256,resolutions:[.00549933137253187,.00274966568626595,.00137483284313297,.000687416421566485,.000343708210783242,.000171854105391621,859270526958104e-19,429635263479052e-19,214817631739526e-19,107408815869763e-19,537044079348816e-20,268522039674407e-20,134261019837204e-20],origin:[118.122911693886,31.2869311022836],extent:[116.43263049006,28.6201742126026,123.705594256347,31.9765041681924]}),projection:`EPSG:4326`,urls:[`https://ywtg.citybrain.hangzhou.gov.cn/${e}/{z}/{y}/{x}`,`https://ywtg.citybrain.hangzhou.gov.cn:9456/${e}/{z}/{y}/{x}`,`https://ywtg.citybrain.hangzhou.gov.cn:9457/${e}/{z}/{y}/{x}`,`https://ywtg.citybrain.hangzhou.gov.cn:9458/${e}/{z}/{y}/{x}`,`https://ywtg.citybrain.hangzhou.gov.cn:9459/${e}/{z}/{y}/{x}`]}),properties:{_isBaseLayer:!0,_layerName:e}};return new h(t)},De=(e,t=Te)=>{let[n,r]=e.split(`_`),i={preload:1,zIndex:-10,cacheSize:20240,properties:{_isBaseLayer:!0,_layerName:e},source:new c({crossOrigin:`anonymous`,projection:`EPSG:4326`,wrapX:!0,layer:n,style:`default`,version:`1.0.0`,format:`image/png`,matrixSet:r,tileGrid:new g({tileSize:256,origin:[-180,90],matrixIds:[`1`,`2`,`3`,`4`,`5`,`6`,`7`,`8`,`9`,`10`,`11`,`12`,`13`,`14`,`15`,`16`,`17`,`18`,`19`],resolutions:[.703125,.3515625,.17578125,.087890625,.0439453125,.02197265625,.010986328125,.0054931640625,.00274658203125,.001373291015625,.0006866455078125,.00034332275390625,.000171661376953125,858306884765625e-19,4291534423828125e-20,21457672119140625e-21,10728836059570312e-21,5364418029785156e-21,2682209014892578e-21]}),url:`https://t{0-7}.tianditu.gov.cn/${e}/wmts?tk=${t}`})};return new h(i)},Oe=e=>({baseImgLayer:new h({className:`img-layer`,source:new l({crossOrigin:`anonymous`,tileSize:256,url:`https://t{0-7}.tianditu.gov.cn/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=${e}`}),zIndex:1}),baseCiaLayer:new h({className:`img-layer`,source:new l({crossOrigin:`anonymous`,tileSize:256,url:`https://t{0-7}.tianditu.gov.cn/DataServer?T=cia_w&x={x}&y={y}&l={z}&tk=${e}`}),zIndex:2}),baseVecLayer:new h({className:`vec-layer`,source:new l({crossOrigin:`anonymous`,tileSize:256,url:`https://t{0-7}.tianditu.gov.cn/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=${e}`}),zIndex:1}),baseCvaLayer:new h({className:`vec-layer`,source:new l({crossOrigin:`anonymous`,tileSize:256,url:`https://t{0-7}.tianditu.gov.cn/DataServer?T=cva_w&x={x}&y={y}&l={z}&tk=${e}`}),zIndex:2})}),ke=(e=`emap`,t=`3b0cdd02-c366-4363-b6de-081a9f12b364`)=>new h({preload:1,minZoom:4,maxZoom:20,zIndex:-10,cacheSize:20240,source:new l({wrapX:!0,projection:`EPSG:4326`,crossOrigin:`anonymous`,url:`https://ditu{0-6}.zjzwfw.gov.cn/services/wmts/${e}/default/oss/getTile/{z}/{y}/{x}?token=${t}`})}),Ae=e=>Q.getAllLayers().find(t=>(t.get(`_layerName`)||t.getClassName())===e),je=e=>{Q.getAllLayers().filter(t=>(t.get(`_layerName`)||t.getClassName())===e).forEach(e=>{we(Q,e)})},Me=()=>Math.max(1,Math.min(4,globalThis.navigator?.hardwareConcurrency??2)),Ne=(e,t,n,r={})=>{let i=new y({sources:[e],operationType:`image`,operation:(e,t)=>(((e,t)=>{let n=t.ratioArray,r=t.rgbColorArray;if(n&&r){let[t=0,i=0,a=0]=n;for(let n=0;n<e.length;n+=4){let o=e[n],s=e[n+1],c=e[n+2],l=o*t+s*i+c*a;e[n]=r[0]-l,e[n+1]=r[1]-l,e[n+2]=r[2]-l}}})(e[0].data,t),e[0]),threads:r.threads??Me()});return i.on(`beforeoperations`,e=>{e.data.ratioArray=n,e.data.rgbColorArray=t}),i},Pe=(e,t,n,r={})=>new v({source:Ne(e,t,n,r)}),Fe=(e=``)=>{Q&&Q.getOverlays().getArray().filter(t=>t.get(e||`position`)).forEach(e=>Q.removeOverlay(e))},Ie=()=>Fe(`_isAnimationMarker`),Le=(e,t)=>{Ie();let{width:n,height:r,lnglat:i,crsForm:a}=t,o=document.createElement(`div`),s=document.createElement(`img`);s.src=e,s.alt=``,n!==void 0&&(s.width=n),r!==void 0&&(s.height=r),o.append(s);let c=new T({element:o,stopEvent:!1,positioning:`bottom-center`,position:C.transform([+i[0],+i[1]],a||C.WGS84,C.WGS84)});c.set(`_isAnimationMarker`,!0),Q.addOverlay(c)},Re=(e={id:`popup-container`,positioning:`top-center`})=>new T(Object.assign({element:document.getElementById(e.id)||void 0},e)),ze=()=>{Fe(),Q.getAllLayers().forEach(e=>{e.get(`_selectInteraction`)?.getFeatures().clear()})},Be=()=>{Fe(),Q&&Q.getAllLayers().forEach(e=>{e.get(`_isBaseLayer`)||we(Q,e)})},Ve=()=>{Fe(),Q.getAllLayers().filter(e=>e.get(`_isVectorLayer`)).forEach(e=>{let t=e.get(`_selectInteraction`);t&&(t.dispatchEvent({type:`select`,selected:[],mapBrowserEvent:void 0,deselected:t.getFeatures().getArray()}),t.getFeatures().clear())})},He=e=>{let t=Q.getAllLayers().filter(e=>e.get(`_isVectorLayer`));if(t.length){let n=t.find(t=>t.get(`_uuidSet`).has(e)&&t.get(`_selectInteraction`));if(n){let t=(n.getSource()?.getFeatures()||[]).find(t=>t.get(`_uuid`)===e),r=n.get(`_selectInteraction`);if(r){let n=r.getFeatures().getArray();n.find(t=>t.get(`_uuid`)===e)||(r.dispatchEvent({type:`select`,deselected:n,selected:[t],mapBrowserEvent:void 0}),r.getFeatures().push(t))}}}};let $=[119.71512016971076,30.122490541963536];const Ue=(e={})=>{if(Q)return Q;let t=We(e);return he(t),t},We=(e={})=>{let t=Object.assign({zoom:9.4,maxZoom:18,minZoom:9.4,center:$,baseLayer:`vec-layer`,projection:`EPSG:4326`,layers:[Ee()],constrainResolution:!1,smoothExtentConstraint:!1,tk:Te},e||{}),n=new b({view:new x(t),controls:S({zoom:!1,rotate:!1,attribution:!1}),interactions:D({pinchRotate:!1,doubleClickZoom:!1,altShiftDragRotate:!1}),layers:t.layers||[Ee()]});$=t.center||$,n.activeBaseLayer=t.baseLayer;let r=e=>n.getAllLayers().find(t=>(t.get(`_layerName`)||t.getClassName())===e);n.getLayerByName=r,n.removeLayerByName=e=>{let t=r(e);t&&we(n,t)},n.changeLayersByNames=(e,t)=>{n.getAllLayers().filter(e=>t.includes(e.getClassName())).forEach(t=>t.setVisible(e?.includes(t.getClassName())))};let i,a;return n.on(`pointermove`,e=>{if(a=e.pixel,i!==void 0)return;let t=()=>{i=void 0;let e=n.getTargetElement();a&&e&&(e.style.cursor=n.hasFeatureAtPixel(a)?`pointer`:``)};i=typeof globalThis.requestAnimationFrame==`function`?globalThis.requestAnimationFrame(t):setTimeout(t,16)}),n.set(`_disposePointerMove`,()=>{i!==void 0&&(typeof globalThis.cancelAnimationFrame==`function`?globalThis.cancelAnimationFrame(i):clearTimeout(i),i=void 0)}),n},Ge=()=>{if(!Q)return;let e=Q;e.get(`_disposePointerMove`)?.(),e.unset(`_disposePointerMove`),e.getOverlays().forEach(t=>{e.removeOverlay(t)}),e.getInteractions().clear(),e.getAllLayers().forEach(t=>we(e,t)),e.setTarget(``),e.dispose(),ge()},Ke=()=>Ge(),qe=()=>Q,Je=(e=$)=>{Q&&Q.getView().animate({zoom:9.4,center:e,duration:1e3})},Ye=(e={center:$,isClearAll:!0})=>{Be(),Je(e.center||$)},Xe={padding:[50,50,50,50],duration:1e3},Ze=(e,t=Q,n)=>{let r=t.getView();if(e.length===1)r.animate({zoom:14,duration:1e3,center:e[0],...n||{}});else{let t=O(e);r.fit(t,{...Xe,...n||{}})}},Qe=(e,t=Q,n)=>{t.getView().fit(e,{...Xe,...n||{}})},$e=(e,t=Q,n)=>{let r=e.getSource();if(!r||r.isEmpty())return;let i=r.getExtent();i&&t.getView().fit(i,{...Xe,...n||{}})},et=(e,t)=>{let n=Q.getView(),r=n.getZoom();n.animate({center:e,duration:2e3}),t?n.animate({zoom:t-2,duration:1e3},{zoom:t,duration:1e3}):n.animate({zoom:r-2,duration:1e3},{zoom:r+2>12?12:r+2,duration:1e3})},tt=e=>new H({text:e.text,offsetY:e.offsetY,offsetX:e.offsetX,justify:`center`,textAlign:`center`,font:`16px PingFangSC-Semibold`,fill:new L({color:`rgba(255, 255, 255, 0.8)`})}),nt=(e,t=!1)=>new V({image:new R({scale:e.scale||1,rotation:e.rotation||0,anchor:e.anchor||[.5,1],src:t&&e.activeImg||e.img}),text:e.showText?tt(e):void 0}),rt=(e,t)=>{let n=new M({geometry:new N([+e.lng,+e.lat]),data:Object.assign({},e||{},{layerName:t.layerName})});return n.setStyle(nt(e)),n},it=(e,t)=>{let{layerName:n,visible:r=!0,zIndex:i=10}=t,a=new F;return e.forEach(e=>a.addFeature(rt(e,t))),new P({zIndex:i,visible:r,source:a,className:n||`marker-layer`})},at=(e,t)=>{let n=t>=14?`largeImg`:t>=11?`smallImg`:`img`;e.forEach(e=>{let t=e.get(`data`);t.isSelected||e.setStyle(nt({...t,img:t[n]},!1))})},ot=(e,t)=>{let n=e.get(`data`),r={...n,isSelected:t};e.set(`data`,r),n.isElastic?at([e],Q.getView().getZoom()):e.setStyle(nt(r,t))},st=e=>{e.forEach(e=>{ot(e,!1)}),e.clear()},ct=(e,t)=>{let n=e.map(e=>({...e,isElastic:!0})),r=it(n,t),i=r.getSource().getFeatures(),a=Q.getView();return at(i,a.getZoom()),r.set(`_resolutionChangeKey`,a.on(`change:resolution`,()=>at(i,a.getZoom()))),r},lt=(e,t)=>{let n=rt(e,t),r=new P({className:t.layerName||`ol-layer`,source:new F({features:[n]})});return Q.addLayer(r),{vectorLayer:r}},ut=(e,t)=>{let n=t.getProperties(),{activeStyle:r}=n;if(t.setStyle(r),me.emit(`selected-feature`,n),e.set(`_hasActive`,!0),e.get(`_isDynamic`)){let t=r.getImage(),i=e.get(`_dynamicMarkerTimer`);i!==void 0&&clearTimeout(i);let a=setTimeout(()=>{e.unset(`_dynamicMarkerTimer`),me.emit(`dynamic-marker`,Object.assign({},n.rawData||{},{lnglat:n.lnglat,style:n.style,crsForm:n.crsForm,width:t.getWidth(),height:t.getHeight()}))},1e3);e.set(`_dynamicMarkerTimer`,a)}if(e.get(`_isAutoFit`)){let e=Q.getView();e.animate({duration:1e3,zoom:e.getZoom(),center:k(t.getGeometry().getExtent())})}},dt=e=>{let t=new E({style:null,multi:!1,hitTolerance:10,layers:[e],condition:t=>{if(!j(t))return!1;let n=!1;return Q.forEachFeatureAtPixel(t.pixel,()=>{n=!0},{layerFilter:t=>t===e}),n}});return t.on(`select`,t=>{let{selected:n,deselected:r}=t;if(n.length){let t=n[0];if(e.get(`_isClusterLayer`)){let n=t.get(`features`);n.length===1&&ut(e,n[0])}else ut(e,t)}if(r.length){let t=r[0],n=t.getProperties();t.setStyle(n.unActiveStyle),e.set(`_hasActive`,!1)}}),Q.addInteraction(t),e.set(`_selectInteraction`,t),t},ft=(e,t,n)=>{let r=new E({style:null,layers:t=>e.includes(t.getClassName())});return r.on(`select`,({deselected:e,selected:r})=>{if(e.length){let t=e[0];ot(t,!1),n?.(t)}if(r.length){let e=r[0];ot(e,!0),t?.(e)}}),r},pt=e=>{let t=U(e,{projection:`EPSG:4326`});return t>1e4?`${Math.round(t/1e6*100)/100} km\xB2`:`${Math.round(t*100)/100} m\xB2`},mt=e=>{let t=W(e,{projection:`EPSG:4326`});return t>100?`${Math.round(t/1e3*100)/100} km`:`${Math.round(t*100)/100} m`},ht=new V({fill:new L({color:`rgba(255, 255, 255, 0.2)`}),stroke:new B({color:`rgba(0, 0, 0, 0.5)`,lineDash:[10,10],width:2}),image:new I({radius:5,stroke:new B({color:`rgba(0, 0, 0, 0.7)`}),fill:new L({color:`rgba(255, 255, 255, 0.2)`})})}),gt=/* @__PURE__ */ new WeakMap,_t=e=>{let t=gt.get(e);if(t)return t;let n=new V({text:new H({font:`14px`,fill:new L({color:`rgba(255, 255, 255, 1)`}),backgroundFill:new L({color:`rgba(0, 0, 0, 0.7)`}),padding:[3,3,3,3],textBaseline:`bottom`,offsetY:-15}),image:new z({radius:8,points:3,angle:Math.PI,displacement:[0,10],fill:new L({color:`rgba(0, 0, 0, 0.7)`})})});return gt.set(e,n),n},vt=(e,t=ht)=>{let n=t?[t]:[],r=e.getGeometry(),i,a;if(r.getType()===`Polygon`?(i=r.getInteriorPoint(),a=pt(r)):r.getType()===`LineString`&&(i=new N(r.getLastCoordinate()),a=mt(r)),i&&a){let t=_t(e);t.setGeometry(i),t.getText().setText(a),n.push(t)}return n},yt=(e=`Point`,t,n)=>new ee({source:t.getSource(),type:e,style:n?e=>vt(e,void 0):void 0}),bt=({geometry:e,interaction:t,isDestroyed:n,vectorLayer:r,aircraftStyle:i,speed:a,turnSpeed:o,verticalSpeed:s,getLastWaypoint:c})=>{let l,u,d=0,f,p,m,h=0,g=0,_=/* @__PURE__ */ new Set,v=()=>{_.clear(),m!==void 0&&f?.cancelAnimationFrame(m),m=void 0},y=e=>{m=void 0;let n=t.getMap();if(!l||!n||!t.getActive()){v();return}let r=l,c=Math.min(Math.max(0,e-h)/1e3,.1);h=e;let u=Number(_.has(`turnRight`))-Number(_.has(`turnLeft`));d=(d+u*o*c+360)%360,i===void 0&&l.getStyle().getImage().setRotation(d*Math.PI/180);let p=Number(_.has(`forward`))-Number(_.has(`backward`)),g=Number(_.has(`right`))-Number(_.has(`left`));if(p||g){let e=n.getView(),t=te(r.getGeometry().getCoordinates(),a*c,d*Math.PI/180+Math.atan2(g,p));if(r.getGeometry().setCoordinates(t),l!==r||(e.setCenter(t),l!==r))return}let b=Number(_.has(`ascend`))-Number(_.has(`descend`));r.set(`height`,Math.max(0,r.get(`height`)+b*s*c)),l===r&&(l.set(`heading`,d),l===r&&(l.changed(),l===r&&_.size&&m===void 0&&(m=f.requestAnimationFrame(y))))},b=()=>{g++,v(),p?.(),p=void 0,f=void 0;let e=u;if(u=void 0,l=void 0,e){let t=e.getSource();e.setMap(null),e.clearRenderer(),e.setSource(null),t?.clear(!0),t?.dispose()}c()?.set(`isAircraft`,!0,!0),n()||r.changed()};return{get aircraft(){return l},get heading(){return d},get revision(){return g},startRouteControl(){let n=t.getMap(),o=n?.getTargetElement(),s=n?.getSize();if(!n||!o||!s||s[0]<=0||s[1]<=0||!t.getActive())throw Error(`请先将启用的航点交互添加到已就绪的地图`);let m=n.getView(),h=++g,_=()=>{if(h!==g||t.getMap()!==n||n.getView()!==m||!t.getActive()||n.getTargetElement()!==o)throw Error(`飞行操控启动已取消`)};if(l)return l;d=0,n.renderSync(),_();let v=e.getLastCoordinate();return l=new M({geometry:new N(v),isAircraft:!0,heading:d,height:c()?.get(`extData`)?.height??0,speed:a}),l.setStyle(i??new V({image:new R({src:`data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2228%22%20height%3D%2236%22%20viewBox%3D%220%200%2028%2036%22%3E%3Cpath%20d%3D%22M14%202%2024%2032%2014%2025%204%2032Z%22%20fill%3D%22%23f97316%22%20stroke%3D%22%23fff%22%20stroke-width%3D%222%22%20stroke-linejoin%3D%22round%22%2F%3E%3C%2Fsvg%3E`,rotateWithView:!0})})),u=new P({source:new F({features:[l]})}),u.setMap(n),_(),n.on(`change:view`,b),f=o.ownerDocument.defaultView,p=()=>n.un(`change:view`,b),c()?.set(`isAircraft`,!1,!0),r.changed(),_(),l},setRouteControls(e){let n=[`forward`,`backward`,`left`,`right`,`turnLeft`,`turnRight`,`ascend`,`descend`];if(e.some(e=>!n.includes(e)))throw Error(`不支持的飞行动作`);l&&t.getActive()&&(_=new Set(e),_.size?m===void 0&&(h=f.performance.now(),m=f.requestAnimationFrame(y)):v())},stopRouteControl:b}},xt={KeyW:`forward`,KeyS:`backward`,KeyA:`left`,KeyD:`right`,KeyQ:`turnLeft`,KeyE:`turnRight`,KeyZ:`descend`,KeyC:`ascend`,Space:`waypoint`},St=e=>e===`ascend`||e===`descend`,Ct=(e,t)=>{let n=e.getTarget(),r=typeof t.container==`string`?(n?.ownerDocument??globalThis.document)?.getElementById(t.container):t.container;if(typeof t.container==`string`&&!r)throw Error(`找不到航线输入容器:${t.container}`);if(e.getMode()!==`control`&&e.getMode()!==`edit`)return()=>void 0;let i=(n??r)?.ownerDocument,a=i?.defaultView;if(!i||!a)return()=>{e.setRouteControls([]),e.setActiveControls([])};let o=/* @__PURE__ */ new Map,s=/* @__PURE__ */ new Map,c=!!t.keyboard&&!!n&&!n.hasAttribute(`tabindex`);c&&(n.tabIndex=0);let l=t=>e.getMode()===`control`||e.getMode()===`edit`&&St(t),u=!!t.keyboard&&e.getMode()===`control`,d=/* @__PURE__ */ new Map,f={"background-color":t.activeStyle?.backgroundColor,"border-top-color":t.activeStyle?.borderColor,"border-right-color":t.activeStyle?.borderColor,"border-bottom-color":t.activeStyle?.borderColor,"border-left-color":t.activeStyle?.borderColor,color:t.activeStyle?.color},p=e=>{for(let[e,{original:t,applied:n}]of d){let r=new Set(e.style),i=[.../* @__PURE__ */ new Set([...n.keys(),...r])].map(t=>({property:t,value:e.style.getPropertyValue(t),priority:e.style.getPropertyPriority(t)})).filter(({property:e,value:t,priority:i})=>n.has(e)!==r.has(e)||t!==n.get(e)?.value||i!==n.get(e)?.priority);e.style.cssText=t;for(let{property:t,value:n,priority:r}of i)e.style.setProperty(t,n,r)}if(d.clear(),t.activeStyle&&e.length)for(let t of r?.querySelectorAll(`button[data-route-control]`)??[]){if(t.disabled||!e.includes(t.dataset.routeControl))continue;let n=t.style.cssText;for(let[e,n]of Object.entries(f))typeof n==`string`&&t.style.setProperty(e,n,`important`);let r=new Map(Array.from(t.style,e=>[e,{value:t.style.getPropertyValue(e),priority:t.style.getPropertyPriority(e)}]));d.set(t,{original:n,applied:r})}},m=()=>{let t=[.../* @__PURE__ */ new Set([...o.values(),...[...s.values()].map(({action:e})=>e)])];p(t),e.setRouteControls(e.getMode()===`control`?t.filter(e=>e!==`waypoint`):[]),e.setActiveControls(t)},h=(e,t)=>{try{t.hasPointerCapture(e)&&t.releasePointerCapture(e)}catch{}},g=()=>{if(!o.size&&!s.size)return;o.clear();let e=[...s.entries()];s.clear();for(let[t,{button:n}]of e)h(t,n);m()},_=e=>{let t=e?.closest?.(`button[data-route-control]`);if(!t||t.disabled||!r?.contains(t))return;let n=t.dataset.routeControl;if(Object.values(xt).includes(n)&&l(n))return{button:t,action:n}},v=e=>!!e?.closest(`input, textarea, select, a, [contenteditable]:not([contenteditable="false"])`),y=t=>{e.getMode()===`edit`&&St(t)?e.adjustWaypointHeight(t===`ascend`?1:-1):e.getMode()===`control`&&t===`waypoint`&&e.addRouteWaypoint()},b=e=>{if(e.defaultPrevented||v(i.activeElement)||i.hidden)return;if(e.ctrlKey||e.altKey||e.metaKey||e.isComposing){g();return}let n=_(e.target),a=!!n&&(e.code===`Space`||e.code===`Enter`),s=a?n.action:t.keyboard?xt[e.code]:void 0;if(!s||!l(s))return;let c=i.activeElement?.closest(`button`);(a||!c||(u||r?.contains(c))&&e.code!==`Space`&&e.code!==`Enter`)&&(e.preventDefault(),!(e.repeat||o.has(e.code))&&(o.set(e.code,s),m(),y(s)))},x=e=>{o.delete(e.code)&&(e.preventDefault(),m())},S=e=>{if(e.button!==0||i.hidden)return;let t=_(e.target);if(t){e.preventDefault(),t.button.focus({preventScroll:!0}),s.set(e.pointerId,t);try{t.button.setPointerCapture(e.pointerId)}catch{}m()}},C=e=>{let t=s.get(e.pointerId);t&&(s.delete(e.pointerId),h(e.pointerId,t.button),m())},w=e=>{let t=_(e.target);t&&!i.hidden&&y(t.action)},T=e=>{v(e.target)&&g()},E=()=>{i.hidden&&g()},D=new Set(u?[]:[t.keyboard?n:void 0,r]);u&&i.addEventListener(`keydown`,b);for(let e of D)e?.addEventListener(`keydown`,b);return i.addEventListener(`keyup`,x,!0),i.addEventListener(`focusin`,T),i.addEventListener(`visibilitychange`,E),r&&(i.addEventListener(`pointerup`,C),i.addEventListener(`pointercancel`,C)),r?.addEventListener(`pointerdown`,S),r?.addEventListener(`lostpointercapture`,C),r?.addEventListener(`click`,w),()=>{u&&i.removeEventListener(`keydown`,b);for(let e of D)e?.removeEventListener(`keydown`,b);i.removeEventListener(`keyup`,x,!0),i.removeEventListener(`focusin`,T),i.removeEventListener(`visibilitychange`,E),r&&(i.removeEventListener(`pointerup`,C),i.removeEventListener(`pointercancel`,C)),r?.removeEventListener(`pointerdown`,S),r?.removeEventListener(`lostpointercapture`,C),r?.removeEventListener(`click`,w),g(),c&&n.getAttribute(`tabindex`)===`0`&&n.removeAttribute(`tabindex`)}},wt=()=>{let e=new Y({image:new K({radius:9,fill:new q({color:`#22c55e`}),stroke:new J({color:`#fff`,width:2})}),text:new X({text:`起飞`,offsetY:-20,fill:new q({color:`#15803d`}),stroke:new J({color:`#fff`,width:3})}),zIndex:2}),t,n=new Y({fill:new q({color:`rgba(59, 130, 246, .2)`}),stroke:new J({color:`#3b82f6`,width:3}),image:new K({radius:6,fill:new q({color:`#3b82f6`})})}),r=e=>(t??=new Y({image:new re({src:`data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2228%22%20height%3D%2236%22%20viewBox%3D%220%200%2028%2036%22%3E%3Cpath%20d%3D%22M14%202%2024%2032%2014%2025%204%2032Z%22%20fill%3D%22%23f97316%22%20stroke%3D%22%23fff%22%20stroke-width%3D%222%22%20stroke-linejoin%3D%22round%22%2F%3E%3C%2Fsvg%3E`,rotateWithView:!0}),zIndex:3}),t.getImage().setRotation((e.get(`heading`)??0)*Math.PI/180),t);return{style:n,lineStyle:n,takeoffStyle:t=>t.get(`isAircraft`)?[e,r(t)]:e,pointStyle:e=>e.get(`isAircraft`)?r(e):n,aircraftStyle:r}},Tt=()=>{let e=crypto.getRandomValues(/* @__PURE__ */ new Uint8Array(16));e[6]=e[6]&15|64,e[8]=e[8]&63|128;let t=Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(``);return`${t.slice(0,8)}-${t.slice(8,12)}-${t.slice(12,16)}-${t.slice(16,20)}-${t.slice(20)}`},Et=e=>e.map((e,t)=>{let[n,r]=e.getGeometry().getCoordinates(),i=e.get(`extData`)??{};return{...i,uuid:e.get(`uuid`),waylineId:i.waylineId??``,indexNo:t,pointSpeed:i.pointSpeed??0,height:i.height??0,gimbalPichAngle:i.gimbalPichAngle??0,direction:i.direction??e.get(`heading`)??0,shootType:i.shootType??``,supportLightType:i.supportLightType??``,longitude:n,latitude:r}}),Dt=(e,{takeoffStyle:t,pointStyle:n})=>{if(!Array.isArray(e))throw Error(`航点必须为数组`);let r=/* @__PURE__ */ new Set,i=/* @__PURE__ */ new Set;for(let t of e){if(!t||typeof t!=`object`)throw Error(`航点必须为对象`);if(t.uuid!==void 0){if(typeof t.uuid!=`string`||!t.uuid.trim())throw Error(`uuid 必须为非空白字符串`);if(i.has(t.uuid))throw Error(`导入航点存在重复 uuid`);i.add(t.uuid)}if(!Number.isInteger(t.indexNo)||t.indexNo<0)throw Error(`indexNo 必须为非负整数`);if(!Number.isFinite(t.longitude)||Math.abs(t.longitude)>180||!Number.isFinite(t.latitude)||Math.abs(t.latitude)>90)throw Error(`航点经纬度必须为有效的 EPSG:4326 坐标`);for(let e of[`direction`,`pointSpeed`,`gimbalPichAngle`])if(t[e]!==void 0&&!Number.isFinite(t[e]))throw Error(`${e} 必须为有限数值`);if(t.pointSpeed!==void 0&&t.pointSpeed<0)throw Error(`pointSpeed 不能为负数`);if(t.height!==void 0&&(!Number.isFinite(t.height)||t.height<0))throw Error(`height 必须为有限非负数`);if(t.waylineId!==void 0&&typeof t.waylineId!=`string`)throw Error(`waylineId 必须为字符串`);if(t.shootType!==void 0&&![``,`time`,`distance`,`none`].includes(t.shootType))throw Error(`不支持的 shootType`);if(t.supportLightType!==void 0&&(typeof t.supportLightType!=`string`||t.supportLightType!==``&&t.supportLightType.split(`,`).some(e=>![`ir`,`visable`].includes(e))))throw Error(`supportLightType 仅支持 ir、visable 或逗号分隔的组合`);let e=`${t.longitude},${t.latitude}`;if(r.has(e))throw Error(`导入航点存在重复位置`);r.add(e)}return[...e].sort((e,t)=>e.indexNo-t.indexNo).map((r,i)=>{let a={...r,height:r.height??0};delete a.uuid,delete a.indexNo,delete a.longitude,delete a.latitude;let o=new M({uuid:r.uuid??Tt(),geometry:new N([r.longitude,r.latitude]),extData:a,heading:r.direction??0,isTakeoff:i===0,isAircraft:i===e.length-1});return o.setStyle(i===0?t:n),o})},Ot=(e={},t={mode:`midpoint`,pixelTolerance:10})=>{if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`编辑配置必须为对象`);let{mode:n=t.mode,pixelTolerance:r=t.pixelTolerance}=e;if(n!==`midpoint`&&n!==`snap`)throw Error(`编辑模式必须为 midpoint 或 snap`);if(!Number.isFinite(r)||r<=0)throw Error(`吸附距离必须为有限正数`);return{mode:n,pixelTolerance:r}},kt=({interaction:e,vectorLayer:t,source:n,points:r,layerOptions:i,midpointStyle:a,pointStyle:o,onDuplicate:s,onInsert:c,getTakeoff:l,isDestroyed:u,isEditing:d,getEditConfig:f,syncPath:p})=>{let m,h,g,_=()=>{let e=h;h=void 0,m=void 0,g=void 0,e?.()};return{get pendingInsertion(){return g?.()},get select(){return m},clearEditing:_,updateEditing:()=>{if(_(),u()||h)return;let v=e.getMap();if(!d()||!v||!e.getActive())return;let y=f(),b=new F,x=new P({...i,source:b,style:a??new V({image:new I({radius:5,fill:new L({color:`#fff`}),stroke:new B({color:`#3b82f6`,width:2})})}),zIndex:1/0}),S=()=>{x.setVisible(t.getVisible()),b.clear(),y.mode===`snap`?O():r.slice(1).forEach((e,t)=>{let n=r[t].getGeometry().getCoordinates(),i=e.getGeometry().getCoordinates();b.addFeature(new M({geometry:new N([(n[0]+i[0])/2,(n[1]+i[1])/2]),insertIndex:t+1}))})},C=new ie({layers:[t],filter:e=>e!==l()&&r.includes(e),hitTolerance:6});m=C;let w=new ae({condition:A,filter:e=>e!==l()&&(r.includes(e)||b.hasFeature(e)),hitTolerance:6}),T=new Z,E=y.mode===`snap`?new oe({features:T,pixelTolerance:y.pixelTolerance}):void 0;E?.on(`snap`,e=>{if(D||!t.getVisible())return;let n=e.feature.get(`insertIndex`);if(!e.segment||typeof n!=`number`){b.clear();return}let r=b.getFeatures()[0];r||(r=new M(new N(e.vertex)),b.addFeature(r)),r.set(`insertIndex`,n),r.getGeometry().setCoordinates(e.vertex)}),E?.on(`unsnap`,()=>{D||b.clear()});let D;g=()=>D?.inserted?D.point:void 0;let O=()=>{T.clear(),!D&&t.getVisible()&&r.forEach((e,t)=>{T.push(new M(e.getGeometry().clone())),t>0&&T.push(new M({geometry:new ne([r[t-1].getGeometry().getCoordinates(),e.getGeometry().getCoordinates()]),insertIndex:t}))})};if(E){let e=E.handleEvent.bind(E);E.handleEvent=t=>{let n=e(t);return t.type===`pointerdown`&&!D&&b.getFeatures().length&&v.renderSync(),n}}let k=()=>{if(!D)return;let e=D;D=void 0,!u()&&(e.inserted?(r.splice(r.indexOf(e.point),1),n.removeFeature(e.point)):e.point.getGeometry().setCoordinates(e.coordinate),p(),S())};w.on(`translatestart`,e=>{let t=e.features.item(0);D={point:t,coordinate:t.getGeometry().getCoordinates(),insertIndex:t.get(`insertIndex`),inserted:!1,moved:!1},T.clear()}),w.on(`translating`,e=>{let t=D;if(t&&(t.moved=!0,E&&t.point.getGeometry().setCoordinates(e.coordinate),D===t)){if(t.insertIndex!==void 0&&!t.inserted){let{point:e,insertIndex:i}=t;if(e.unset(`insertIndex`),e.setProperties({uuid:Tt(),extData:{height:r[i-1].get(`extData`)?.height??0},isTakeoff:!1,isAircraft:!1,heading:r[i-1].get(`heading`)}),e.setStyle(o),r.splice(i,0,e),t.inserted=!0,n.addFeature(e),D!==t)return}p(),D===t&&S()}}),w.on(`translateend`,()=>{if(!D)return;let{point:t,moved:n,inserted:i}=D,a=t.getGeometry().getCoordinates();n&&r.some(e=>{let n=e.getGeometry().getCoordinates();return e!==t&&n[0]===a[0]&&n[1]===a[1]})?(k(),s?.(a.slice())):(D=void 0,S(),n&&e.changed(),i&&c(t))}),C.on(`select`,()=>e.changed());let j=()=>{C.getFeatures().clear(),k(),t.un(`change:visible`,S),v.removeInteraction(w),v.removeInteraction(C),E&&(v.removeInteraction(E),E.dispose()),T.clear(),w.dispose(),C.dispose(),x.setMap(null),x.clearRenderer(),x.setSource(null),b.clear(),b.dispose()};h=j,t.on(`change:visible`,S),S(),x.setMap(v),h===j&&(v.addInteraction(C),h===j&&(v.addInteraction(w),h===j&&E&&v.addInteraction(E)))}}},At=(e={})=>{let t=e.style===void 0?wt():{},{map:n=Q,layerName:r,style:i=t.style,takeoffStyle:a=t.takeoffStyle,lineStyle:o=t.lineStyle,pointStyle:s=t.pointStyle,aircraftStyle:c=t.aircraftStyle,midpointStyle:l,edit:u,onDuplicate:d,onWaypointAdd:f,onBeforeWaypointRemove:p,onWaypointRemove:m,input:h,speed:g=10,turnSpeed:_=60,verticalSpeed:v=1,...y}=e,b=Ot(u);if([g,_,v].some(e=>!Number.isFinite(e)||e<=0))throw Error(`飞行速度、转向速度和升降速度必须为有限正数`);if(!n)throw Error(`请先创建地图实例或通过 config.map 指定地图`);let x=new F,S=new P({...y,className:r||`ol-layer`,source:x,style:i});S.set(`_layerName`,r);let C=new ne([]),w=new M(C);w.setStyle(o);let T,E,D=[],O=!1,k=0,A=0,j=`idle`,I=[],L,R,z=0,B=/* @__PURE__ */ new Set,V=e=>{z++;try{return e()}finally{z--,!z&&!O&&J.changed()}},H=()=>{if(!(z||O))for(let e of[...B]){if(O)break;B.has(e)&&e(Z.getState())}},ee=()=>{let e=L;L=void 0,e?.(),I=[]},U=()=>{ee(),!O&&J.getMap()&&J.getActive()&&(h?.keyboard||h?.container!==void 0)&&(L=Ct({getMode:()=>j,getTarget:()=>n.getTargetElement()??void 0,setRouteControls:e=>Z.setRouteControls(e),addRouteWaypoint:()=>Z.addRouteWaypoint(),adjustWaypointHeight:e=>Z.adjustWaypointHeight(e),setActiveControls:e=>{I=[...e],H()}},{...h}))},W=()=>{ee(),R?.(),R=void 0,Y.stopRouteControl(),X.clearEditing()},te=e=>C.getCoordinates().findIndex(t=>t[0]===e[0]&&t[1]===e[1]),K=e=>{if(!f||O||!e||e===T)return;let t=D.indexOf(e);t!==-1&&f({...Et([e])[0],indexNo:t})},q=e=>{if(te(e)!==-1){d?.(e.slice());return}let t=k;if(C.appendCoordinate(e),O||t!==k)return;let n=new M({uuid:Tt(),geometry:new N(e),extData:{height:Y.aircraft?.get(`height`)??E?.get(`extData`)?.height??0},isTakeoff:C.getCoordinates().length===1,isAircraft:!Y.aircraft,heading:Y.heading});if(n.setStyle(n.get(`isTakeoff`)?a:s),E?.set(`isAircraft`,!1,!0),E=n,T||=n,D.push(n),x.addFeature(n),!(O||t!==k))return C.getCoordinates().length===2&&x.addFeature(w),J.changed(),n},re=()=>{if(O)return;let e=k;T=D[0],E=D.at(-1);for(let t of D){let n=t===T;if(t.get(`isTakeoff`)!==n&&t.setStyle(n?a:s),O||e!==k||(t.setProperties({isTakeoff:n,isAircraft:t===E}),O||e!==k))return}C.setCoordinates(D.map(e=>e.getGeometry().getCoordinates())),!(O||e!==k)&&(D.length>1&&!x.hasFeature(w)&&x.addFeature(w),D.length<2&&x.hasFeature(w)&&x.removeFeature(w))},J=new G({handleEvent(e){if(O||!J.getActive()||e.type!==`singleclick`||j!==`draw`&&j!==`takeoff`)return!0;let t=e.coordinate.slice();if(!Number.isFinite(t[0])||!Number.isFinite(t[1])||Math.abs(t[0])>180||Math.abs(t[1])>90)return!0;let n=j===`takeoff`,r=te(t);if(r!==-1&&(!n||r>0))return d?.(t.slice()),!1;let i;return V(()=>{let e=k,r=A;if(n&&T){let n=C.getCoordinates();if(n[0]=t,C.setCoordinates(n),O||e!==k)return;T.getGeometry().setCoordinates(t)}else i=q(t);n&&!O&&e===k&&r===A&&Z.setMode(`idle`)}),K(i),!1}}),Y=bt({speed:g,turnSpeed:_,verticalSpeed:v,interaction:J,geometry:C,vectorLayer:S,aircraftStyle:c,getLastWaypoint:()=>E,isDestroyed:()=>O}),X=kt({interaction:J,vectorLayer:S,source:x,points:D,layerOptions:y,midpointStyle:l,pointStyle:s,onDuplicate:d,onInsert:K,getTakeoff:()=>T,isDestroyed:()=>O,isEditing:()=>j===`edit`,getEditConfig:()=>b,syncPath:re});J.on(`change`,H),J.on(`change:active`,()=>{!J.getActive()&&!O&&Z.setMode(`idle`)});let Z=Object.assign(J,{getState(){let e=X.select?.getFeatures().item(0),t=Y.aircraft,n=t?.getGeometry().getCoordinates();return{mode:j,hasTakeoff:!!T,waypointCount:D.length,selectedWaypoint:e?{...Et([e])[0],indexNo:D.indexOf(e)}:null,aircraft:t&&n?{longitude:n[0],latitude:n[1],heading:t.get(`heading`),height:t.get(`height`),speed:t.get(`speed`)}:null,activeControls:[...I],editConfig:{...b}}},subscribe(e){if(O)throw Error(`航线已销毁`);B.add(e);try{e(Z.getState())}catch(t){throw B.delete(e),t}return()=>{B.delete(e)}},setMode(e){if(O)throw Error(`航线已销毁`);if(![`idle`,`takeoff`,`draw`,`control`,`edit`].includes(e))throw Error(`不支持的航线模式`);if([`draw`,`control`,`edit`].includes(e)&&!T)throw Error(`请先设置起飞点`);if(e!==j){if(e!==`idle`&&J.getMap()!==n)throw Error(`航线交互已移除,请重新创建航线`);if(e===`control`){let e=n.getSize();if(!n.getTargetElement()||!e||e[0]<=0||e[1]<=0)throw Error(`请先将地图挂载到已就绪的容器`);if(n.getView().getProjection().getCode()!==`EPSG:4326`)throw Error(`航线仅支持 EPSG:4326`)}V(()=>{let t=++A,r=()=>O||t!==A,i=j;if(W(),!r()&&(j=e,e!==`idle`&&G.prototype.setActive.call(J,!0),!r()))try{if(e===`control`){let e=Y.startRouteControl();if(r())return;e.on(`change`,H),R=()=>e.un(`change`,H)}if(X.updateEditing(),r()||(U(),r()))return;h?.keyboard&&e!==`idle`&&n.getTargetElement()?.focus({preventScroll:!0})}catch(e){throw r()||(W(),r())||(j=i===`control`?`idle`:i,X.updateEditing(),U()),e}})}},setEditConfig(e){if(O)throw Error(`航线已销毁`);let t=Ot(e,b);V(()=>{b=t,j===`edit`&&X.updateEditing()})},clear(){Z.importWaypoints([])},exportWaypoints(){return Et(D)},importWaypoints(e){if(O)throw Error(`航线已销毁,请创建新的 Route`);let t=Dt(e,{takeoffStyle:a,pointStyle:s});V(()=>{++A;let e=++k,n=()=>O||e!==k;if(W(),!n()&&(j=j===`edit`&&t.length?`edit`:`idle`,D.length=0,T=void 0,E=void 0,x.clear(!0),!n())){for(let e of t)D.push(e);T=D[0],E=D.at(-1),C.setCoordinates(D.map(e=>e.getGeometry().getCoordinates())),!n()&&(x.addFeatures(D.length>1?[...D,w]:D),!n()&&(X.updateEditing(),n()||U()))}})},destroy(){O||(O=!0,++A,j=`idle`,B.clear(),W(),n.un(`change:target`,ie),n.un(`change:view`,ie),J.getMap()?.removeInteraction(J),G.prototype.setMap.call(J,null),J.setActive(!1),D.length=0,T=void 0,E=void 0,C.setCoordinates([]),n.removeLayer(S),S.clearRenderer(),S.setSource(null),x.clear(!0),x.dispose(),J.dispose())},setMap(e){if(O)e?.removeInteraction(J);else{if(e&&e!==n)throw Error(`航线不能迁移到其他地图`);e!==J.getMap()&&V(()=>{++A,W(),j=`idle`,G.prototype.setMap.call(J,e),U()})}},setActive(e){G.prototype.setActive.call(J,e&&!O)},getSelectedWaypoint(){return X.select?.getFeatures().item(0)},adjustWaypointHeight(e,t=X.select?.getFeatures().item(0)){if(!Number.isFinite(e))throw Error(`高度变化必须为有限数值`);if(O||j!==`edit`||!J.getActive()||!t||!D.includes(t))return!1;let n=t.get(`extData`)??{},r=Math.max(0,(n.height??0)+e);if(!Number.isFinite(r))throw Error(`高度必须为有限数值`);return r!==(n.height??0)&&(t.set(`extData`,{...n,height:r}),!O&&D.includes(t)&&J.changed(),!0)},removeWaypoint(e=X.select?.getFeatures().item(0)){if(!X.select||!e||e===T||e===X.pendingInsertion||!D.includes(e))return!1;let t=A,n=k;if(p?.({...Et([e])[0],indexNo:D.indexOf(e)})===!1||O||t!==A||n!==k||!D.includes(e))return!1;if(X.clearEditing(),!D.includes(e))return X.updateEditing(),J.changed(),!1;let r=D.indexOf(e),i=m?{...Et([e])[0],indexNo:r}:void 0;return D.splice(r,1),x.removeFeature(e),re(),X.updateEditing(),J.changed(),!O&&i&&m?.(i),!0},getLayer(){return S},hasTakeoff(){return!!T},setRouteControls(e){Y.setRouteControls(e)},addRouteWaypoint(){Y.aircraft&&J.getActive()&&K(q(Y.aircraft.getGeometry().getCoordinates()))}}),ie=()=>{O||V(()=>{++A,W(),j=`idle`,U()})};try{n.addLayer(S),n.addInteraction(Z),n.on(`change:target`,ie),n.on(`change:view`,ie),U()}catch(e){throw Z.destroy(),e}return Z},jt=(e,t,n)=>{let{layerName:r}=n||{},i=Object.assign({className:r||`ol-layer`,source:new F({features:new se().readFeatures(e)}),style:t||new V({stroke:new B({color:`red`,lineDash:[10],width:3}),fill:new L({color:`rgba(0, 0, 255, 0.1)`})})},n||{});return new P(i)},Mt=(e,t,n,r)=>t&&n?.get(e[t])||r,Nt=(e,t)=>{let{key:n,crsForm:r}=t,i=[];return e.forEach(e=>{try{let t=e[n],r=Array.isArray(t)?t:JSON.parse(t||`[]`);if(r.length){let t=e.geoType||ye(r);t!==`Invalid`&&i.push({type:`Feature`,properties:{...e},geometry:{type:t,coordinates:r}})}}catch(e){console.error(`创建线状数据失败:${e}`)}}),C.transform({type:`FeatureCollection`,features:i},r||C.WGS84,C.WGS84)},Pt=(e,t)=>{let{isLine:n,colorMap:r,fillColor:i,colorKey:a,strokeColor:o,fillOpacity:s,strokeWeight:c,activeFillColor:l,activeFillOpacity:u,activeStrokeColor:d,activeStrokeWeight:f}=t||{},p=e.getProperties(),m=new V({stroke:new B({width:f??c??4,color:d||Mt(p,a,r,o)})}),h=new V({stroke:new B({width:c??2,color:Mt(p,a,r,o)})});return n||(m.setFill(new L({color:_e(l||i||``,u??s??1)||_e(Mt(p,a,r,i)||``,s??1)})),h.setFill(new L({color:_e(Mt(p,a,r,i)||``,s??1)}))),e.setProperties({activeStyle:m,unActiveStyle:h}),h},Ft=(e,t)=>{let n=Nt(e,t),r=new d().readFeatures(n),i=r.map(e=>{let t={...e.getProperties()};return delete t.geometry,t});return r.forEach(e=>{e.setStyle(Pt(e,t))}),{features:r,acceptedData:i}},It=(e,t)=>{let{isAutoFit:n,layerName:r,openClick:i}=t,{features:a,acceptedData:o}=Ft(e,t),s=new P({zIndex:5,className:r||`ol-layer`,source:new F({features:a})});return i&&dt(s),s.setProperties({_isCustom:!0,_isAutoFit:n,_isVectorLayer:!0,_vectorConfig:t,_layerName:r,_dataList:o,_uuidSet:new Set(o.map(e=>e._uuid))}),s},Lt=(e,t,n)=>{let r=e.getSource(),{_vectorConfig:i}=e.getProperties()||{},{features:a,acceptedData:o}=Ft(t,Object.assign({},i,{crsForm:n??i?.crsForm}));r.addFeatures(a);let s=new Set(e.get(`_uuidSet`)||[]);o.forEach(e=>s.add(e._uuid)),e.set(`_uuidSet`,s),e.set(`_dataList`,[...e.get(`_dataList`)||[],...o])},Rt=(e=[],t)=>It(e,Object.assign({},t,{isLine:!1})),zt=(e=[],t)=>It(e,Object.assign({},t,{isLine:!0})),Bt=e=>t=>{let{baseUrl:n,markerIcon:r,statusNum:i=5,activeScale:a=1.3,markerSize:o=[32,32]}=t,s=e(n),[c,l]=o,u=Array(i*2);for(let e=0;e<i;e++){let t=s(`${r}-${e}`,`.webp`);u[e]=new V({zIndex:88+e,image:new R({width:c,height:l,src:t,anchor:[.5,1]})});let n=s(`${r}-${e}-active`,`.webp`);u[e+i]=new V({zIndex:120,image:new R({width:c*a,height:l*a,anchor:[.5,1],src:n||t})})}return u},Vt=(e,t=[])=>e.map(e=>{let{crsForm:n}=e,r=C.transform([+e.lnglat[0],+e.lnglat[1]],n||C.WGS84,C.WGS84),i=new w({geometry:new ce(r)});return i.setProperties({...e,unActiveStyle:t[e.style],activeStyle:t[e.style+t.length/2]}),i.setStyle(t[e.style]),i}),Ht=(e,t,n={})=>{let r=e.get(`_massMarksStyles`),i=e?.getSource(),{clear:a}=n,o=Vt(t,r);a&&i?.clear(),i?.addFeatures(o);let s=[...a?[]:e.get(`_dataList`)||[],...t];e.set(`_dataList`,s),e.set(`_uuidSet`,new Set(s.map(e=>e._uuid)))},Ut=(e,t=[])=>{let n=new P({zIndex:2e3,source:new F({features:Vt(e,t)})});return n.setProperties({_isCustom:!0,_isVectorLayer:!0,_isMassMarksLayer:!0,_statusNum:t.length/2,_dataList:[...e],_uuidSet:new Set(e.map(e=>e._uuid)||[])}),n},Wt=e=>(t=[],n,r=!0)=>{let{offset:i=[0,0],baseUrl:a,hasLine:o,hasFace:s,layerName:c,isDynamic:l,isAutoFit:u,statusNum:d,markerIcon:f,marksStyles:p,markerSize:m,activeScale:h,vectorConfig:g}=n,_=p||Bt(e)({baseUrl:a,markerIcon:f,markerSize:m,statusNum:d||5,activeScale:h||1.3}),v=Ut(t,_);if(r&&(v.setProperties({_offset:i,_isAutoFit:u}),dt(v)),o){let e=It(t,Object.assign({},{key:`line`,isLine:!0,openClick:!1,strokeWeight:4,strokeColor:`rgba(29, 235, 255, 0.8)`},g||{}));Q.addLayer(e)}if(s){let e=It(t,Object.assign({},{isLine:!1,key:`faceList`,strokeWeight:1,openClick:!1,fillColor:`#4247DF`,strokeStyle:`dashed`,strokeColor:`#4247DF`},g||{}));Q.addLayer(e)}return v.setProperties({_isCustom:!0,_offset:i,_hasLine:o,_hasFace:s,className:c,_layerName:c,_isVectorLayer:!0,_isDynamic:l,_massMarksStyles:_}),Q.addLayer(v),v},Gt=(e=[])=>{let t=new V({}),n=new Set(e),r=[];return Q.getAllLayers().filter(e=>e.get(`_isMassMarksLayer`)).forEach(e=>{e.getSource().getFeatures().forEach(e=>{let i=e.getProperties();n.has(i.status)?(r.push(i),e.setStyle(i.unActiveStyle)):e.setStyle(t)})}),r},Kt=(e,t)=>{let n=Q.getAllLayers().filter(t=>(t.get(`_layerName`)||t.getClassName())===e&&t.get(`_isMassMarksLayer`)),r=new V({});n.forEach(e=>{e.getSource().getFeatures().forEach(e=>{let n=e.getProperties();t.has(n.id)?e.setStyle(n.unActiveStyle):e.setStyle(r)})})},qt=(e,t)=>{let n=e.length,r={},{distance:i,minDistance:a,openClick:o,buildStyle:s,singleStyles:c,computedRadius:l,layerName:u=`cluster-layer`}=t,d=e=>(e/n)**(1/18);r[1]=c;let f=e=>{let t=e.get(`features`).length,n=r[t],i=l?l(t):d(t);if(n||(n=new V({image:new K({radius:i*20,stroke:new B({width:2,color:`hsla(${180-i*180}, 100%, 40%, 1)`}),fill:new L({color:`hsla(${180-i*180}, 100%, 50%, 1)`})}),text:new H({text:t.toString(),fill:new L({color:`hsla(${180-i*180}, 100%, 10%, 1)`}),textBaseline:`middle`})}),r[t]=n),Array.isArray(n)){let t=e.get(`features`)[0].get(`styleIndex`)??0;return n[t]}return n},p=new P({zIndex:200,className:u,source:new le({distance:i||80,minDistance:a||0,source:new F({features:e.map(e=>{let t=new w(new ce(e.lnglat));t.setProperties(e);let n=e.style??0;return t.setProperties({unActiveStyle:c[n],activeStyle:c[n+c.length/2]}),t})})}),style:e=>s?s(e):f(e)});return p.setProperties({_isCustom:!0,_isVectorLayer:!0,_isClusterLayer:!0}),o&&dt(p),p};export{ue as GeometryType,He as activeFeatureByUid,Ht as addFeaturesByLayer,Wt as addMassMarksLayer,Lt as appendFeaturesByLayer,Oe as baseLayers,Bt as buildMassMarksStyles,Kt as changeFeaturesVisibleByIds,Pe as changeLayer,Ne as changeSource,st as changeUnselectStyle,Le as createAnimationMarker,Ee as createBaseLayer,It as createBusinessLayer,qt as createClusterLayer,yt as createDrawInteraction,ct as createElasticMarkerLayer,jt as createGeoJsonLayer,nt as createIconStyle,ft as createLayerSelectByNames,We as createMap,Ue as createMapInstance,De as createMapWorldLayer,rt as createMarker,it as createMarkersLayer,Ut as createMassMarksLayer,lt as createMoveMarkerLayer,Re as createOverlay,At as createRouteController,dt as createSelectByLayer,fe as createTdtVectorSource,pe as createTdtVtsLayer,tt as createText,Rt as createVectorFaceLayer,zt as createVectorLineLayer,Ce as createWmtsLayer,ke as createZheJiangLayer,Ke as disposeInstance,Ge as disposeMap,me as emitter,et as flyToAnimate,vt as getDrawStyle,Ae as getLayerByName,ve as getLayersDataList,qe as getMapInstance,Q as instance,Be as removeAllLayers,je as removeLayerByName,Fe as removeOverlays,Ve as resetActiveFeature,ze as resetActiveVector,Ye as resetMap,Je as resetZoomAndCenter,Ze as setFitViewByCoords,Qe as setFitViewByGeom,$e as setFitViewByLayer,Gt as updateMarksLayersByStatus};
1
+ import{TdtDecoderWorkerClient as e,createTdtVtsUrl as t,redactTdtToken as n}from"tdt-vts-core";import r from"ol/format/MVT";import i from"ol/layer/VectorTile";import a from"ol/TileState";import o from"ol/source/VectorTile";import s from"mitt";import{WMTS as c,XYZ as l}from"ol/source";import u from"ol/layer/Tile";import{GeoJSON as d,WMTSCapabilities as f}from"ol/format";import{optionsFromCapabilities as p}from"ol/source/WMTS";import{TileGrid as m}from"ol/tilegrid";import{Tile as h}from"ol/layer";import g from"ol/tilegrid/WMTS";import{unByKey as _}from"ol/Observable";import v from"ol/layer/Image";import y from"ol/source/Raster";import b from"ol/Map";import x from"ol/View";import{defaults as S}from"ol/control";import C from"gcoord";import{Feature as w,Overlay as T}from"ol";import{Select as E,defaults as D}from"ol/interaction";import{boundingExtent as O,getCenter as k}from"ol/extent";import{primaryAction as A,singleClick as j}from"ol/events/condition";import M from"ol/Feature";import N from"ol/geom/Point";import P from"ol/layer/Vector";import F from"ol/source/Vector";import{Circle as I,Fill as L,Icon as R,RegularShape as ee,Stroke as z,Style as B,Text as V}from"ol/style";import H from"ol/interaction/Draw";import{getArea as U,getLength as te,offset as ne}from"ol/sphere";import re from"ol/geom/LineString";import ie from"ol/interaction/Interaction";import W from"ol/style/Circle";import G from"ol/style/Fill";import ae from"ol/style/Icon";import oe from"ol/style/Stroke";import se from"ol/style/Style";import ce from"ol/style/Text";import K from"ol/Collection";import q from"ol/interaction/Select";import J from"ol/interaction/Translate";import Y from"ol/interaction/Snap";import X from"ol/format/GeoJSON";import{Point as le}from"ol/geom";import ue from"ol/source/Cluster";export*from"tdt-vts-core";let de=/* @__PURE__ */ function(e){return e.LineString=`LineString`,e.MultiLineString=`MultiLineString`,e.Polygon=`Polygon`,e.MultiPolygon=`MultiPolygon`,e.Invalid=`Invalid`,e}({});const fe=async e=>{if(typeof e!=`string`)return e;if(!e.trim())throw TypeError(`style 地址不能为空`);let t=await fetch(e);if(!t.ok)throw Error(`加载 style 失败:HTTP ${t.status}`);return await t.json()},pe=i=>{if(!i.hosts?.length||i.hosts.some(e=>!e.trim()))throw TypeError(`hosts 不能为空`);let s=new e(i.restoreMode,i.decoderOptions),c=new r({layerName:`mvt:layer`}),l=new o({projection:`EPSG:3857`,minZoom:i.minZoom??1,maxZoom:i.maxZoom??18,tileSize:512,wrapX:!0,format:c,attributions:`© <a href="https://www.tianditu.gov.cn/" target="_blank" rel="noopener">天地图</a>`,tileUrlFunction(e){if(!e)return;let[n,r,a]=e;if(n!==void 0&&r!==void 0&&a!==void 0)return t([n,r,a],{token:i.token,hosts:i.hosts,maxZoom:i.maxZoom??18,wrapX:!0})},tileLoadFunction(e,t){let r=e;r.setLoader(async(e,o,l)=>{let u=n(t);try{let n=await s.decode(t),a=c.readFeatures(n.buffer,{extent:e,featureProjection:l});r.setFeatures(a),i.diagnostics?.onDecoded?.(n.stats,u)}catch(e){let t=e instanceof Error?e:Error(String(e));i.diagnostics?.onError?.(t,u),console.error(`天地图私有 VTS 加载失败`,u,t),r.setState(a.ERROR)}})}}),u=l.dispose.bind(l);return l.dispose=()=>{s.dispose(),u()},{source:l,decoder:s}},me=async e=>{let t=await fe(e.style);if(t?.version!==8||!t.sources||!Array.isArray(t.layers))throw TypeError(`style 必须是 Style v8 对象或其 JSON 地址`);let{source:n}=pe({token:e.token,hosts:e.hosts,restoreMode:`auto`}),r=new i({declutter:!0,source:n}),a=r.dispose.bind(r);r.dispose=()=>{n.dispose(),a()};try{let{applyBackground:e,applyStyle:n}=await import(`ol-mapbox-style`),i=structuredClone(t);for(let e of i.layers)e.type===`symbol`&&e.layout?.[`text-font`]&&(e.layout[`text-font`]=[`sans-serif`]);return await Promise.all([n(r,i,{projection:`EPSG:4326`,source:`base-tdt-vector-tile`,updateSource:!1}),e(r,i)]),r}catch(e){throw r.dispose(),e}},he=s();let Z;const ge=e=>{Z=e},_e=()=>{Z=void 0},ve=(e,t)=>{if(e.startsWith(`#`)){let n=e.replace(`#`,``);return n.length===3&&(n=n[0]+n[0]+n[1]+n[1]+n[2]+n[2]),`rgba(${parseInt(n.substring(0,2),16)}, ${parseInt(n.substring(2,4),16)}, ${parseInt(n.substring(4,6),16)}, ${t})`}return e},ye=()=>Z?.getAllLayers().map(e=>e.get(`_dataList`)||[]).flat(2)||[],be=e=>{let t=e=>!Array.isArray(e)||e.length===0?0:1+t(e[0]),n=e=>{if(!Array.isArray(e)||e.length<3)return!1;let t=e[0],n=e[e.length-1];return t[0]===n[0]&&t[1]===n[1]},r=e=>Array.isArray(e)&&e.length>=2&&typeof e[0]==`number`&&typeof e[1]==`number`,i=e=>Array.isArray(e)&&e.length>=2&&e.every(r),a=e=>Array.isArray(e)?(t(e)===2?[e]:e).every(e=>Array.isArray(e)&&e.length>=4&&n(e)&&e.every(r)):!1,o=t(e);try{return o<2||!e||e.length===0?`Invalid`:o===2&&i(e)?n(e)&&e.length>=4?`Polygon`:`LineString`:o===3&&Array.isArray(e)&&e.every(i)?a(e)?`Polygon`:e.every(e=>!n(e))?`MultiLineString`:`Invalid`:o===4&&Array.isArray(e)&&e.every(e=>a(e))?`MultiPolygon`:`Invalid`}catch(e){return console.error(`Error analyzing coordinates:`,e),`Invalid`}},xe=new f,Se=/* @__PURE__ */ new Map,Ce=async e=>{let t=Se.get(e);if(t)return t;let n=await fetch(e);if(!n.ok)throw Error(`WMTS capabilities 请求失败:${n.status}`);let r=xe.read(await n.text());return Se.set(e,r),r},we=e=>async t=>{let{style:n,format:r,version:i,layerName:a,matrixSet:o}=t,[s,l]=a.split(`:`),d=`${e}/${s}/${l}/gwc/service/wmts?request=GetCapabilities`,f=await Ce(d),m=p(f,{style:n||``,layer:l,version:i||`1.1.0`,format:r||`image/png`,matrixSet:o||`EPSG:4326`});if(!m)throw Error(`Unable to create TileLayer`);return new u({zIndex:3,className:a,source:new c(m)})},Te=(e,t)=>{let n=t.get(`_selectInteraction`);n&&(e.removeInteraction(n),n.dispose(),t.unset(`_selectInteraction`));let r=t.get(`_resolutionChangeKey`);r&&(_(r),t.unset(`_resolutionChangeKey`));let i=t.get(`_dynamicMarkerTimer`);i!==void 0&&(clearTimeout(i),t.unset(`_dynamicMarkerTimer`)),t.getSource()?.dispose(),e.removeLayer(t),t.dispose()},Ee=`c77eddc667c5bed016fded560baf93e7`,De=(e=`hzsyvector_dark`)=>{let t={zIndex:-5,preload:1,minZoom:8,maxZoom:21,source:new l({tileGrid:new m({tileSize:256,resolutions:[.00549933137253187,.00274966568626595,.00137483284313297,.000687416421566485,.000343708210783242,.000171854105391621,859270526958104e-19,429635263479052e-19,214817631739526e-19,107408815869763e-19,537044079348816e-20,268522039674407e-20,134261019837204e-20],origin:[118.122911693886,31.2869311022836],extent:[116.43263049006,28.6201742126026,123.705594256347,31.9765041681924]}),projection:`EPSG:4326`,urls:[`https://ywtg.citybrain.hangzhou.gov.cn/${e}/{z}/{y}/{x}`,`https://ywtg.citybrain.hangzhou.gov.cn:9456/${e}/{z}/{y}/{x}`,`https://ywtg.citybrain.hangzhou.gov.cn:9457/${e}/{z}/{y}/{x}`,`https://ywtg.citybrain.hangzhou.gov.cn:9458/${e}/{z}/{y}/{x}`,`https://ywtg.citybrain.hangzhou.gov.cn:9459/${e}/{z}/{y}/{x}`]}),properties:{_isBaseLayer:!0,_layerName:e}};return new h(t)},Oe=(e,t=Ee)=>{let[n,r]=e.split(`_`),i={preload:1,zIndex:-10,cacheSize:20240,properties:{_isBaseLayer:!0,_layerName:e},source:new c({crossOrigin:`anonymous`,projection:`EPSG:4326`,wrapX:!0,layer:n,style:`default`,version:`1.0.0`,format:`image/png`,matrixSet:r,tileGrid:new g({tileSize:256,origin:[-180,90],matrixIds:[`1`,`2`,`3`,`4`,`5`,`6`,`7`,`8`,`9`,`10`,`11`,`12`,`13`,`14`,`15`,`16`,`17`,`18`,`19`],resolutions:[.703125,.3515625,.17578125,.087890625,.0439453125,.02197265625,.010986328125,.0054931640625,.00274658203125,.001373291015625,.0006866455078125,.00034332275390625,.000171661376953125,858306884765625e-19,4291534423828125e-20,21457672119140625e-21,10728836059570312e-21,5364418029785156e-21,2682209014892578e-21]}),url:`https://t{0-7}.tianditu.gov.cn/${e}/wmts?tk=${t}`})};return new h(i)},ke=e=>({baseImgLayer:new h({className:`img-layer`,source:new l({crossOrigin:`anonymous`,tileSize:256,url:`https://t{0-7}.tianditu.gov.cn/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=${e}`}),zIndex:1}),baseCiaLayer:new h({className:`img-layer`,source:new l({crossOrigin:`anonymous`,tileSize:256,url:`https://t{0-7}.tianditu.gov.cn/DataServer?T=cia_w&x={x}&y={y}&l={z}&tk=${e}`}),zIndex:2}),baseVecLayer:new h({className:`vec-layer`,source:new l({crossOrigin:`anonymous`,tileSize:256,url:`https://t{0-7}.tianditu.gov.cn/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=${e}`}),zIndex:1}),baseCvaLayer:new h({className:`vec-layer`,source:new l({crossOrigin:`anonymous`,tileSize:256,url:`https://t{0-7}.tianditu.gov.cn/DataServer?T=cva_w&x={x}&y={y}&l={z}&tk=${e}`}),zIndex:2})}),Ae=(e=`emap`,t=`3b0cdd02-c366-4363-b6de-081a9f12b364`)=>new h({preload:1,minZoom:4,maxZoom:20,zIndex:-10,cacheSize:20240,source:new l({wrapX:!0,projection:`EPSG:4326`,crossOrigin:`anonymous`,url:`https://ditu{0-6}.zjzwfw.gov.cn/services/wmts/${e}/default/oss/getTile/{z}/{y}/{x}?token=${t}`})}),je=e=>Z.getAllLayers().find(t=>(t.get(`_layerName`)||t.getClassName())===e),Me=e=>{Z.getAllLayers().filter(t=>(t.get(`_layerName`)||t.getClassName())===e).forEach(e=>{Te(Z,e)})},Ne=()=>Math.max(1,Math.min(4,globalThis.navigator?.hardwareConcurrency??2)),Pe=(e,t,n,r={})=>{let i=new y({sources:[e],operationType:`image`,operation:(e,t)=>(((e,t)=>{let n=t.ratioArray,r=t.rgbColorArray;if(n&&r){let[t=0,i=0,a=0]=n;for(let n=0;n<e.length;n+=4){let o=e[n],s=e[n+1],c=e[n+2],l=o*t+s*i+c*a;e[n]=r[0]-l,e[n+1]=r[1]-l,e[n+2]=r[2]-l}}})(e[0].data,t),e[0]),threads:r.threads??Ne()});return i.on(`beforeoperations`,e=>{e.data.ratioArray=n,e.data.rgbColorArray=t}),i},Fe=(e,t,n,r={})=>new v({source:Pe(e,t,n,r)}),Ie=(e=``)=>{Z&&Z.getOverlays().getArray().filter(t=>t.get(e||`position`)).forEach(e=>Z.removeOverlay(e))},Le=()=>Ie(`_isAnimationMarker`),Re=(e,t)=>{Le();let{width:n,height:r,lnglat:i,crsForm:a}=t,o=document.createElement(`div`),s=document.createElement(`img`);s.src=e,s.alt=``,n!==void 0&&(s.width=n),r!==void 0&&(s.height=r),o.append(s);let c=new T({element:o,stopEvent:!1,positioning:`bottom-center`,position:C.transform([+i[0],+i[1]],a||C.WGS84,C.WGS84)});c.set(`_isAnimationMarker`,!0),Z.addOverlay(c)},ze=(e={id:`popup-container`,positioning:`top-center`})=>new T(Object.assign({element:document.getElementById(e.id)||void 0},e)),Be=()=>{Ie(),Z.getAllLayers().forEach(e=>{e.get(`_selectInteraction`)?.getFeatures().clear()})},Ve=()=>{Ie(),Z&&Z.getAllLayers().forEach(e=>{e.get(`_isBaseLayer`)||Te(Z,e)})},He=()=>{Ie(),Z.getAllLayers().filter(e=>e.get(`_isVectorLayer`)).forEach(e=>{let t=e.get(`_selectInteraction`);t&&(t.dispatchEvent({type:`select`,selected:[],mapBrowserEvent:void 0,deselected:t.getFeatures().getArray()}),t.getFeatures().clear())})},Ue=e=>{let t=Z.getAllLayers().filter(e=>e.get(`_isVectorLayer`));if(t.length){let n=t.find(t=>t.get(`_uuidSet`).has(e)&&t.get(`_selectInteraction`));if(n){let t=(n.getSource()?.getFeatures()||[]).find(t=>t.get(`_uuid`)===e),r=n.get(`_selectInteraction`);if(r){let n=r.getFeatures().getArray();n.find(t=>t.get(`_uuid`)===e)||(r.dispatchEvent({type:`select`,deselected:n,selected:[t],mapBrowserEvent:void 0}),r.getFeatures().push(t))}}}};let Q=[119.71512016971076,30.122490541963536];const We=(e={})=>{if(Z)return Z;let t=Ge(e);return ge(t),t},Ge=(e={})=>{let t=Object.assign({zoom:9.4,maxZoom:18,minZoom:9.4,center:Q,baseLayer:`vec-layer`,projection:`EPSG:4326`,layers:[De()],constrainResolution:!1,smoothExtentConstraint:!1,tk:Ee},e||{}),n=new b({view:new x(t),controls:S({zoom:!1,rotate:!1,attribution:!1}),interactions:D({pinchRotate:!1,doubleClickZoom:!1,altShiftDragRotate:!1}),layers:t.layers||[De()]});Q=t.center||Q,n.activeBaseLayer=t.baseLayer;let r=e=>n.getAllLayers().find(t=>(t.get(`_layerName`)||t.getClassName())===e);n.getLayerByName=r,n.removeLayerByName=e=>{let t=r(e);t&&Te(n,t)},n.changeLayersByNames=(e,t)=>{n.getAllLayers().filter(e=>t.includes(e.getClassName())).forEach(t=>t.setVisible(e?.includes(t.getClassName())))};let i,a;return n.on(`pointermove`,e=>{if(a=e.pixel,i!==void 0)return;let t=()=>{i=void 0;let e=n.getTargetElement();a&&e&&(e.style.cursor=n.hasFeatureAtPixel(a)?`pointer`:``)};i=typeof globalThis.requestAnimationFrame==`function`?globalThis.requestAnimationFrame(t):setTimeout(t,16)}),n.set(`_disposePointerMove`,()=>{i!==void 0&&(typeof globalThis.cancelAnimationFrame==`function`?globalThis.cancelAnimationFrame(i):clearTimeout(i),i=void 0)}),n},Ke=()=>{if(!Z)return;let e=Z;e.get(`_disposePointerMove`)?.(),e.unset(`_disposePointerMove`),e.getOverlays().forEach(t=>{e.removeOverlay(t)}),e.getInteractions().clear(),e.getAllLayers().forEach(t=>Te(e,t)),e.setTarget(``),e.dispose(),_e()},qe=()=>Ke(),Je=()=>Z,Ye=(e=Q)=>{Z&&Z.getView().animate({zoom:9.4,center:e,duration:1e3})},Xe=(e={center:Q,isClearAll:!0})=>{Ve(),Ye(e.center||Q)},Ze={padding:[50,50,50,50],duration:1e3},Qe=(e,t=Z,n)=>{let r=t.getView();if(e.length===1)r.animate({zoom:14,duration:1e3,center:e[0],...n||{}});else{let t=O(e);r.fit(t,{...Ze,...n||{}})}},$e=(e,t=Z,n)=>{t.getView().fit(e,{...Ze,...n||{}})},et=(e,t=Z,n)=>{let r=e.getSource();if(!r||r.isEmpty())return;let i=r.getExtent();i&&t.getView().fit(i,{...Ze,...n||{}})},tt=(e,t)=>{let n=Z.getView(),r=n.getZoom();n.animate({center:e,duration:2e3}),t?n.animate({zoom:t-2,duration:1e3},{zoom:t,duration:1e3}):n.animate({zoom:r-2,duration:1e3},{zoom:r+2>12?12:r+2,duration:1e3})},nt=e=>new V({text:e.text,offsetY:e.offsetY,offsetX:e.offsetX,justify:`center`,textAlign:`center`,font:`16px PingFangSC-Semibold`,fill:new L({color:`rgba(255, 255, 255, 0.8)`})}),rt=(e,t=!1)=>new B({image:new R({scale:e.scale||1,rotation:e.rotation||0,anchor:e.anchor||[.5,1],src:t&&e.activeImg||e.img}),text:e.showText?nt(e):void 0}),it=(e,t)=>{let n=new M({geometry:new N([+e.lng,+e.lat]),data:Object.assign({},e||{},{layerName:t.layerName})});return n.setStyle(rt(e)),n},at=(e,t)=>{let{layerName:n,visible:r=!0,zIndex:i=10}=t,a=new F;return e.forEach(e=>a.addFeature(it(e,t))),new P({zIndex:i,visible:r,source:a,className:n||`marker-layer`})},ot=(e,t)=>{let n=t>=14?`largeImg`:t>=11?`smallImg`:`img`;e.forEach(e=>{let t=e.get(`data`);t.isSelected||e.setStyle(rt({...t,img:t[n]},!1))})},st=(e,t)=>{let n=e.get(`data`),r={...n,isSelected:t};e.set(`data`,r),n.isElastic?ot([e],Z.getView().getZoom()):e.setStyle(rt(r,t))},ct=e=>{e.forEach(e=>{st(e,!1)}),e.clear()},lt=(e,t)=>{let n=e.map(e=>({...e,isElastic:!0})),r=at(n,t),i=r.getSource().getFeatures(),a=Z.getView();return ot(i,a.getZoom()),r.set(`_resolutionChangeKey`,a.on(`change:resolution`,()=>ot(i,a.getZoom()))),r},ut=(e,t)=>{let n=it(e,t),r=new P({className:t.layerName||`ol-layer`,source:new F({features:[n]})});return Z.addLayer(r),{vectorLayer:r}},dt=(e,t)=>{let n=t.getProperties(),{activeStyle:r}=n;if(t.setStyle(r),he.emit(`selected-feature`,n),e.set(`_hasActive`,!0),e.get(`_isDynamic`)){let t=r.getImage(),i=e.get(`_dynamicMarkerTimer`);i!==void 0&&clearTimeout(i);let a=setTimeout(()=>{e.unset(`_dynamicMarkerTimer`),he.emit(`dynamic-marker`,Object.assign({},n.rawData||{},{lnglat:n.lnglat,style:n.style,crsForm:n.crsForm,width:t.getWidth(),height:t.getHeight()}))},1e3);e.set(`_dynamicMarkerTimer`,a)}if(e.get(`_isAutoFit`)){let e=Z.getView();e.animate({duration:1e3,zoom:e.getZoom(),center:k(t.getGeometry().getExtent())})}},ft=e=>{let t=new E({style:null,multi:!1,hitTolerance:10,layers:[e],condition:t=>{if(!j(t))return!1;let n=!1;return Z.forEachFeatureAtPixel(t.pixel,()=>{n=!0},{layerFilter:t=>t===e}),n}});return t.on(`select`,t=>{let{selected:n,deselected:r}=t;if(n.length){let t=n[0];if(e.get(`_isClusterLayer`)){let n=t.get(`features`);n.length===1&&dt(e,n[0])}else dt(e,t)}if(r.length){let t=r[0],n=t.getProperties();t.setStyle(n.unActiveStyle),e.set(`_hasActive`,!1)}}),Z.addInteraction(t),e.set(`_selectInteraction`,t),t},pt=(e,t,n)=>{let r=new E({style:null,layers:t=>e.includes(t.getClassName())});return r.on(`select`,({deselected:e,selected:r})=>{if(e.length){let t=e[0];st(t,!1),n?.(t)}if(r.length){let e=r[0];st(e,!0),t?.(e)}}),r},mt=e=>{let t=U(e,{projection:`EPSG:4326`});return t>1e4?`${Math.round(t/1e6*100)/100} km\xB2`:`${Math.round(t*100)/100} m\xB2`},ht=e=>{let t=te(e,{projection:`EPSG:4326`});return t>100?`${Math.round(t/1e3*100)/100} km`:`${Math.round(t*100)/100} m`},gt=new B({fill:new L({color:`rgba(255, 255, 255, 0.2)`}),stroke:new z({color:`rgba(0, 0, 0, 0.5)`,lineDash:[10,10],width:2}),image:new I({radius:5,stroke:new z({color:`rgba(0, 0, 0, 0.7)`}),fill:new L({color:`rgba(255, 255, 255, 0.2)`})})}),_t=/* @__PURE__ */ new WeakMap,vt=e=>{let t=_t.get(e);if(t)return t;let n=new B({text:new V({font:`14px`,fill:new L({color:`rgba(255, 255, 255, 1)`}),backgroundFill:new L({color:`rgba(0, 0, 0, 0.7)`}),padding:[3,3,3,3],textBaseline:`bottom`,offsetY:-15}),image:new ee({radius:8,points:3,angle:Math.PI,displacement:[0,10],fill:new L({color:`rgba(0, 0, 0, 0.7)`})})});return _t.set(e,n),n},yt=(e,t=gt)=>{let n=t?[t]:[],r=e.getGeometry(),i,a;if(r.getType()===`Polygon`?(i=r.getInteriorPoint(),a=mt(r)):r.getType()===`LineString`&&(i=new N(r.getLastCoordinate()),a=ht(r)),i&&a){let t=vt(e);t.setGeometry(i),t.getText().setText(a),n.push(t)}return n},bt=(e=`Point`,t,n)=>new H({source:t.getSource(),type:e,style:n?e=>yt(e,void 0):void 0}),xt=({geometry:e,interaction:t,isDestroyed:n,vectorLayer:r,aircraftStyle:i,speed:a,turnSpeed:o,verticalSpeed:s,getLastWaypoint:c})=>{let l,u,d=0,f,p,m,h=0,g=0,_=/* @__PURE__ */ new Set,v=()=>{_.clear(),m!==void 0&&f?.cancelAnimationFrame(m),m=void 0},y=e=>{m=void 0;let n=t.getMap();if(!l||!n||!t.getActive()){v();return}let r=l,c=Math.min(Math.max(0,e-h)/1e3,.1);h=e;let u=Number(_.has(`turnRight`))-Number(_.has(`turnLeft`));d=(d+u*o*c+360)%360,i===void 0&&l.getStyle().getImage().setRotation(d*Math.PI/180);let p=Number(_.has(`forward`))-Number(_.has(`backward`)),g=Number(_.has(`right`))-Number(_.has(`left`));if(p||g){let e=n.getView(),t=ne(r.getGeometry().getCoordinates(),a*c,d*Math.PI/180+Math.atan2(g,p));if(r.getGeometry().setCoordinates(t),l!==r||(e.setCenter(t),l!==r))return}let b=Number(_.has(`ascend`))-Number(_.has(`descend`));r.set(`height`,Math.max(0,r.get(`height`)+b*s*c)),l===r&&(l.set(`heading`,d),l===r&&(l.changed(),l===r&&_.size&&m===void 0&&(m=f.requestAnimationFrame(y))))},b=()=>{g++,v(),p?.(),p=void 0,f=void 0;let e=u;if(u=void 0,l=void 0,e){let t=e.getSource();e.setMap(null),e.clearRenderer(),e.setSource(null),t?.clear(!0),t?.dispose()}c()?.set(`isAircraft`,!0,!0),n()||r.changed()};return{get aircraft(){return l},get heading(){return d},get revision(){return g},startRouteControl(){let n=t.getMap(),o=n?.getTargetElement(),s=n?.getSize();if(!n||!o||!s||s[0]<=0||s[1]<=0||!t.getActive())throw Error(`请先将启用的航点交互添加到已就绪的地图`);let m=n.getView(),h=++g,_=()=>{if(h!==g||t.getMap()!==n||n.getView()!==m||!t.getActive()||n.getTargetElement()!==o)throw Error(`飞行操控启动已取消`)};if(l)return l;d=0,n.renderSync(),_();let v=e.getLastCoordinate();return l=new M({geometry:new N(v),isAircraft:!0,heading:d,height:c()?.get(`extData`)?.height??0,speed:a}),l.setStyle(i??new B({image:new R({src:`data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2228%22%20height%3D%2236%22%20viewBox%3D%220%200%2028%2036%22%3E%3Cpath%20d%3D%22M14%202%2024%2032%2014%2025%204%2032Z%22%20fill%3D%22%23f97316%22%20stroke%3D%22%23fff%22%20stroke-width%3D%222%22%20stroke-linejoin%3D%22round%22%2F%3E%3C%2Fsvg%3E`,rotateWithView:!0})})),u=new P({source:new F({features:[l]})}),u.setMap(n),_(),n.on(`change:view`,b),f=o.ownerDocument.defaultView,p=()=>n.un(`change:view`,b),c()?.set(`isAircraft`,!1,!0),r.changed(),_(),l},setRouteControls(e){let n=[`forward`,`backward`,`left`,`right`,`turnLeft`,`turnRight`,`ascend`,`descend`];if(e.some(e=>!n.includes(e)))throw Error(`不支持的飞行动作`);l&&t.getActive()&&(_=new Set(e),_.size?m===void 0&&(h=f.performance.now(),m=f.requestAnimationFrame(y)):v())},stopRouteControl:b}},St={KeyW:`forward`,KeyS:`backward`,KeyA:`left`,KeyD:`right`,KeyQ:`turnLeft`,KeyE:`turnRight`,KeyZ:`descend`,KeyC:`ascend`,Space:`waypoint`},Ct=e=>e===`ascend`||e===`descend`,wt=(e,t)=>{let n=e.getTarget(),r=typeof t.container==`string`?(n?.ownerDocument??globalThis.document)?.getElementById(t.container):t.container;if(typeof t.container==`string`&&!r)throw Error(`找不到航线输入容器:${t.container}`);if(e.getMode()!==`control`&&e.getMode()!==`edit`)return()=>void 0;let i=(n??r)?.ownerDocument,a=i?.defaultView;if(!i||!a)return()=>{e.setRouteControls([]),e.setActiveControls([])};let o=/* @__PURE__ */ new Map,s=/* @__PURE__ */ new Map,c=!!t.keyboard&&!!n&&!n.hasAttribute(`tabindex`);c&&(n.tabIndex=0);let l=t=>e.getMode()===`control`||e.getMode()===`edit`&&Ct(t),u=!!t.keyboard&&e.getMode()===`control`,d=/* @__PURE__ */ new Map,f={"background-color":t.activeStyle?.backgroundColor,"border-top-color":t.activeStyle?.borderColor,"border-right-color":t.activeStyle?.borderColor,"border-bottom-color":t.activeStyle?.borderColor,"border-left-color":t.activeStyle?.borderColor,color:t.activeStyle?.color},p=e=>{for(let[e,{original:t,applied:n}]of d){let r=new Set(e.style),i=[.../* @__PURE__ */ new Set([...n.keys(),...r])].map(t=>({property:t,value:e.style.getPropertyValue(t),priority:e.style.getPropertyPriority(t)})).filter(({property:e,value:t,priority:i})=>n.has(e)!==r.has(e)||t!==n.get(e)?.value||i!==n.get(e)?.priority);e.style.cssText=t;for(let{property:t,value:n,priority:r}of i)e.style.setProperty(t,n,r)}if(d.clear(),t.activeStyle&&e.length)for(let t of r?.querySelectorAll(`button[data-route-control]`)??[]){if(t.disabled||!e.includes(t.dataset.routeControl))continue;let n=t.style.cssText;for(let[e,n]of Object.entries(f))typeof n==`string`&&t.style.setProperty(e,n,`important`);let r=new Map(Array.from(t.style,e=>[e,{value:t.style.getPropertyValue(e),priority:t.style.getPropertyPriority(e)}]));d.set(t,{original:n,applied:r})}},m=()=>{let t=[.../* @__PURE__ */ new Set([...o.values(),...[...s.values()].map(({action:e})=>e)])];p(t),e.setRouteControls(e.getMode()===`control`?t.filter(e=>e!==`waypoint`):[]),e.setActiveControls(t)},h=(e,t)=>{try{t.hasPointerCapture(e)&&t.releasePointerCapture(e)}catch{}},g=()=>{if(!o.size&&!s.size)return;o.clear();let e=[...s.entries()];s.clear();for(let[t,{button:n}]of e)h(t,n);m()},_=e=>{let t=e?.closest?.(`button[data-route-control]`);if(!t||t.disabled||!r?.contains(t))return;let n=t.dataset.routeControl;if(Object.values(St).includes(n)&&l(n))return{button:t,action:n}},v=e=>!!e?.closest(`input, textarea, select, a, [contenteditable]:not([contenteditable="false"])`),y=t=>{e.getMode()===`edit`&&Ct(t)?e.adjustWaypointHeight(t===`ascend`?1:-1):e.getMode()===`control`&&t===`waypoint`&&e.addRouteWaypoint()},b=e=>{if(e.defaultPrevented||v(i.activeElement)||i.hidden)return;if(e.ctrlKey||e.altKey||e.metaKey||e.isComposing){g();return}let n=_(e.target),a=!!n&&(e.code===`Space`||e.code===`Enter`),s=a?n.action:t.keyboard?St[e.code]:void 0;if(!s||!l(s))return;let c=i.activeElement?.closest(`button`);(a||!c||(u||r?.contains(c))&&e.code!==`Space`&&e.code!==`Enter`)&&(e.preventDefault(),!(e.repeat||o.has(e.code))&&(o.set(e.code,s),m(),y(s)))},x=e=>{o.delete(e.code)&&(e.preventDefault(),m())},S=e=>{if(e.button!==0||i.hidden)return;let t=_(e.target);if(t){e.preventDefault(),t.button.focus({preventScroll:!0}),s.set(e.pointerId,t);try{t.button.setPointerCapture(e.pointerId)}catch{}m()}},C=e=>{let t=s.get(e.pointerId);t&&(s.delete(e.pointerId),h(e.pointerId,t.button),m())},w=e=>{let t=_(e.target);t&&!i.hidden&&y(t.action)},T=e=>{v(e.target)&&g()},E=()=>{i.hidden&&g()},D=new Set(u?[]:[t.keyboard?n:void 0,r]);u&&i.addEventListener(`keydown`,b);for(let e of D)e?.addEventListener(`keydown`,b);return i.addEventListener(`keyup`,x,!0),i.addEventListener(`focusin`,T),i.addEventListener(`visibilitychange`,E),r&&(i.addEventListener(`pointerup`,C),i.addEventListener(`pointercancel`,C)),r?.addEventListener(`pointerdown`,S),r?.addEventListener(`lostpointercapture`,C),r?.addEventListener(`click`,w),()=>{u&&i.removeEventListener(`keydown`,b);for(let e of D)e?.removeEventListener(`keydown`,b);i.removeEventListener(`keyup`,x,!0),i.removeEventListener(`focusin`,T),i.removeEventListener(`visibilitychange`,E),r&&(i.removeEventListener(`pointerup`,C),i.removeEventListener(`pointercancel`,C)),r?.removeEventListener(`pointerdown`,S),r?.removeEventListener(`lostpointercapture`,C),r?.removeEventListener(`click`,w),g(),c&&n.getAttribute(`tabindex`)===`0`&&n.removeAttribute(`tabindex`)}},Tt=()=>{let e,t,n=new se({fill:new G({color:`rgba(59, 130, 246, .2)`}),stroke:new oe({color:`#3b82f6`,width:3}),image:new W({radius:6,fill:new G({color:`#3b82f6`})})}),r=e=>(t??=new se({image:new ae({src:`data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2228%22%20height%3D%2236%22%20viewBox%3D%220%200%2028%2036%22%3E%3Cpath%20d%3D%22M14%202%2024%2032%2014%2025%204%2032Z%22%20fill%3D%22%23f97316%22%20stroke%3D%22%23fff%22%20stroke-width%3D%222%22%20stroke-linejoin%3D%22round%22%2F%3E%3C%2Fsvg%3E`,rotateWithView:!0}),zIndex:3}),t.getImage().setRotation((e.get(`heading`)??0)*Math.PI/180),t);return{style:n,lineStyle:n,takeoffStyle:t=>(e??=new se({image:new ae({src:`data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2223%22%20height%3D%2232%22%20viewBox%3D%220%200%2023%2032%22%20fill%3D%22none%22%3E%3Cpath%20d%3D%22M14.952%2025.08L14.676%2025.362C17.076%2025.722%2018.732%2026.466%2018.732%2027.33C18.732%2028.542%2015.468%2029.532%2011.442%2029.532C7.416%2029.532%204.152%2028.548%204.152%2027.33C4.152%2026.46%205.832%2025.71%208.256%2025.35L7.98%2025.074C3.354%2025.5%20-3.51563e-08%2026.754%200%2028.242C0%2030.072%205.124%2031.56%2011.442%2031.56C17.76%2031.56%2022.884%2030.072%2022.884%2028.242C22.872%2026.76%2019.548%2025.506%2014.952%2025.08ZM3.336%2019.512L11.484%2027.654L19.572%2019.506V19.5C21.618%2017.43%2022.89%2014.586%2022.89%2011.442C22.89%205.124%2017.766%200%2011.448%200C5.13%200%200.0059996%205.124%200.00599957%2011.442C0.00599957%2014.586%201.278%2017.436%203.336%2019.512ZM11.694%206.198H16.122V10.386H13.38V12.168C13.38%2012.498%2013.56%2012.666%2013.92%2012.666H14.418C14.712%2012.666%2014.898%2012.582%2014.994%2012.42C15.09%2012.258%2015.15%2011.712%2015.186%2010.782C15.78%2011.04%2016.278%2011.238%2016.668%2011.364C16.566%2012.222%2016.452%2012.78%2016.32%2013.038C16.11%2013.668%2015.564%2013.974%2014.664%2013.974H13.38C12.402%2013.974%2011.91%2013.458%2011.91%2012.42V9.06H14.652V7.506H11.694V6.198ZM8.814%2013.908V10.62H6.09V9.294H8.196V8.298H6.456V6.972H8.196V5.592H9.678V6.972H11.274V8.298H9.678V9.294H11.58V10.62H10.236V11.82H11.442V13.146H10.236V14.508C10.59%2014.55%2011.334%2014.574%2012.48%2014.574C13.566%2014.574%2015.012%2014.55%2016.824%2014.514C16.632%2014.988%2016.458%2015.498%2016.302%2016.056C13.428%2016.056%2011.418%2016.02%2010.266%2015.954C9.114%2015.888%208.298%2015.438%207.794%2014.616C7.644%2015.264%207.44%2015.834%207.194%2016.314C6.924%2016.02%206.546%2015.612%206.06%2015.096C6.528%2014.16%206.756%2012.816%206.75%2011.058H8.13C8.13%2011.688%208.106%2012.276%208.058%2012.828C8.244%2013.272%208.49%2013.632%208.814%2013.908Z%22%20fill%3D%22%23FFA01E%22%2F%3E%3C%2Fsvg%3E`,anchor:[.5,1]}),text:new ce({text:`起飞点`,offsetY:28,fill:new G({color:`#FFA01E`}),stroke:new oe({color:`#fff`,width:3})}),zIndex:2}),t.get(`isAircraft`)?[e,r(t)]:e),pointStyle:e=>e.get(`isAircraft`)?r(e):n,aircraftStyle:r}},Et=()=>{let e=crypto.getRandomValues(/* @__PURE__ */ new Uint8Array(16));e[6]=e[6]&15|64,e[8]=e[8]&63|128;let t=Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(``);return`${t.slice(0,8)}-${t.slice(8,12)}-${t.slice(12,16)}-${t.slice(16,20)}-${t.slice(20)}`},$=e=>e.map((e,t)=>{let[n,r]=e.getGeometry().getCoordinates(),i=e.get(`extData`)??{};return{...i,uuid:e.get(`uuid`),waylineId:i.waylineId??``,indexNo:t,pointSpeed:i.pointSpeed??0,height:i.height??0,gimbalPichAngle:i.gimbalPichAngle??0,direction:i.direction??e.get(`heading`)??0,shootType:i.shootType??``,supportLightType:i.supportLightType??``,longitude:n,latitude:r}}),Dt=(e,{takeoffStyle:t,pointStyle:n})=>{if(!Array.isArray(e))throw Error(`航点必须为数组`);let r=/* @__PURE__ */ new Set,i=/* @__PURE__ */ new Set;for(let t of e){if(!t||typeof t!=`object`)throw Error(`航点必须为对象`);if(t.uuid!==void 0){if(typeof t.uuid!=`string`||!t.uuid.trim())throw Error(`uuid 必须为非空白字符串`);if(i.has(t.uuid))throw Error(`导入航点存在重复 uuid`);i.add(t.uuid)}if(!Number.isInteger(t.indexNo)||t.indexNo<0)throw Error(`indexNo 必须为非负整数`);if(!Number.isFinite(t.longitude)||Math.abs(t.longitude)>180||!Number.isFinite(t.latitude)||Math.abs(t.latitude)>90)throw Error(`航点经纬度必须为有效的 EPSG:4326 坐标`);for(let e of[`direction`,`pointSpeed`,`gimbalPichAngle`])if(t[e]!==void 0&&!Number.isFinite(t[e]))throw Error(`${e} 必须为有限数值`);if(t.pointSpeed!==void 0&&t.pointSpeed<0)throw Error(`pointSpeed 不能为负数`);if(t.height!==void 0&&(!Number.isFinite(t.height)||t.height<0))throw Error(`height 必须为有限非负数`);if(t.waylineId!==void 0&&typeof t.waylineId!=`string`)throw Error(`waylineId 必须为字符串`);if(t.shootType!==void 0&&![``,`time`,`distance`,`none`].includes(t.shootType))throw Error(`不支持的 shootType`);if(t.supportLightType!==void 0&&(typeof t.supportLightType!=`string`||t.supportLightType!==``&&t.supportLightType.split(`,`).some(e=>![`ir`,`visable`].includes(e))))throw Error(`supportLightType 仅支持 ir、visable 或逗号分隔的组合`);let e=`${t.longitude},${t.latitude}`;if(r.has(e))throw Error(`导入航点存在重复位置`);r.add(e)}return[...e].sort((e,t)=>e.indexNo-t.indexNo).map((r,i)=>{let a={...r,height:r.height??0};delete a.uuid,delete a.indexNo,delete a.longitude,delete a.latitude;let o=new M({uuid:r.uuid??Et(),geometry:new N([r.longitude,r.latitude]),extData:a,heading:r.direction??0,isTakeoff:i===0,isAircraft:i===e.length-1});return o.setStyle(i===0?t:n),o})},Ot=(e={},t={mode:`midpoint`,pixelTolerance:10})=>{if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`编辑配置必须为对象`);let{mode:n=t.mode,pixelTolerance:r=t.pixelTolerance}=e;if(n!==`midpoint`&&n!==`snap`)throw Error(`编辑模式必须为 midpoint 或 snap`);if(!Number.isFinite(r)||r<=0)throw Error(`吸附距离必须为有限正数`);return{mode:n,pixelTolerance:r}},kt=({interaction:e,vectorLayer:t,source:n,points:r,layerOptions:i,midpointStyle:a,pointStyle:o,onDuplicate:s,onInsert:c,getTakeoff:l,isDestroyed:u,isEditing:d,getEditConfig:f,syncPath:p})=>{let m,h,g,_=()=>{let e=h;h=void 0,m=void 0,g=void 0,e?.()};return{get pendingInsertion(){return g?.()},get select(){return m},clearEditing:_,updateEditing:()=>{if(_(),u()||h)return;let v=e.getMap();if(!d()||!v||!e.getActive())return;let y=f(),b=new F,x=new P({...i,source:b,style:a??new B({image:new I({radius:5,fill:new L({color:`#fff`}),stroke:new z({color:`#3b82f6`,width:2})})}),zIndex:1/0}),S=()=>{x.setVisible(t.getVisible()),b.clear(),y.mode===`snap`?O():r.slice(1).forEach((e,t)=>{let n=r[t].getGeometry().getCoordinates(),i=e.getGeometry().getCoordinates();b.addFeature(new M({geometry:new N([(n[0]+i[0])/2,(n[1]+i[1])/2]),insertIndex:t+1}))})},C=new q({layers:[t],filter:e=>e!==l()&&r.includes(e),hitTolerance:6});m=C;let w=new J({condition:A,filter:e=>e!==l()&&(r.includes(e)||b.hasFeature(e)),hitTolerance:6}),T=new K,E=y.mode===`snap`?new Y({features:T,pixelTolerance:y.pixelTolerance}):void 0;E?.on(`snap`,e=>{if(D||!t.getVisible())return;let n=e.feature.get(`insertIndex`);if(!e.segment||typeof n!=`number`){b.clear();return}let r=b.getFeatures()[0];r||(r=new M(new N(e.vertex)),b.addFeature(r)),r.set(`insertIndex`,n),r.getGeometry().setCoordinates(e.vertex)}),E?.on(`unsnap`,()=>{D||b.clear()});let D;g=()=>D?.inserted?D.point:void 0;let O=()=>{T.clear(),!D&&t.getVisible()&&r.forEach((e,t)=>{T.push(new M(e.getGeometry().clone())),t>0&&T.push(new M({geometry:new re([r[t-1].getGeometry().getCoordinates(),e.getGeometry().getCoordinates()]),insertIndex:t}))})};if(E){let e=E.handleEvent.bind(E);E.handleEvent=t=>{let n=e(t);return t.type===`pointerdown`&&!D&&b.getFeatures().length&&v.renderSync(),n}}let k=()=>{if(!D)return;let e=D;D=void 0,!u()&&(e.inserted?(r.splice(r.indexOf(e.point),1),n.removeFeature(e.point)):e.point.getGeometry().setCoordinates(e.coordinate),p(),S())};w.on(`translatestart`,e=>{let t=e.features.item(0);D={point:t,coordinate:t.getGeometry().getCoordinates(),insertIndex:t.get(`insertIndex`),inserted:!1,moved:!1},T.clear()}),w.on(`translating`,e=>{let t=D;if(t&&(t.moved=!0,E&&t.point.getGeometry().setCoordinates(e.coordinate),D===t)){if(t.insertIndex!==void 0&&!t.inserted){let{point:e,insertIndex:i}=t;if(e.unset(`insertIndex`),e.setProperties({uuid:Et(),extData:{height:r[i-1].get(`extData`)?.height??0},isTakeoff:!1,isAircraft:!1,heading:r[i-1].get(`heading`)}),e.setStyle(o),r.splice(i,0,e),t.inserted=!0,n.addFeature(e),D!==t)return}p(),D===t&&S()}}),w.on(`translateend`,()=>{if(!D)return;let{point:t,moved:n,inserted:i}=D,a=t.getGeometry().getCoordinates();n&&r.some(e=>{let n=e.getGeometry().getCoordinates();return e!==t&&n[0]===a[0]&&n[1]===a[1]})?(k(),s?.(a.slice())):(D=void 0,S(),n&&e.changed(),i&&c(t))}),C.on(`select`,()=>e.changed());let j=()=>{C.getFeatures().clear(),k(),t.un(`change:visible`,S),v.removeInteraction(w),v.removeInteraction(C),E&&(v.removeInteraction(E),E.dispose()),T.clear(),w.dispose(),C.dispose(),x.setMap(null),x.clearRenderer(),x.setSource(null),b.clear(),b.dispose()};h=j,t.on(`change:visible`,S),S(),x.setMap(v),h===j&&(v.addInteraction(C),h===j&&(v.addInteraction(w),h===j&&E&&v.addInteraction(E)))}}},At=(e={})=>{let t=e.style===void 0?Tt():{},{map:n=Z,layerName:r,style:i=t.style,takeoffStyle:a=t.takeoffStyle,lineStyle:o=t.lineStyle,pointStyle:s=t.pointStyle,aircraftStyle:c=t.aircraftStyle,midpointStyle:l,edit:u,onDuplicate:d,onWaypointAdd:f,onBeforeWaypointRemove:p,onWaypointRemove:m,input:h,speed:g=10,turnSpeed:_=60,verticalSpeed:v=1,...y}=e,b=Ot(u);if([g,_,v].some(e=>!Number.isFinite(e)||e<=0))throw Error(`飞行速度、转向速度和升降速度必须为有限正数`);if(!n)throw Error(`请先创建地图实例或通过 config.map 指定地图`);let x=new F,S=new P({...y,className:r||`ol-layer`,source:x,style:i});S.set(`_layerName`,r);let C=new re([]),w=-1,T=0,E=new M(C);E.setStyle(o);let D,O,k=[],A=!1,j=0,I=0,L=`idle`,R=[],ee,z,B=0,V=/* @__PURE__ */ new Set,H=e=>{B++;try{return e()}finally{B--,!B&&!A&&K.changed()}},U=()=>{if(!(B||A))for(let e of[...V]){if(A)break;V.has(e)&&e(Y.getState())}},ne=()=>{let e=ee;ee=void 0,e?.(),R=[]},W=()=>{ne(),!A&&K.getMap()&&K.getActive()&&(h?.keyboard||h?.container!==void 0)&&(ee=wt({getMode:()=>L,getTarget:()=>n.getTargetElement()??void 0,setRouteControls:e=>Y.setRouteControls(e),addRouteWaypoint:()=>Y.addRouteWaypoint(),adjustWaypointHeight:e=>Y.adjustWaypointHeight(e),setActiveControls:e=>{R=[...e],U()}},{...h}))},G=()=>{ne(),z?.(),z=void 0,q.stopRouteControl(),J.clearEditing()},ae=e=>C.getCoordinates().findIndex(t=>t[0]===e[0]&&t[1]===e[1]),oe=e=>{if(!f||A||!e||e===D)return;let t=k.indexOf(e);t!==-1&&f({...$([e])[0],indexNo:t})},se=e=>{if(ae(e)!==-1){d?.(e.slice());return}let t=j;if(C.appendCoordinate(e),A||t!==j)return;let n=new M({uuid:Et(),geometry:new N(e),extData:{height:q.aircraft?.get(`height`)??O?.get(`extData`)?.height??0},isTakeoff:C.getCoordinates().length===1,isAircraft:!q.aircraft,heading:q.heading});if(n.setStyle(n.get(`isTakeoff`)?a:s),O?.set(`isAircraft`,!1,!0),O=n,D||=n,k.push(n),x.addFeature(n),!(A||t!==j))return C.getCoordinates().length===2&&x.addFeature(E),K.changed(),n},ce=()=>{if(A)return;let e=j;D=k[0],O=k.at(-1);for(let t of k){let n=t===D;if(t.get(`isTakeoff`)!==n&&t.setStyle(n?a:s),A||e!==j||(t.setProperties({isTakeoff:n,isAircraft:t===O}),A||e!==j))return}C.setCoordinates(k.map(e=>e.getGeometry().getCoordinates())),!(A||e!==j)&&(k.length>1&&!x.hasFeature(E)&&x.addFeature(E),k.length<2&&x.hasFeature(E)&&x.removeFeature(E))},K=new ie({handleEvent(e){if(A||!K.getActive()||e.type!==`singleclick`||L!==`draw`&&L!==`takeoff`)return!0;let t=e.coordinate.slice();if(!Number.isFinite(t[0])||!Number.isFinite(t[1])||Math.abs(t[0])>180||Math.abs(t[1])>90)return!0;let n=L===`takeoff`,r=ae(t);if(r!==-1&&(!n||r>0))return d?.(t.slice()),!1;let i;return H(()=>{let e=j,r=I;if(n&&D){let n=C.getCoordinates();if(n[0]=t,C.setCoordinates(n),A||e!==j)return;D.getGeometry().setCoordinates(t)}else i=se(t);n&&!A&&e===j&&r===I&&Y.setMode(`idle`)}),oe(i),!1}}),q=xt({speed:g,turnSpeed:_,verticalSpeed:v,interaction:K,geometry:C,vectorLayer:S,aircraftStyle:c,getLastWaypoint:()=>O,isDestroyed:()=>A}),J=kt({interaction:K,vectorLayer:S,source:x,points:k,layerOptions:y,midpointStyle:l,pointStyle:s,onDuplicate:d,onInsert:oe,getTakeoff:()=>D,isDestroyed:()=>A,isEditing:()=>L===`edit`,getEditConfig:()=>b,syncPath:ce});K.on(`change`,U),K.on(`change:active`,()=>{!K.getActive()&&!A&&Y.setMode(`idle`)});let Y=Object.assign(K,{getState(){w!==C.getRevision()&&(T=te(C,{projection:`EPSG:4326`}),w=C.getRevision());let e=J.select?.getFeatures().item(0),t=q.aircraft??O,n=t?.getGeometry().getCoordinates();return{mode:L,hasTakeoff:!!D,waypointCount:k.length,totalDistance:T,selectedWaypoint:e?{...$([e])[0],indexNo:k.indexOf(e)}:null,aircraft:t&&n?{longitude:n[0],latitude:n[1],heading:t.get(`heading`)??0,height:q.aircraft?t.get(`height`):t.get(`extData`)?.height??0,speed:g}:null,activeControls:[...R],editConfig:{...b}}},subscribe(e){if(A)throw Error(`航线已销毁`);V.add(e);try{e(Y.getState())}catch(t){throw V.delete(e),t}return()=>{V.delete(e)}},setMode(e){if(A)throw Error(`航线已销毁`);if(![`idle`,`takeoff`,`draw`,`control`,`edit`].includes(e))throw Error(`不支持的航线模式`);if([`draw`,`control`,`edit`].includes(e)&&!D)throw Error(`请先设置起飞点`);if(e!==L){if(e!==`idle`&&K.getMap()!==n)throw Error(`航线交互已移除,请重新创建航线`);if(e===`control`){let e=n.getSize();if(!n.getTargetElement()||!e||e[0]<=0||e[1]<=0)throw Error(`请先将地图挂载到已就绪的容器`);if(n.getView().getProjection().getCode()!==`EPSG:4326`)throw Error(`航线仅支持 EPSG:4326`)}H(()=>{let t=++I,r=()=>A||t!==I,i=L;if(G(),!r()&&(L=e,e!==`idle`&&ie.prototype.setActive.call(K,!0),!r()))try{if(e===`control`){let e=q.startRouteControl();if(r())return;e.on(`change`,U),z=()=>e.un(`change`,U)}if(J.updateEditing(),r()||(W(),r()))return;h?.keyboard&&e!==`idle`&&n.getTargetElement()?.focus({preventScroll:!0})}catch(e){throw r()||(G(),r())||(L=i===`control`?`idle`:i,J.updateEditing(),W()),e}})}},setEditConfig(e){if(A)throw Error(`航线已销毁`);let t=Ot(e,b);H(()=>{b=t,L===`edit`&&J.updateEditing()})},clear(){Y.importWaypoints([])},exportWaypoints(){return $(k)},importWaypoints(e){if(A)throw Error(`航线已销毁,请创建新的 Route`);let t=Dt(e,{takeoffStyle:a,pointStyle:s});H(()=>{++I;let e=++j,n=()=>A||e!==j;if(G(),!n()&&(L=L===`edit`&&t.length?`edit`:`idle`,k.length=0,D=void 0,O=void 0,x.clear(!0),!n())){for(let e of t)k.push(e);D=k[0],O=k.at(-1),C.setCoordinates(k.map(e=>e.getGeometry().getCoordinates())),!n()&&(x.addFeatures(k.length>1?[...k,E]:k),!n()&&(J.updateEditing(),n()||W()))}})},destroy(){A||(A=!0,++I,L=`idle`,V.clear(),G(),n.un(`change:target`,X),n.un(`change:view`,X),K.getMap()?.removeInteraction(K),ie.prototype.setMap.call(K,null),K.setActive(!1),k.length=0,D=void 0,O=void 0,C.setCoordinates([]),n.removeLayer(S),S.clearRenderer(),S.setSource(null),x.clear(!0),x.dispose(),K.dispose())},setMap(e){if(A)e?.removeInteraction(K);else{if(e&&e!==n)throw Error(`航线不能迁移到其他地图`);e!==K.getMap()&&H(()=>{++I,G(),L=`idle`,ie.prototype.setMap.call(K,e),W()})}},setActive(e){ie.prototype.setActive.call(K,e&&!A)},getSelectedWaypoint(){return J.select?.getFeatures().item(0)},adjustWaypointHeight(e,t=J.select?.getFeatures().item(0)){if(!Number.isFinite(e))throw Error(`高度变化必须为有限数值`);if(A||L!==`edit`||!K.getActive()||!t||!k.includes(t))return!1;let n=t.get(`extData`)??{},r=Math.max(0,(n.height??0)+e);if(!Number.isFinite(r))throw Error(`高度必须为有限数值`);return r!==(n.height??0)&&(t.set(`extData`,{...n,height:r}),!A&&k.includes(t)&&K.changed(),!0)},removeWaypoint(e=J.select?.getFeatures().item(0),t={}){if(typeof e==`string`){let t=e;e=k.find(e=>e.get(`uuid`)===t)}if(!J.select||!e||e===D||e===J.pendingInsertion||!k.includes(e))return!1;let n=I,r=j;if((t.intercept===!1?void 0:p?.({...$([e])[0],indexNo:k.indexOf(e)}))===!1||A||n!==I||r!==j||!k.includes(e))return!1;if(J.clearEditing(),!k.includes(e))return J.updateEditing(),K.changed(),!1;let i=k.indexOf(e),a=m?{...$([e])[0],indexNo:i}:void 0;return k.splice(i,1),x.removeFeature(e),ce(),J.updateEditing(),K.changed(),!A&&a&&m?.(a),!0},getLayer(){return S},hasTakeoff(){return!!D},setRouteControls(e){q.setRouteControls(e)},addRouteWaypoint(){q.aircraft&&K.getActive()&&oe(se(q.aircraft.getGeometry().getCoordinates()))}}),X=()=>{A||H(()=>{++I,G(),L=`idle`,W()})};try{n.addLayer(S),n.addInteraction(Y),n.on(`change:target`,X),n.on(`change:view`,X),W()}catch(e){throw Y.destroy(),e}return Y},jt=(e,t,n)=>{let{layerName:r}=n||{},i=Object.assign({className:r||`ol-layer`,source:new F({features:new X().readFeatures(e)}),style:t||new B({stroke:new z({color:`red`,lineDash:[10],width:3}),fill:new L({color:`rgba(0, 0, 255, 0.1)`})})},n||{});return new P(i)},Mt=(e,t,n,r)=>t&&n?.get(e[t])||r,Nt=(e,t)=>{let{key:n,crsForm:r}=t,i=[];return e.forEach(e=>{try{let t=e[n],r=Array.isArray(t)?t:JSON.parse(t||`[]`);if(r.length){let t=e.geoType||be(r);t!==`Invalid`&&i.push({type:`Feature`,properties:{...e},geometry:{type:t,coordinates:r}})}}catch(e){console.error(`创建线状数据失败:${e}`)}}),C.transform({type:`FeatureCollection`,features:i},r||C.WGS84,C.WGS84)},Pt=(e,t)=>{let{isLine:n,colorMap:r,fillColor:i,colorKey:a,strokeColor:o,fillOpacity:s,strokeWeight:c,activeFillColor:l,activeFillOpacity:u,activeStrokeColor:d,activeStrokeWeight:f}=t||{},p=e.getProperties(),m=new B({stroke:new z({width:f??c??4,color:d||Mt(p,a,r,o)})}),h=new B({stroke:new z({width:c??2,color:Mt(p,a,r,o)})});return n||(m.setFill(new L({color:ve(l||i||``,u??s??1)||ve(Mt(p,a,r,i)||``,s??1)})),h.setFill(new L({color:ve(Mt(p,a,r,i)||``,s??1)}))),e.setProperties({activeStyle:m,unActiveStyle:h}),h},Ft=(e,t)=>{let n=Nt(e,t),r=new d().readFeatures(n),i=r.map(e=>{let t={...e.getProperties()};return delete t.geometry,t});return r.forEach(e=>{e.setStyle(Pt(e,t))}),{features:r,acceptedData:i}},It=(e,t)=>{let{isAutoFit:n,layerName:r,openClick:i}=t,{features:a,acceptedData:o}=Ft(e,t),s=new P({zIndex:5,className:r||`ol-layer`,source:new F({features:a})});return i&&ft(s),s.setProperties({_isCustom:!0,_isAutoFit:n,_isVectorLayer:!0,_vectorConfig:t,_layerName:r,_dataList:o,_uuidSet:new Set(o.map(e=>e._uuid))}),s},Lt=(e,t,n)=>{let r=e.getSource(),{_vectorConfig:i}=e.getProperties()||{},{features:a,acceptedData:o}=Ft(t,Object.assign({},i,{crsForm:n??i?.crsForm}));r.addFeatures(a);let s=new Set(e.get(`_uuidSet`)||[]);o.forEach(e=>s.add(e._uuid)),e.set(`_uuidSet`,s),e.set(`_dataList`,[...e.get(`_dataList`)||[],...o])},Rt=(e=[],t)=>It(e,Object.assign({},t,{isLine:!1})),zt=(e=[],t)=>It(e,Object.assign({},t,{isLine:!0})),Bt=e=>t=>{let{baseUrl:n,markerIcon:r,statusNum:i=5,activeScale:a=1.3,markerSize:o=[32,32]}=t,s=e(n),[c,l]=o,u=Array(i*2);for(let e=0;e<i;e++){let t=s(`${r}-${e}`,`.webp`);u[e]=new B({zIndex:88+e,image:new R({width:c,height:l,src:t,anchor:[.5,1]})});let n=s(`${r}-${e}-active`,`.webp`);u[e+i]=new B({zIndex:120,image:new R({width:c*a,height:l*a,anchor:[.5,1],src:n||t})})}return u},Vt=(e,t=[])=>e.map(e=>{let{crsForm:n}=e,r=C.transform([+e.lnglat[0],+e.lnglat[1]],n||C.WGS84,C.WGS84),i=new w({geometry:new le(r)});return i.setProperties({...e,unActiveStyle:t[e.style],activeStyle:t[e.style+t.length/2]}),i.setStyle(t[e.style]),i}),Ht=(e,t,n={})=>{let r=e.get(`_massMarksStyles`),i=e?.getSource(),{clear:a}=n,o=Vt(t,r);a&&i?.clear(),i?.addFeatures(o);let s=[...a?[]:e.get(`_dataList`)||[],...t];e.set(`_dataList`,s),e.set(`_uuidSet`,new Set(s.map(e=>e._uuid)))},Ut=(e,t=[])=>{let n=new P({zIndex:2e3,source:new F({features:Vt(e,t)})});return n.setProperties({_isCustom:!0,_isVectorLayer:!0,_isMassMarksLayer:!0,_statusNum:t.length/2,_dataList:[...e],_uuidSet:new Set(e.map(e=>e._uuid)||[])}),n},Wt=e=>(t=[],n,r=!0)=>{let{offset:i=[0,0],baseUrl:a,hasLine:o,hasFace:s,layerName:c,isDynamic:l,isAutoFit:u,statusNum:d,markerIcon:f,marksStyles:p,markerSize:m,activeScale:h,vectorConfig:g}=n,_=p||Bt(e)({baseUrl:a,markerIcon:f,markerSize:m,statusNum:d||5,activeScale:h||1.3}),v=Ut(t,_);if(r&&(v.setProperties({_offset:i,_isAutoFit:u}),ft(v)),o){let e=It(t,Object.assign({},{key:`line`,isLine:!0,openClick:!1,strokeWeight:4,strokeColor:`rgba(29, 235, 255, 0.8)`},g||{}));Z.addLayer(e)}if(s){let e=It(t,Object.assign({},{isLine:!1,key:`faceList`,strokeWeight:1,openClick:!1,fillColor:`#4247DF`,strokeStyle:`dashed`,strokeColor:`#4247DF`},g||{}));Z.addLayer(e)}return v.setProperties({_isCustom:!0,_offset:i,_hasLine:o,_hasFace:s,className:c,_layerName:c,_isVectorLayer:!0,_isDynamic:l,_massMarksStyles:_}),Z.addLayer(v),v},Gt=(e=[])=>{let t=new B({}),n=new Set(e),r=[];return Z.getAllLayers().filter(e=>e.get(`_isMassMarksLayer`)).forEach(e=>{e.getSource().getFeatures().forEach(e=>{let i=e.getProperties();n.has(i.status)?(r.push(i),e.setStyle(i.unActiveStyle)):e.setStyle(t)})}),r},Kt=(e,t)=>{let n=Z.getAllLayers().filter(t=>(t.get(`_layerName`)||t.getClassName())===e&&t.get(`_isMassMarksLayer`)),r=new B({});n.forEach(e=>{e.getSource().getFeatures().forEach(e=>{let n=e.getProperties();t.has(n.id)?e.setStyle(n.unActiveStyle):e.setStyle(r)})})},qt=(e,t)=>{let n=e.length,r={},{distance:i,minDistance:a,openClick:o,buildStyle:s,singleStyles:c,computedRadius:l,layerName:u=`cluster-layer`}=t,d=e=>(e/n)**(1/18);r[1]=c;let f=e=>{let t=e.get(`features`).length,n=r[t],i=l?l(t):d(t);if(n||(n=new B({image:new W({radius:i*20,stroke:new z({width:2,color:`hsla(${180-i*180}, 100%, 40%, 1)`}),fill:new L({color:`hsla(${180-i*180}, 100%, 50%, 1)`})}),text:new V({text:t.toString(),fill:new L({color:`hsla(${180-i*180}, 100%, 10%, 1)`}),textBaseline:`middle`})}),r[t]=n),Array.isArray(n)){let t=e.get(`features`)[0].get(`styleIndex`)??0;return n[t]}return n},p=new P({zIndex:200,className:u,source:new ue({distance:i||80,minDistance:a||0,source:new F({features:e.map(e=>{let t=new w(new le(e.lnglat));t.setProperties(e);let n=e.style??0;return t.setProperties({unActiveStyle:c[n],activeStyle:c[n+c.length/2]}),t})})}),style:e=>s?s(e):f(e)});return p.setProperties({_isCustom:!0,_isVectorLayer:!0,_isClusterLayer:!0}),o&&ft(p),p};export{de as GeometryType,Ue as activeFeatureByUid,Ht as addFeaturesByLayer,Wt as addMassMarksLayer,Lt as appendFeaturesByLayer,ke as baseLayers,Bt as buildMassMarksStyles,Kt as changeFeaturesVisibleByIds,Fe as changeLayer,Pe as changeSource,ct as changeUnselectStyle,Re as createAnimationMarker,De as createBaseLayer,It as createBusinessLayer,qt as createClusterLayer,bt as createDrawInteraction,lt as createElasticMarkerLayer,jt as createGeoJsonLayer,rt as createIconStyle,pt as createLayerSelectByNames,Ge as createMap,We as createMapInstance,Oe as createMapWorldLayer,it as createMarker,at as createMarkersLayer,Ut as createMassMarksLayer,ut as createMoveMarkerLayer,ze as createOverlay,At as createRouteController,ft as createSelectByLayer,pe as createTdtVectorSource,me as createTdtVtsLayer,nt as createText,Rt as createVectorFaceLayer,zt as createVectorLineLayer,we as createWmtsLayer,Ae as createZheJiangLayer,qe as disposeInstance,Ke as disposeMap,he as emitter,tt as flyToAnimate,yt as getDrawStyle,je as getLayerByName,ye as getLayersDataList,Je as getMapInstance,Z as instance,Ve as removeAllLayers,Me as removeLayerByName,Ie as removeOverlays,He as resetActiveFeature,Be as resetActiveVector,Xe as resetMap,Ye as resetZoomAndCenter,Qe as setFitViewByCoords,$e as setFitViewByGeom,et as setFitViewByLayer,Gt as updateMarksLayersByStatus};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "map-ol-utils",
3
- "version": "1.1.4",
3
+ "version": "1.1.6",
4
4
  "type": "module",
5
5
  "description": "OpenLayers utilities with browser-side Tianditu private VTS loading and conversion",
6
6
  "files": [