map-ol-utils 1.0.2 → 1.1.0
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 +202 -2
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +142 -3
- package/dist/index.d.mts +144 -5
- package/dist/index.mjs +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -37,6 +37,8 @@ packages/map-utils/
|
|
|
37
37
|
└── README.md # 安装、API 与使用约定
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
+
航线内部按职责拆分:`interaction/route.ts` 维护航点数据、公开交互入口与模式生命周期;`interaction/route-control.ts` 管理实时飞行器、动作集合和动画帧;`interaction/route-editor.ts` 管理选择、拖动、中点插入与编辑资源清理;`interaction/route-waypoints.ts` 校验导入数据、创建航点并转换导出数据;`route-input.ts` 管理键盘和面板输入;`route-style.ts` 提供默认样式。调用方从包根导入 `createRouteController`,内部模块不作为公共入口。
|
|
41
|
+
|
|
40
42
|
## 安装
|
|
41
43
|
|
|
42
44
|
```bash
|
|
@@ -236,7 +238,7 @@ function getLayerByName(name: string): Layer<Source> | undefined
|
|
|
236
238
|
function removeLayerByName(name: string): void
|
|
237
239
|
```
|
|
238
240
|
|
|
239
|
-
|
|
241
|
+
查找所有匹配图层,逐一释放其数据源、从地图移除并执行 `dispose`。
|
|
240
242
|
|
|
241
243
|
### `changeLayersByNames(activeNames, allLayerNames)`
|
|
242
244
|
|
|
@@ -431,6 +433,17 @@ function updateMarksLayersByStatus(checkedStatusList?: string[]): MassData[]
|
|
|
431
433
|
|
|
432
434
|
遍历所有海量点图层:`status` 不在勾选列表中的要素设为隐藏样式,否则恢复默认样式。返回当前保留显示的数据数组。
|
|
433
435
|
|
|
436
|
+
### `changeFeaturesVisibleByIds(layerName, visibleIdSet)`
|
|
437
|
+
|
|
438
|
+
```ts
|
|
439
|
+
function changeFeaturesVisibleByIds(
|
|
440
|
+
layerName: string,
|
|
441
|
+
visibleIdSet: Set<string>
|
|
442
|
+
): void
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
遍历所有同名海量点图层,隐藏业务 `id` 不在集合中的要素,集合中的要素恢复 `unActiveStyle`。此方法只修改样式,不移除要素或清除已有选择。
|
|
446
|
+
|
|
434
447
|
---
|
|
435
448
|
|
|
436
449
|
## 五、聚合图层(`layer/cluster-layer.ts`)
|
|
@@ -657,12 +670,199 @@ map.addInteraction(select)
|
|
|
657
670
|
### 绘制、GeoJSON 与视野
|
|
658
671
|
|
|
659
672
|
- `createDrawInteraction(type, vectorLayer, openTip?)`:创建绘制交互。
|
|
673
|
+
- `createRouteController(config?)`:自动获取地图并挂载航线资源,统一模式、状态订阅、输入与生命周期,默认空闲。
|
|
660
674
|
- `getDrawStyle(feature, drawStyle?)`:为线和面绘制追加长度/面积标签。
|
|
661
675
|
- `createGeoJsonLayer(geoJson, style, config?)`:直接从 GeoJSON 创建矢量图层。
|
|
662
676
|
- `flyToAnimate(center, zoom?)`:使用两段缩放动画飞到目标点。
|
|
663
677
|
|
|
664
678
|
相关类型包括 `LayerConfig`、`DataItemConfig`、`ElasticDataItemConfig`。
|
|
665
679
|
|
|
680
|
+
### 航线控制器
|
|
681
|
+
|
|
682
|
+
先创建地图,再创建航线。`map` 可选,默认使用 `createMapInstance()` 创建的实例;多地图时显式传入所属地图。库自动创建并挂载航线图层和主交互,不需要手动添加交互。初始为 `idle`,不拦截地图操作。航点与操控仅支持 `EPSG:4326` 经纬度。
|
|
683
|
+
|
|
684
|
+
```ts
|
|
685
|
+
import { createMapInstance, createRouteController } from 'map-ol-utils'
|
|
686
|
+
|
|
687
|
+
const map = createMapInstance({ center: [120.1551, 30.2741], zoom: 17 })
|
|
688
|
+
map.setTarget('map')
|
|
689
|
+
const route = createRouteController({
|
|
690
|
+
input: { keyboard: true }, // 可选:地图或面板聚焦时响应快捷键
|
|
691
|
+
speed: 10,
|
|
692
|
+
turnSpeed: 60,
|
|
693
|
+
verticalSpeed: 1,
|
|
694
|
+
edit: { mode: 'snap', pixelTolerance: 10 }
|
|
695
|
+
})
|
|
696
|
+
|
|
697
|
+
// 业务自己的按钮直接调用:
|
|
698
|
+
route.setMode('takeoff') // 下一次地图单击确认起飞点,完成后回到 idle
|
|
699
|
+
// 确认起飞点后:
|
|
700
|
+
// route.setMode('draw') // 地图点击追加航点
|
|
701
|
+
// route.setMode('control') // 从最后记录点开始操控
|
|
702
|
+
// route.setMode('edit') // 编辑已有航点
|
|
703
|
+
// route.setMode('idle') // 停止操作,保留航线
|
|
704
|
+
|
|
705
|
+
const unsubscribe = route.subscribe((state) => {
|
|
706
|
+
console.log(state.mode, state.waypointCount, state.aircraft)
|
|
707
|
+
})
|
|
708
|
+
// const data = route.exportWaypoints() // 保存请求由业务负责
|
|
709
|
+
// route.clear() // 清空后复用同一实例,配置和输入保留
|
|
710
|
+
// unsubscribe() // 可提前取消;destroy 会清理所有订阅
|
|
711
|
+
// route.destroy() // 移除本航线的图层、交互和输入监听,不销毁地图
|
|
712
|
+
```
|
|
713
|
+
|
|
714
|
+
### 模式与生命周期
|
|
715
|
+
|
|
716
|
+
| 模式 | 行为 |
|
|
717
|
+
| --------- | ------------------------------------------------- |
|
|
718
|
+
| `idle` | 保留数据,停止当前操作 |
|
|
719
|
+
| `takeoff` | 下一次地图单击设置或修改起飞点,成功后返回 `idle` |
|
|
720
|
+
| `draw` | 单击追加独立航点并依次连线,没有鼠标跟随线 |
|
|
721
|
+
| `control` | 实时飞机移动、转向、升降;显式打点才记录航点 |
|
|
722
|
+
| `edit` | 选择、拖动普通航点,插入、删除和调整高度 |
|
|
723
|
+
|
|
724
|
+
`draw`、`control`、`edit` 要求已有起飞点,可通过地图确认或导入非空航点建立。配置和前置校验失败不切换模式;重复进入同一模式不重启飞控、不丢失选择。切换模式由库清理输入、临时飞机、选择及未完成拖动。操控时普通地图点击不追加航点或移动飞机。
|
|
725
|
+
|
|
726
|
+
`clear()` 清空航点并回到 `idle`,保留实例、样式、编辑配置和输入配置。`destroy()` 幂等,永久移除本航线全部资源和订阅;销毁后不能再次切换模式、导入或订阅。外部停用、移除交互,或改变地图容器、View 时停止操作并回到 `idle`;重新启用不会自动恢复上一次操作。航线不支持迁移到其他地图。调用方应先销毁航线,再销毁地图。
|
|
727
|
+
|
|
728
|
+
本次接口统一移除了旧的绘制开关和多个模式切换方法,所有模式通过 `setMode()` 管理,所有编辑配置通过 `setEditConfig()` 更新。
|
|
729
|
+
|
|
730
|
+
### 状态订阅
|
|
731
|
+
|
|
732
|
+
`getState(): RouteState` 返回普通数据快照。`subscribe(listener)` 立即通知一次初始状态,之后在数据、模式、选择、输入或实时飞机变化时通知,返回取消订阅函数;`destroy()` 自动清理订阅。
|
|
733
|
+
|
|
734
|
+
| 字段 | 说明 |
|
|
735
|
+
| --- | --- |
|
|
736
|
+
| `mode` | 当前互斥操作模式 |
|
|
737
|
+
| `hasTakeoff` | 是否已有起飞点 |
|
|
738
|
+
| `waypointCount` | 航点数,包含起飞点,不包含临时飞机与编辑手柄 |
|
|
739
|
+
| `selectedWaypoint` | 选中航点的普通数据,未选中为 `null` |
|
|
740
|
+
| `aircraft` | 实时飞机的经纬度、`heading`、`height`、`speed`,未操控为 `null` |
|
|
741
|
+
| `activeControls` | 合并后的键盘、指针动作,用于按钮高亮 |
|
|
742
|
+
| `editConfig` | 当前中点或吸附配置 |
|
|
743
|
+
|
|
744
|
+
实时通知只读取飞机与选中点,不逐帧导出整条航线。快照的数组、配置与航点顶层对象独立;航点嵌套业务对象与导出一样仍保留引用,应作为只读数据使用。业务表单、提示文案、权限与后端保存仍由调用方负责。
|
|
745
|
+
|
|
746
|
+
### 业务面板与输入
|
|
747
|
+
|
|
748
|
+
操作面板由业务创建、布局并根据状态控制显示。库不创建或删除业务 DOM,只负责输入事件与生命周期。传入操控区和编辑区的公共容器,无需单独传编辑面板或调用绑定方法;也可以只配置 `input.keyboard: true` 使用键盘,或省略输入配置只使用地图绘制。
|
|
749
|
+
|
|
750
|
+
```ts
|
|
751
|
+
const route = createRouteController({
|
|
752
|
+
input: { keyboard: true, container: 'route-controls' }
|
|
753
|
+
})
|
|
754
|
+
```
|
|
755
|
+
|
|
756
|
+
```html
|
|
757
|
+
<div id="route-controls">
|
|
758
|
+
<button type="button" data-route-control="forward">前进</button>
|
|
759
|
+
<button type="button" data-route-control="ascend">升高</button>
|
|
760
|
+
<button type="button" data-route-control="waypoint">打点</button>
|
|
761
|
+
</div>
|
|
762
|
+
```
|
|
763
|
+
|
|
764
|
+
`input.container` 可传容器 ID(不带 `#`)或 `HTMLElement`。ID 优先在所属地图容器的 document 中查找,地图尚未挂载时使用当前 document;找不到时明确报错,创建失败会回收本次图层与交互。容器必须已创建,Vue 中在 `onMounted()` 后初始化,无需额外保存面板 ref。事件代理允许内部按钮动态增删。键盘 W/S/A/D 移动、Q/E 转向、Z/C 升降、空格打点;操控模式按住动作持续执行,编辑模式只处理升降,每次 1 米。高度最低 0。键盘和指针分别记录并合并,松开一个来源不会清除其他来源。输入框、选择框、可编辑内容和链接不响应快捷键;失焦、后台、指针取消及模式切换清空动作,销毁时解绑监听和释放捕获,保留业务容器。显式启用键盘时,进入操作模式会聚焦地图容器;库临时添加的 tabindex 在解绑时恢复。未配置输入时,可直接使用 `setRouteControls()` 与 `addRouteWaypoint()` 接入其他设备。
|
|
765
|
+
|
|
766
|
+
### 航线样式与数据约定
|
|
767
|
+
|
|
768
|
+
不传 `style` 时,库提供起飞点、普通点、连线、末点飞机与航向旋转的完整样式。显式传入整体 `style` 时,未配置的分类继承整体样式;`null` 隐藏整体样式,分类空数组隐藏该分类。`takeoffStyle`、`lineStyle`、`pointStyle`、`aircraftStyle` 和 `midpointStyle` 仍可分别覆盖。自定义飞机样式自行根据 `heading` 设置旋转。图层配置支持 `layerName`、`zIndex`、`visible`、`minZoom` 与 `maxZoom`。
|
|
769
|
+
|
|
770
|
+
`getLayer()` 保留底层数据访问能力,但清空与替换必须使用 `clear()` 或 `importWaypoints()`,不要直接清理数据源导致内部状态失配。首点标记 `isTakeoff`,停止后末点标记 `isAircraft`;操控期间飞机由临时图层显示,不写入导出数据。航点有稳定 UUID,修改位置不改变标识。所有业务属性保存在独立 `extData` 中;高度为有限非负米数,点击新增继承末点高度,操控打点使用飞机高度,插点继承前点高度,其他业务配置不自动继承。
|
|
771
|
+
|
|
772
|
+
同一航线按二维坐标精确去重,拒绝重复点击、打点或起飞点冲突时调用可选 `onDuplicate(coordinate)`,参数为坐标副本;编辑拖动重复则回滚。起飞点不能选中、拖动或删除,只能通过 `takeoff` 模式修改。起飞点与其他航点冲突时保持等待下一次点击。
|
|
773
|
+
|
|
774
|
+
### 导入航点
|
|
775
|
+
|
|
776
|
+
`importWaypoints(waypoints: readonly RouteWaypoint[])` 整体替换当前航线,按 `indexNo` 从小到大连线;相同序号保持输入顺序,不修改传入数组。首点设为起飞点,末点标记为飞机,无需另行点击确认。
|
|
777
|
+
|
|
778
|
+
```ts
|
|
779
|
+
import { createRouteController, type RouteWaypoint } from 'map-ol-utils'
|
|
780
|
+
|
|
781
|
+
const controller = createRouteController({ map })
|
|
782
|
+
const points: RouteWaypoint[] = [
|
|
783
|
+
{
|
|
784
|
+
waylineId: 'route-1',
|
|
785
|
+
indexNo: 0,
|
|
786
|
+
pointSpeed: 10,
|
|
787
|
+
gimbalPichAngle: -45,
|
|
788
|
+
direction: 90,
|
|
789
|
+
shootType: 'time',
|
|
790
|
+
supportLightType: 'ir,visable',
|
|
791
|
+
longitude: 120.15,
|
|
792
|
+
latitude: 30.28
|
|
793
|
+
},
|
|
794
|
+
{ indexNo: 1, longitude: 120.16, latitude: 30.29 }
|
|
795
|
+
]
|
|
796
|
+
controller.importWaypoints(points)
|
|
797
|
+
controller.setMode('edit') // 导入后可继续编辑
|
|
798
|
+
// controller.importWaypoints([]) // 清空,hasTakeoff() 恢复 false
|
|
799
|
+
```
|
|
800
|
+
|
|
801
|
+
| 字段 | 要求 | 用途 |
|
|
802
|
+
| --- | --- | --- |
|
|
803
|
+
| `uuid` | 可选,非空白字符串,同一批导入不能重复 | 航点稳定标识;省略时自动生成 UUID v4,导出带回 |
|
|
804
|
+
| `indexNo` | 必填,非负整数 | 仅用于导入排序,导出时按连线顺序重新编号;不存入 Feature |
|
|
805
|
+
| `longitude`、`latitude` | 必填,有限数值,范围分别为 ±180、±90 | EPSG:4326 经纬度,写入 Point 几何 |
|
|
806
|
+
| `waylineId` | 可选,字符串 | 航线业务标识 |
|
|
807
|
+
| `height` | 可选,有限非负数,默认 0 | 航点高度(米),保存到 `extData.height` |
|
|
808
|
+
| `pointSpeed` | 可选,非负有限数值 | 速度元数据,不改变实时操控速度 |
|
|
809
|
+
| `gimbalPichAngle` | 可选,有限数值 | 云台俯仰角,保留接口原字段拼写 |
|
|
810
|
+
| `direction` | 可选,有限数值 | 航向角,同时写入显示用 `heading`,缺省为 0 |
|
|
811
|
+
| `shootType` | 可选,`''`、`time`、`distance`、`none` | 拍照模式 |
|
|
812
|
+
| `supportLightType` | 可选,空字符串或 `ir`、`visable` 的逗号组合 | 影像类型,保留接口原枚举拼写 |
|
|
813
|
+
|
|
814
|
+
经纬度只存入几何,编辑后的最新位置通过 `feature.getGeometry().getCoordinates()` 获取。`waylineId`、`pointSpeed`、`gimbalPichAngle`、`direction`、`shootType`、`supportLightType`、`height` 和其他业务属性保存在 Feature 的独立 `extData` 对象中。`uuid` 在顶层标识航点,`heading`、`isTakeoff`、`isAircraft` 保留在顶层供控制与样式使用;`indexNo` 只用于导入排序和导出重新编号,不保存在 Feature 中。新航点的 `extData` 初始化高度;点击新增继承末点高度,飞控打点取当前飞行器高度,中点插入继承前一航点高度,其他业务配置不继承。
|
|
815
|
+
|
|
816
|
+
```ts
|
|
817
|
+
const waypoint = controller.getSelectedWaypoint()
|
|
818
|
+
if (waypoint) {
|
|
819
|
+
const extData = waypoint.get('extData')
|
|
820
|
+
waypoint.set('extData', { ...extData, pointSpeed: 15 })
|
|
821
|
+
}
|
|
822
|
+
```
|
|
823
|
+
|
|
824
|
+
航点标识通过 `feature.get('uuid')` 读取。导入保留已有 `uuid`,缺省时生成;点击、操控打点和中点插入各自生成新 UUID,拖动、修改起飞点、删除其他点及导出重新编号都不改变已有标识。标识在创建时确定,调用方不应直接改写。自动生成使用 Web Crypto 的 `getRandomValues()`,支持 HTTP 页面。
|
|
825
|
+
|
|
826
|
+
`RouteWaypoint` 通过 `[key: string]: unknown` 接受额外业务字段,例如 `heightMode`、`reachShoot` 或嵌套动作配置。导入除 `uuid`、`indexNo`、`longitude`、`latitude` 外的所有自有可枚举属性到 `extData`,已有字段仍按上表校验,扩展字段不做业务校验或模式映射。导入和导出只浅拷贝顶层,嵌套对象、数组保留引用。同名 `heading`、`isTakeoff`、`isAircraft` 等业务属性也只保存在 `extData`,不覆盖 Feature 内部标记。导出展开 `extData` 后,以控制器的 UUID、连续序号和最新坐标覆盖同名值。
|
|
827
|
+
|
|
828
|
+
业务层读取或更新这些字段应通过 `extData`;导出读取最新 `extData` 并生成原来的扁平结构。拖动只更新几何,不重算业务属性;修改 `extData.direction` 不自动更新样式使用的 `heading`,需要即时刷新航向显示时由调用方同时设置。
|
|
829
|
+
|
|
830
|
+
导入先校验整批数据;非法字段或重复经纬度抛错,原航线、编辑选择和操控状态保持不变。成功后停止操控、取消未完成拖动、清除旧选择;非空导入保留编辑模式并重建手柄,其余模式与空数组导入回到空闲。空数组清空点线,单点只生成起飞点。销毁后调用抛错。导入不调整视野,不提供文件解析功能。
|
|
831
|
+
|
|
832
|
+
### 导出航点
|
|
833
|
+
|
|
834
|
+
`exportWaypoints(): RouteWaypoint[]` 返回当前航线的数据副本,可直接用于保存或再次调用 `importWaypoints()`。
|
|
835
|
+
|
|
836
|
+
```ts
|
|
837
|
+
controller.importWaypoints(points)
|
|
838
|
+
// 绘制或编辑完成后保存
|
|
839
|
+
const data = controller.exportWaypoints()
|
|
840
|
+
const json = JSON.stringify(data)
|
|
841
|
+
```
|
|
842
|
+
|
|
843
|
+
- 导出包含每个航点的稳定 `uuid`,导出再导入保留标识;缺省标识的旧数据仍可导入。
|
|
844
|
+
- 数组包含起飞点及已记录航点,顺序与连线一致;不包含线要素、中点手柄或未打点的实时飞机。
|
|
845
|
+
- `indexNo` 按当前顺序从 0 连续生成,支持插入和删除后再次导入;不向 Feature 写入序号。
|
|
846
|
+
- `longitude`、`latitude` 取 Point 的当前坐标;拖动未结束时读取的是当前临时位置,持久化应在编辑完成后进行。
|
|
847
|
+
- 保留所有扩展业务属性,以及 `height`、`waylineId`、`pointSpeed`、`gimbalPichAngle`、`direction`、`shootType`、`supportLightType`。已声明字段未设置时,数值填 0、字符串填空字符串;扩展字段不补默认值;`direction` 优先取 `extData.direction`,缺省取绘制时记录的 `heading`,不按线段重新计算。
|
|
848
|
+
- 每次返回新数组和新的顶层对象,修改顶层字段不影响航线;嵌套对象和数组共享引用。不导出 Feature 自身的内部属性,`extData` 业务属性原样保留。空航线、清空和销毁后返回 `[]`,读取不会停止操控或切换编辑模式。
|
|
849
|
+
|
|
850
|
+
### 编辑与飞行配置
|
|
851
|
+
|
|
852
|
+
`RouteConfig.edit` 和 `setEditConfig(options)` 接受 `mode: 'midpoint' | 'snap'` 与 `pixelTolerance`。默认 `midpoint`、容差 10 像素;容差必须为有限正数,配置增量合并。配置失败保留当前选择和拖动;有效更新在编辑模式下取消未完成拖动、清除旧选择并重建手柄。
|
|
853
|
+
|
|
854
|
+
```ts
|
|
855
|
+
route.setMode('edit')
|
|
856
|
+
route.setEditConfig({ mode: 'snap', pixelTolerance: 15 })
|
|
857
|
+
route.removeWaypoint() // 删除选中普通航点;失败返回 false
|
|
858
|
+
route.adjustWaypointHeight(1) // 选中航点升高 1 米,最低 0
|
|
859
|
+
route.setMode('idle') // 完成编辑并保留结果
|
|
860
|
+
```
|
|
861
|
+
|
|
862
|
+
中点模式拖动固定手柄插入航点,吸附模式沿整条线定位临时点后拖动插入;悬停和单击不插点。拖动与插入会同步线坐标,重复坐标回滚。`getSelectedWaypoint()` 仍可读取底层 Feature;`removeWaypoint(point?)`、`adjustWaypointHeight(delta, point?)` 可省略参数操作当前选择。起飞点不能删除,但可以显式传入起飞点调整高度。删除全部普通点后保留起飞点并移除线。
|
|
863
|
+
|
|
864
|
+
创建配置的 `speed`、`turnSpeed`、`verticalSpeed` 默认分别为 10 m/s、60°/s、1 m/s,均为有限正数,创建后固定。新启动飞控从最后确认的航点及其高度开始,机头朝北;重复进入 `control` 保持当前飞机状态。按球面距离计算位移,移动时视野跟随,手动平移不修改飞机位置;单独转向、升降和打点不改变地图中心。动画帧停顿最多计入 100ms。编辑单次高度步长不受飞控速度影响。临时飞机不进入导出结果,持久化拖动结果应等待拖动结束。
|
|
865
|
+
|
|
666
866
|
---
|
|
667
867
|
|
|
668
868
|
## 十一、类型定义(`core/types.ts`,`export * from './core/types'`)
|
|
@@ -698,7 +898,7 @@ enum GeometryType {
|
|
|
698
898
|
}
|
|
699
899
|
```
|
|
700
900
|
|
|
701
|
-
完整导出还包括:`VectorConfig`、`ClusterConfig`、`ClusterData`、`IconConfig`、`WmtsSourceOptions`、`GetImgUrl`、`GetImgUrlFn`、`HzsyType`、`ZheJiangType`、`WorldLayerType`、`GeometryCoordinates`。
|
|
901
|
+
完整导出还包括:`VectorConfig`、`ClusterConfig`、`ClusterData`、`IconConfig`、`WmtsSourceOptions`、`GetImgUrl`、`GetImgUrlFn`、`HzsyType`、`ZheJiangType`、`WorldLayerType`、`GeometryCoordinates`、`RouteConfig`、`RouteEditConfig`、`RouteWaypoint`、`RouteControl`。
|
|
702
902
|
|
|
703
903
|
---
|
|
704
904
|
|
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 ee=require("ol/Observable"),x=require("ol/layer/Image");x=s(x,1);let S=require("ol/source/Raster");S=s(S,1);let C=require("ol/Map");C=s(C,1);let w=require("ol/View");w=s(w,1);let te=require("ol/control"),T=require("gcoord");T=s(T,1);let E=require("ol"),D=require("ol/interaction"),ne=require("ol/extent"),re=require("ol/events/condition"),O=require("ol/Feature");O=s(O,1);let k=require("ol/geom/Point");k=s(k,1);let A=require("ol/layer/Vector");A=s(A,1);let j=require("ol/source/Vector");j=s(j,1);let M=require("ol/style"),N=require("ol/interaction/Draw");N=s(N,1);let ie=require("ol/sphere"),P=require("ol/format/GeoJSON");P=s(P,1);let ae=require("ol/geom"),F=require("ol/source/Cluster");F=s(F,1);let I=require("ol/style/Circle");I=s(I,1);let oe=/* @__PURE__ */ function(e){return e.LineString=`LineString`,e.MultiLineString=`MultiLineString`,e.Polygon=`Polygon`,e.MultiPolygon=`MultiPolygon`,e.Invalid=`Invalid`,e}({});const se=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()},ce=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}},le=async e=>{let t=await se(e.style);if(t?.version!==8||!t.sources||!Array.isArray(t.layers))throw TypeError(`style 必须是 Style v8 对象或其 JSON 地址`);let{source:n}=ce({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}},L=(0,p.default)();let R;const ue=e=>{R=e},de=()=>{R=void 0},z=(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},fe=()=>R?.getAllLayers().map(e=>e.get(`_dataList`)||[]).flat(2)||[],pe=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`}},me=new g.WMTSCapabilities,he=/* @__PURE__ */ new Map,ge=async e=>{let t=he.get(e);if(t)return t;let n=await fetch(e);if(!n.ok)throw Error(`WMTS capabilities 请求失败:${n.status}`);let r=me.read(await n.text());return he.set(e,r),r},_e=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 ge(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)})},B=(e,t)=>{let n=t.get(`_selectInteraction`);n&&(e.removeInteraction(n),n.dispose(),t.unset(`_selectInteraction`));let r=t.get(`_resolutionChangeKey`);r&&((0,ee.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()},ve=`c77eddc667c5bed016fded560baf93e7`,V=(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=ve)=>{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=>R.getAllLayers().find(t=>(t.get(`_layerName`)||t.getClassName())===e),Ce=e=>{R.getAllLayers().filter(t=>(t.get(`_layerName`)||t.getClassName())===e).forEach(e=>{B(R,e)})},we=()=>Math.max(1,Math.min(4,globalThis.navigator?.hardwareConcurrency??2)),H=(e,t,n,r={})=>{let i=new S.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},Te=(e,t,n,r={})=>new x.default({source:H(e,t,n,r)}),U=(e=``)=>{R&&R.getOverlays().getArray().filter(t=>t.get(e||`position`)).forEach(e=>R.removeOverlay(e))},Ee=()=>U(`_isAnimationMarker`),De=(e,t)=>{Ee();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 E.Overlay({element:o,stopEvent:!1,positioning:`bottom-center`,position:T.default.transform([+i[0],+i[1]],a||T.default.WGS84,T.default.WGS84)});c.set(`_isAnimationMarker`,!0),R.addOverlay(c)},Oe=(e={id:`popup-container`,positioning:`top-center`})=>new E.Overlay(Object.assign({element:document.getElementById(e.id)||void 0},e)),ke=()=>{U(),R.getAllLayers().forEach(e=>{e.get(`_selectInteraction`)?.getFeatures().clear()})},Ae=()=>{U(),R&&R.getAllLayers().forEach(e=>{e.get(`_isBaseLayer`)||B(R,e)})},je=()=>{U(),R.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())})},Me=e=>{let t=R.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 W=[119.71512016971076,30.122490541963536];const Ne=(e={})=>{if(R)return R;let t=Pe(e);return ue(t),t},Pe=(e={})=>{let t=Object.assign({zoom:9.4,maxZoom:18,minZoom:9.4,center:W,baseLayer:`vec-layer`,projection:`EPSG:4326`,layers:[V()],constrainResolution:!1,smoothExtentConstraint:!1,tk:ve},e||{}),n=new C.default({view:new w.default(t),controls:(0,te.defaults)({zoom:!1,rotate:!1,attribution:!1}),interactions:(0,D.defaults)({pinchRotate:!1,doubleClickZoom:!1,altShiftDragRotate:!1}),layers:t.layers||[V()]});W=t.center||W,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&&B(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},Fe=()=>{if(!R)return;let e=R;e.get(`_disposePointerMove`)?.(),e.unset(`_disposePointerMove`),e.getOverlays().forEach(t=>{e.removeOverlay(t)}),e.getInteractions().clear(),e.getAllLayers().forEach(t=>B(e,t)),e.setTarget(``),e.dispose(),de()},Ie=()=>Fe(),Le=()=>R,Re=(e=W)=>{R&&R.getView().animate({zoom:9.4,center:e,duration:1e3})},ze=(e={center:W,isClearAll:!0})=>{Ae(),Re(e.center||W)},G={padding:[50,50,50,50],duration:1e3},Be=(e,t=R,n)=>{let r=t.getView();if(e.length===1)r.animate({zoom:14,duration:1e3,center:e[0],...n||{}});else{let t=(0,ne.boundingExtent)(e);r.fit(t,{...G,...n||{}})}},Ve=(e,t=R,n)=>{t.getView().fit(e,{...G,...n||{}})},He=(e,t=R,n)=>{let r=e.getSource();if(!r||r.isEmpty())return;let i=r.getExtent();i&&t.getView().fit(i,{...G,...n||{}})},Ue=(e,t)=>{let n=R.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})},We=e=>new M.Text({text:e.text,offsetY:e.offsetY,offsetX:e.offsetX,justify:`center`,textAlign:`center`,font:`16px PingFangSC-Semibold`,fill:new M.Fill({color:`rgba(255, 255, 255, 0.8)`})}),K=(e,t=!1)=>new M.Style({image:new M.Icon({scale:e.scale||1,rotation:e.rotation||0,anchor:e.anchor||[.5,1],src:t&&e.activeImg||e.img}),text:e.showText?We(e):void 0}),q=(e,t)=>{let n=new O.default({geometry:new k.default([+e.lng,+e.lat]),data:Object.assign({},e||{},{layerName:t.layerName})});return n.setStyle(K(e)),n},Ge=(e,t)=>{let{layerName:n,visible:r=!0,zIndex:i=10}=t,a=new j.default;return e.forEach(e=>a.addFeature(q(e,t))),new A.default({zIndex:i,visible:r,source:a,className:n||`marker-layer`})},J=(e,t)=>{let n=t>=14?`largeImg`:t>=11?`smallImg`:`img`;e.forEach(e=>{let t=e.get(`data`);t.isSelected||e.setStyle(K({...t,img:t[n]},!1))})},Y=(e,t)=>{let n=e.get(`data`),r={...n,isSelected:t};e.set(`data`,r),n.isElastic?J([e],R.getView().getZoom()):e.setStyle(K(r,t))},Ke=e=>{e.forEach(e=>{Y(e,!1)}),e.clear()},qe=(e,t)=>{let n=e.map(e=>({...e,isElastic:!0})),r=Ge(n,t),i=r.getSource().getFeatures(),a=R.getView();return J(i,a.getZoom()),r.set(`_resolutionChangeKey`,a.on(`change:resolution`,()=>J(i,a.getZoom()))),r},Je=(e,t)=>{let n=q(e,t),r=new A.default({className:t.layerName||`ol-layer`,source:new j.default({features:[n]})});return R.addLayer(r),{vectorLayer:r}},Ye=(e,t)=>{let n=t.getProperties(),{activeStyle:r}=n;if(t.setStyle(r),L.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`),L.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=R.getView();e.animate({duration:1e3,zoom:e.getZoom(),center:(0,ne.getCenter)(t.getGeometry().getExtent())})}},X=e=>{let t=new D.Select({style:null,multi:!1,hitTolerance:10,layers:[e],condition:t=>{if(!(0,re.singleClick)(t))return!1;let n=!1;return R.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&&Ye(e,n[0])}else Ye(e,t)}if(r.length){let t=r[0],n=t.getProperties();t.setStyle(n.unActiveStyle),e.set(`_hasActive`,!1)}}),R.addInteraction(t),e.set(`_selectInteraction`,t),t},Xe=(e,t,n)=>{let r=new D.Select({style:null,layers:t=>e.includes(t.getClassName())});return r.on(`select`,({deselected:e,selected:r})=>{if(e.length){let t=e[0];Y(t,!1),n?.(t)}if(r.length){let e=r[0];Y(e,!0),t?.(e)}}),r},Ze=e=>{let t=(0,ie.getArea)(e,{projection:`EPSG:4326`});return t>1e4?`${Math.round(t/1e6*100)/100} km\xB2`:`${Math.round(t*100)/100} m\xB2`},Qe=e=>{let t=(0,ie.getLength)(e,{projection:`EPSG:4326`});return t>100?`${Math.round(t/1e3*100)/100} km`:`${Math.round(t*100)/100} m`},$e=new M.Style({fill:new M.Fill({color:`rgba(255, 255, 255, 0.2)`}),stroke:new M.Stroke({color:`rgba(0, 0, 0, 0.5)`,lineDash:[10,10],width:2}),image:new M.Circle({radius:5,stroke:new M.Stroke({color:`rgba(0, 0, 0, 0.7)`}),fill:new M.Fill({color:`rgba(255, 255, 255, 0.2)`})})}),et=/* @__PURE__ */ new WeakMap,tt=e=>{let t=et.get(e);if(t)return t;let n=new M.Style({text:new M.Text({font:`14px`,fill:new M.Fill({color:`rgba(255, 255, 255, 1)`}),backgroundFill:new M.Fill({color:`rgba(0, 0, 0, 0.7)`}),padding:[3,3,3,3],textBaseline:`bottom`,offsetY:-15}),image:new M.RegularShape({radius:8,points:3,angle:Math.PI,displacement:[0,10],fill:new M.Fill({color:`rgba(0, 0, 0, 0.7)`})})});return et.set(e,n),n},nt=(e,t=$e)=>{let n=t?[t]:[],r=e.getGeometry(),i,a;if(r.getType()===`Polygon`?(i=r.getInteriorPoint(),a=Ze(r)):r.getType()===`LineString`&&(i=new k.default(r.getLastCoordinate()),a=Qe(r)),i&&a){let t=tt(e);t.setGeometry(i),t.getText().setText(a),n.push(t)}return n},rt=(e=`Point`,t,n)=>new N.default({source:t.getSource(),type:e,style:n?e=>nt(e,void 0):void 0}),it=(e,t,n)=>{let{layerName:r}=n||{},i=Object.assign({className:r||`ol-layer`,source:new j.default({features:new P.default().readFeatures(e)}),style:t||new M.Style({stroke:new M.Stroke({color:`red`,lineDash:[10],width:3}),fill:new M.Fill({color:`rgba(0, 0, 255, 0.1)`})})},n||{});return new A.default(i)},Z=(e,t,n,r)=>t&&n?.get(e[t])||r,at=(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||pe(r);t!==`Invalid`&&i.push({type:`Feature`,properties:{...e},geometry:{type:t,coordinates:r}})}}catch(e){console.error(`创建线状数据失败:${e}`)}}),T.default.transform({type:`FeatureCollection`,features:i},r||T.default.WGS84,T.default.WGS84)},ot=(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 M.Style({stroke:new M.Stroke({width:f??c??4,color:d||Z(p,a,r,o)})}),h=new M.Style({stroke:new M.Stroke({width:c??2,color:Z(p,a,r,o)})});return n||(m.setFill(new M.Fill({color:z(l||i||``,u??s??1)||z(Z(p,a,r,i)||``,s??1)})),h.setFill(new M.Fill({color:z(Z(p,a,r,i)||``,s??1)}))),e.setProperties({activeStyle:m,unActiveStyle:h}),h},st=(e,t)=>{let n=at(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(ot(e,t))}),{features:r,acceptedData:i}},Q=(e,t)=>{let{isAutoFit:n,layerName:r,openClick:i}=t,{features:a,acceptedData:o}=st(e,t),s=new A.default({zIndex:5,className:r||`ol-layer`,source:new j.default({features:a})});return i&&X(s),s.setProperties({_isCustom:!0,_isAutoFit:n,_isVectorLayer:!0,_vectorConfig:t,_layerName:r,_dataList:o,_uuidSet:new Set(o.map(e=>e._uuid))}),s},ct=(e,t,n)=>{let r=e.getSource(),{_vectorConfig:i}=e.getProperties()||{},{features:a,acceptedData:o}=st(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])},lt=(e=[],t)=>Q(e,Object.assign({},t,{isLine:!1})),ut=(e=[],t)=>Q(e,Object.assign({},t,{isLine:!0})),dt=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 M.Style({zIndex:88+e,image:new M.Icon({width:c,height:l,src:t,anchor:[.5,1]})});let n=s(`${r}-${e}-active`,`.webp`);u[e+i]=new M.Style({zIndex:120,image:new M.Icon({width:c*a,height:l*a,anchor:[.5,1],src:n||t})})}return u},ft=(e,t=[])=>e.map(e=>{let{crsForm:n}=e,r=T.default.transform([+e.lnglat[0],+e.lnglat[1]],n||T.default.WGS84,T.default.WGS84),i=new E.Feature({geometry:new ae.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=ft(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)))},$=(e,t=[])=>{let n=new A.default({zIndex:2e3,source:new j.default({features:ft(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},mt=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||dt(e)({baseUrl:a,markerIcon:f,markerSize:m,statusNum:d||5,activeScale:h||1.3}),v=$(t,_);if(r&&(v.setProperties({_offset:i,_isAutoFit:u}),X(v)),o){let e=Q(t,Object.assign({},{key:`line`,isLine:!0,openClick:!1,strokeWeight:4,strokeColor:`rgba(29, 235, 255, 0.8)`},g||{}));R.addLayer(e)}if(s){let e=Q(t,Object.assign({},{isLine:!1,key:`faceList`,strokeWeight:1,openClick:!1,fillColor:`#4247DF`,strokeStyle:`dashed`,strokeColor:`#4247DF`},g||{}));R.addLayer(e)}return v.setProperties({_isCustom:!0,_offset:i,_hasLine:o,_hasFace:s,className:c,_layerName:c,_isVectorLayer:!0,_isDynamic:l,_massMarksStyles:_}),R.addLayer(v),v},ht=(e=[])=>{let t=new M.Style({}),n=new Set(e),r=[];return R.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},gt=(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 M.Style({image:new I.default({radius:i*20,stroke:new M.Stroke({width:2,color:`hsla(${180-i*180}, 100%, 40%, 1)`}),fill:new M.Fill({color:`hsla(${180-i*180}, 100%, 50%, 1)`})}),text:new M.Text({text:t.toString(),fill:new M.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 A.default({zIndex:200,className:u,source:new F.default({distance:i||80,minDistance:a||0,source:new j.default({features:e.map(e=>{let t=new E.Feature(new ae.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&&X(p),p};exports.GeometryType=oe,exports.activeFeatureByUid=Me,exports.addFeaturesByLayer=pt,exports.addMassMarksLayer=mt,exports.appendFeaturesByLayer=ct,exports.baseLayers=be,exports.buildMassMarksStyles=dt,exports.changeLayer=Te,exports.changeSource=H,exports.changeUnselectStyle=Ke,exports.createAnimationMarker=De,exports.createBaseLayer=V,exports.createBusinessLayer=Q,exports.createClusterLayer=gt,exports.createDrawInteraction=rt,exports.createElasticMarkerLayer=qe,exports.createGeoJsonLayer=it,exports.createIconStyle=K,exports.createLayerSelectByNames=Xe,exports.createMap=Pe,exports.createMapInstance=Ne,exports.createMapWorldLayer=ye,exports.createMarker=q,exports.createMarkersLayer=Ge,exports.createMassMarksLayer=$,exports.createMoveMarkerLayer=Je,exports.createOverlay=Oe,exports.createSelectByLayer=X,exports.createTdtVectorSource=ce,exports.createTdtVtsLayer=le,exports.createText=We,exports.createVectorFaceLayer=lt,exports.createVectorLineLayer=ut,exports.createWmtsLayer=_e,exports.createZheJiangLayer=xe,exports.disposeInstance=Ie,exports.disposeMap=Fe,exports.emitter=L,exports.flyToAnimate=Ue,exports.getDrawStyle=nt,exports.getLayerByName=Se,exports.getLayersDataList=fe,exports.getMapInstance=Le,Object.defineProperty(exports,"instance",{enumerable:!0,get:function(){return R}}),exports.removeAllLayers=Ae,exports.removeLayerByName=Ce,exports.removeOverlays=U,exports.resetActiveFeature=je,exports.resetActiveVector=ke,exports.resetMap=ze,exports.resetZoomAndCenter=Re,exports.setFitViewByCoords=Be,exports.setFitViewByGeom=Ve,exports.setFitViewByLayer=He,exports.updateMarksLayersByStatus=ht,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 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 q=require("ol/interaction/Select");q=s(q,1);let J=require("ol/interaction/Translate");J=s(J,1);let Y=require("ol/interaction/Snap");Y=s(Y,1);let X=require("ol/format/GeoJSON");X=s(X,1);let Z=require("ol/geom"),te=require("ol/source/Cluster");te=s(te,1);let ne=/* @__PURE__ */ function(e){return e.LineString=`LineString`,e.MultiLineString=`MultiLineString`,e.Polygon=`Polygon`,e.MultiPolygon=`MultiPolygon`,e.Invalid=`Invalid`,e}({});const re=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()},ie=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}},ae=async e=>{let t=await re(e.style);if(t?.version!==8||!t.sources||!Array.isArray(t.layers))throw TypeError(`style 必须是 Style v8 对象或其 JSON 地址`);let{source:n}=ie({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}},oe=(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),oe.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`),oe.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,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}`);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=()=>{let t=[.../* @__PURE__ */ new Set([...o.values(),...[...s.values()].map(({action:e})=>e)])];e.setRouteControls(e.getMode()===`control`?t.filter(e=>e!==`waypoint`):[]),e.setActiveControls(t)},d=(e,t)=>{try{t.hasPointerCapture(e)&&t.releasePointerCapture(e)}catch{}},f=()=>{o.clear();let e=[...s.entries()];s.clear();for(let[t,{button:n}]of e)d(t,n);u()},p=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}},m=e=>!!e&&(!!n?.contains(e)||!!r?.contains(e))&&!e.closest(`input, textarea, select, a, [contenteditable]:not([contenteditable="false"])`),h=t=>{e.getMode()===`edit`&&mt(t)?e.adjustWaypointHeight(t===`ascend`?1:-1):e.getMode()===`control`&&t===`waypoint`&&e.addRouteWaypoint()},g=e=>{if(!m(i.activeElement)||i.hidden)return;if(e.ctrlKey||e.altKey||e.metaKey||e.isComposing){f();return}let n=p(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||r?.contains(c)&&e.code!==`Space`&&e.code!==`Enter`)&&(e.preventDefault(),!(e.repeat||o.has(e.code))&&(o.set(e.code,s),u(),h(s)))},_=e=>{o.delete(e.code)&&(e.preventDefault(),u())},v=e=>{if(e.button!==0||i.hidden)return;let t=p(e.target);if(t){e.preventDefault(),t.button.focus({preventScroll:!0}),s.set(e.pointerId,t);try{t.button.setPointerCapture(e.pointerId)}catch{}u()}},y=e=>{let t=s.get(e.pointerId);t&&(s.delete(e.pointerId),d(e.pointerId,t.button),u())},b=e=>{let t=p(e.target);t&&!i.hidden&&h(t.action)},x=()=>{m(i.activeElement)||f()},S=e=>{m(e.relatedTarget)||f()},C=()=>{i.hidden&&f()};return i.addEventListener(`keydown`,g),i.addEventListener(`keyup`,_,!0),i.addEventListener(`focusin`,x),i.addEventListener(`focusout`,S),i.addEventListener(`visibilitychange`,C),i.addEventListener(`pointerup`,y),i.addEventListener(`pointercancel`,y),a.addEventListener(`blur`,f),r?.addEventListener(`pointerdown`,v),r?.addEventListener(`lostpointercapture`,y),r?.addEventListener(`click`,b),()=>{i.removeEventListener(`keydown`,g),i.removeEventListener(`keyup`,_,!0),i.removeEventListener(`focusin`,x),i.removeEventListener(`focusout`,S),i.removeEventListener(`visibilitychange`,C),i.removeEventListener(`pointerup`,y),i.removeEventListener(`pointercancel`,y),a.removeEventListener(`blur`,f),r?.removeEventListener(`pointerdown`,v),r?.removeEventListener(`lostpointercapture`,y),r?.removeEventListener(`click`,b),f(),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,getTakeoff:c,isDestroyed:l,isEditing:u,getEditConfig:d,syncPath:f})=>{let p,m,h=()=>{let e=m;m=void 0,p=void 0,e?.()};return{get select(){return p},clearEditing:h,updateEditing:()=>{if(h(),l()||m)return;let g=e.getMap();if(!u()||!g||!e.getActive())return;let _=d(),v=new F.default,y=new P.default({...i,source:v,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}),b=()=>{y.setVisible(t.getVisible()),v.clear(),_.mode===`snap`?E():r.slice(1).forEach((e,t)=>{let n=r[t].getGeometry().getCoordinates(),i=e.getGeometry().getCoordinates();v.addFeature(new M.default({geometry:new N.default([(n[0]+i[0])/2,(n[1]+i[1])/2]),insertIndex:t+1}))})},x=new q.default({layers:[t],filter:e=>e!==c()&&r.includes(e),hitTolerance:6});p=x;let S=new J.default({condition:j.primaryAction,filter:e=>e!==c()&&(r.includes(e)||v.hasFeature(e)),hitTolerance:6}),C=new K.default,w=_.mode===`snap`?new Y.default({features:C,pixelTolerance:_.pixelTolerance}):void 0;w?.on(`snap`,e=>{if(T||!t.getVisible())return;let n=e.feature.get(`insertIndex`);if(!e.segment||typeof n!=`number`){v.clear();return}let r=v.getFeatures()[0];r||(r=new M.default(new N.default(e.vertex)),v.addFeature(r)),r.set(`insertIndex`,n),r.getGeometry().setCoordinates(e.vertex)}),w?.on(`unsnap`,()=>{T||v.clear()});let T,E=()=>{C.clear(),!T&&t.getVisible()&&r.forEach((e,t)=>{C.push(new M.default(e.getGeometry().clone())),t>0&&C.push(new M.default({geometry:new ee.default([r[t-1].getGeometry().getCoordinates(),e.getGeometry().getCoordinates()]),insertIndex:t}))})};if(w){let e=w.handleEvent.bind(w);w.handleEvent=t=>{let n=e(t);return t.type===`pointerdown`&&!T&&v.getFeatures().length&&g.renderSync(),n}}let D=()=>{if(!T)return;let e=T;T=void 0,!l()&&(e.inserted?(r.splice(r.indexOf(e.point),1),n.removeFeature(e.point)):e.point.getGeometry().setCoordinates(e.coordinate),f(),b())};S.on(`translatestart`,e=>{let t=e.features.item(0);T={point:t,coordinate:t.getGeometry().getCoordinates(),insertIndex:t.get(`insertIndex`),inserted:!1,moved:!1},C.clear()}),S.on(`translating`,e=>{let t=T;if(t&&(t.moved=!0,w&&t.point.getGeometry().setCoordinates(e.coordinate),T===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),T!==t)return}f(),T===t&&b()}}),S.on(`translateend`,()=>{if(!T)return;let{point:t,moved:n}=T,i=t.getGeometry().getCoordinates();n&&r.some(e=>{let n=e.getGeometry().getCoordinates();return e!==t&&n[0]===i[0]&&n[1]===i[1]})?(D(),s?.(i.slice())):(T=void 0,b(),n&&e.changed())}),x.on(`select`,()=>e.changed());let O=()=>{x.getFeatures().clear(),D(),t.un(`change:visible`,b),g.removeInteraction(S),g.removeInteraction(x),w&&(g.removeInteraction(w),w.dispose()),C.clear(),S.dispose(),x.dispose(),y.setMap(null),y.clearRenderer(),y.setSource(null),v.clear(),v.dispose()};m=O,t.on(`change:visible`,b),b(),y.setMap(g),m===O&&(g.addInteraction(x),m===O&&(g.addInteraction(S),m===O&&w&&g.addInteraction(w)))}}},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,input:f,speed:p=10,turnSpeed:m=60,verticalSpeed:h=1,...g}=e,_=bt(u);if([p,m,h].some(e=>!Number.isFinite(e)||e<=0))throw Error(`飞行速度、转向速度和升降速度必须为有限正数`);if(!n)throw Error(`请先创建地图实例或通过 config.map 指定地图`);let v=new F.default,y=new P.default({...g,className:r||`ol-layer`,source:v,style:i});y.set(`_layerName`,r);let b=new ee.default([]),x=new M.default(b);x.setStyle(o);let S,C,w=[],T=!1,E=0,D=0,O=`idle`,k=[],A,j,I=0,L=/* @__PURE__ */ new Set,R=e=>{I++;try{return e()}finally{I--,!I&&!T&&q.changed()}},B=()=>{if(!(I||T))for(let e of[...L]){if(T)break;L.has(e)&&e(X.getState())}},V=()=>{let e=A;A=void 0,e?.(),k=[]},H=()=>{V(),!T&&q.getMap()&&q.getActive()&&(f?.keyboard||f?.container!==void 0)&&(A=ht({getMode:()=>O,getTarget:()=>n.getTargetElement()??void 0,setRouteControls:e=>X.setRouteControls(e),addRouteWaypoint:()=>X.addRouteWaypoint(),adjustWaypointHeight:e=>X.adjustWaypointHeight(e),setActiveControls:e=>{k=[...e],B()}},{...f}))},U=()=>{V(),j?.(),j=void 0,J.stopRouteControl(),Y.clearEditing()},W=e=>b.getCoordinates().findIndex(t=>t[0]===e[0]&&t[1]===e[1]),G=e=>{if(W(e)!==-1){d?.(e.slice());return}let t=E;if(b.appendCoordinate(e),T||t!==E)return;let n=new M.default({uuid:_t(),geometry:new N.default(e),extData:{height:J.aircraft?.get(`height`)??C?.get(`extData`)?.height??0},isTakeoff:b.getCoordinates().length===1,isAircraft:!J.aircraft,heading:J.heading});n.setStyle(n.get(`isTakeoff`)?a:s),C?.set(`isAircraft`,!1,!0),C=n,S||=n,w.push(n),v.addFeature(n),!(T||t!==E)&&(b.getCoordinates().length===2&&v.addFeature(x),q.changed())},K=()=>{if(T)return;let e=E;S=w[0],C=w.at(-1);for(let t of w){let n=t===S;if(t.get(`isTakeoff`)!==n&&t.setStyle(n?a:s),T||e!==E||(t.setProperties({isTakeoff:n,isAircraft:t===C}),T||e!==E))return}b.setCoordinates(w.map(e=>e.getGeometry().getCoordinates())),!(T||e!==E)&&(w.length>1&&!v.hasFeature(x)&&v.addFeature(x),w.length<2&&v.hasFeature(x)&&v.removeFeature(x))},q=new z.default({handleEvent(e){if(T||!q.getActive()||e.type!==`singleclick`||O!==`draw`&&O!==`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=O===`takeoff`,r=W(t);return r!==-1&&(!n||r>0)?(d?.(t.slice()),!1):(R(()=>{let e=E,r=D;if(n&&S){let n=b.getCoordinates();if(n[0]=t,b.setCoordinates(n),T||e!==E)return;S.getGeometry().setCoordinates(t)}else G(t);n&&!T&&e===E&&r===D&&X.setMode(`idle`)}),!1)}}),J=ft({speed:p,turnSpeed:m,verticalSpeed:h,interaction:q,geometry:b,vectorLayer:y,aircraftStyle:c,getLastWaypoint:()=>C,isDestroyed:()=>T}),Y=xt({interaction:q,vectorLayer:y,source:v,points:w,layerOptions:g,midpointStyle:l,pointStyle:s,onDuplicate:d,getTakeoff:()=>S,isDestroyed:()=>T,isEditing:()=>O===`edit`,getEditConfig:()=>_,syncPath:K});q.on(`change`,B),q.on(`change:active`,()=>{!q.getActive()&&!T&&X.setMode(`idle`)});let X=Object.assign(q,{getState(){let e=Y.select?.getFeatures().item(0),t=J.aircraft,n=t?.getGeometry().getCoordinates();return{mode:O,hasTakeoff:!!S,waypointCount:w.length,selectedWaypoint:e?{...vt([e])[0],indexNo:w.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:[...k],editConfig:{..._}}},subscribe(e){if(T)throw Error(`航线已销毁`);L.add(e);try{e(X.getState())}catch(t){throw L.delete(e),t}return()=>{L.delete(e)}},setMode(e){if(T)throw Error(`航线已销毁`);if(![`idle`,`takeoff`,`draw`,`control`,`edit`].includes(e))throw Error(`不支持的航线模式`);if([`draw`,`control`,`edit`].includes(e)&&!S)throw Error(`请先设置起飞点`);if(e!==O){if(e!==`idle`&&q.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`)}R(()=>{let t=++D,r=()=>T||t!==D,i=O;if(U(),!r()&&(O=e,e!==`idle`&&z.default.prototype.setActive.call(q,!0),!r()))try{if(e===`control`){let e=J.startRouteControl();if(r())return;e.on(`change`,B),j=()=>e.un(`change`,B)}if(Y.updateEditing(),r()||(H(),r()))return;f?.keyboard&&e!==`idle`&&n.getTargetElement()?.focus({preventScroll:!0})}catch(e){throw r()||(U(),r())||(O=i===`control`?`idle`:i,Y.updateEditing(),H()),e}})}},setEditConfig(e){if(T)throw Error(`航线已销毁`);let t=bt(e,_);R(()=>{_=t,O===`edit`&&Y.updateEditing()})},clear(){X.importWaypoints([])},exportWaypoints(){return vt(w)},importWaypoints(e){if(T)throw Error(`航线已销毁,请创建新的 Route`);let t=yt(e,{takeoffStyle:a,pointStyle:s});R(()=>{++D;let e=++E,n=()=>T||e!==E;if(U(),!n()&&(O=O===`edit`&&t.length?`edit`:`idle`,w.length=0,S=void 0,C=void 0,v.clear(!0),!n())){for(let e of t)w.push(e);S=w[0],C=w.at(-1),b.setCoordinates(w.map(e=>e.getGeometry().getCoordinates())),!n()&&(v.addFeatures(w.length>1?[...w,x]:w),!n()&&(Y.updateEditing(),n()||H()))}})},destroy(){T||(T=!0,++D,O=`idle`,L.clear(),U(),n.un(`change:target`,Z),n.un(`change:view`,Z),q.getMap()?.removeInteraction(q),z.default.prototype.setMap.call(q,null),q.setActive(!1),w.length=0,S=void 0,C=void 0,b.setCoordinates([]),n.removeLayer(y),y.clearRenderer(),y.setSource(null),v.clear(!0),v.dispose(),q.dispose())},setMap(e){if(T)e?.removeInteraction(q);else{if(e&&e!==n)throw Error(`航线不能迁移到其他地图`);e!==q.getMap()&&R(()=>{++D,U(),O=`idle`,z.default.prototype.setMap.call(q,e),H()})}},setActive(e){z.default.prototype.setActive.call(q,e&&!T)},getSelectedWaypoint(){return Y.select?.getFeatures().item(0)},adjustWaypointHeight(e,t=Y.select?.getFeatures().item(0)){if(!Number.isFinite(e))throw Error(`高度变化必须为有限数值`);if(T||O!==`edit`||!q.getActive()||!t||!w.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}),!T&&w.includes(t)&&q.changed(),!0)},removeWaypoint(e=Y.select?.getFeatures().item(0)){return!Y.select||!e||e===S||!w.includes(e)?!1:(Y.clearEditing(),w.includes(e)?(w.splice(w.indexOf(e),1),v.removeFeature(e),K(),Y.updateEditing(),q.changed(),!0):(Y.updateEditing(),q.changed(),!1))},getLayer(){return y},hasTakeoff(){return!!S},setRouteControls(e){J.setRouteControls(e)},addRouteWaypoint(){J.aircraft&&q.getActive()&&G(J.aircraft.getGeometry().getCoordinates())}}),Z=()=>{T||R(()=>{++D,U(),O=`idle`,H()})};try{n.addLayer(y),n.addInteraction(X),n.on(`change:target`,Z),n.on(`change:view`,Z),H()}catch(e){throw X.destroy(),e}return X},Ct=(e,t,n)=>{let{layerName:r}=n||{},i=Object.assign({className:r||`ol-layer`,source:new F.default({features:new X.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 Z.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 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 te.default({distance:i||80,minDistance:a||0,source:new F.default({features:e.map(e=>{let t=new O.Feature(new Z.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=ne,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=ie,exports.createTdtVtsLayer=ae,exports.createText=qe,exports.createVectorFaceLayer=At,exports.createVectorLineLayer=jt,exports.createWmtsLayer=he,exports.createZheJiangLayer=xe,exports.disposeInstance=Re,exports.disposeMap=Le,exports.emitter=oe,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
|
@@ -5,6 +5,8 @@ import { CRSTypes } from "gcoord";
|
|
|
5
5
|
import { Source, WMTS, XYZ } from "ol/source";
|
|
6
6
|
import { Coordinate } from "ol/coordinate";
|
|
7
7
|
import Feature$1, { FeatureLike } from "ol/Feature";
|
|
8
|
+
import { StyleLike } from "ol/style/Style";
|
|
9
|
+
import { FlatStyleLike } from "ol/style/flat";
|
|
8
10
|
import { NormalizeStats, RestoreMode, TdtDecoderWorkerClient, TdtDecoderWorkerClientOptions } from "tdt-vts-core";
|
|
9
11
|
import VectorTileLayer from "ol/layer/VectorTile";
|
|
10
12
|
import VectorTileSource from "ol/source/VectorTile";
|
|
@@ -20,11 +22,11 @@ import { AnimationOptions, FitOptions } from "ol/View";
|
|
|
20
22
|
import { Select } from "ol/interaction";
|
|
21
23
|
import Geometry, { Type } from "ol/geom/Geometry";
|
|
22
24
|
import Draw from "ol/interaction/Draw";
|
|
25
|
+
import Map$2 from "ol/Map";
|
|
26
|
+
import Point$1 from "ol/geom/Point";
|
|
27
|
+
import Interaction from "ol/interaction/Interaction";
|
|
23
28
|
import VectorSource from "ol/source/Vector";
|
|
24
|
-
import { FlatStyleLike } from "ol/style/flat";
|
|
25
|
-
import { StyleLike } from "ol/style/Style";
|
|
26
29
|
import Collection from "ol/Collection";
|
|
27
|
-
import Point$1 from "ol/geom/Point";
|
|
28
30
|
import Cluster from "ol/source/Cluster";
|
|
29
31
|
export * from "tdt-vts-core";
|
|
30
32
|
//#region src/core/types.d.ts
|
|
@@ -151,6 +153,94 @@ export interface ElasticDataItemConfig extends DataItemConfig {
|
|
|
151
153
|
smallImg: string;
|
|
152
154
|
largeImg: string;
|
|
153
155
|
}
|
|
156
|
+
/** 导入、导出的航点数据,经纬度采用 EPSG:4326。 */
|
|
157
|
+
export interface RouteWaypoint {
|
|
158
|
+
/** 其他业务属性,导入保存到 extData,导出原样带回。 */
|
|
159
|
+
[key: string]: unknown;
|
|
160
|
+
/** 稳定的航点标识;导入可省略并自动生成,导出始终携带。 */
|
|
161
|
+
uuid?: string;
|
|
162
|
+
/** 航线 ID,允许空字符串。 */
|
|
163
|
+
waylineId?: string;
|
|
164
|
+
/** 导入按序号稳定升序排列;导出按当前航线顺序从 0 连续编号。 */
|
|
165
|
+
indexNo: number;
|
|
166
|
+
/** 航点速度(m/s),仅保存为业务属性。 */
|
|
167
|
+
pointSpeed?: number;
|
|
168
|
+
/** 航点高度(米),有限非负数,默认 0;不改变二维地图坐标。 */
|
|
169
|
+
height?: number;
|
|
170
|
+
/** 云台俯仰角,保留业务接口的字段拼写。 */
|
|
171
|
+
gimbalPichAngle?: number;
|
|
172
|
+
/** 航向角(度);缺省时朝正北。 */
|
|
173
|
+
direction?: number;
|
|
174
|
+
/** 拍照模式,允许空字符串。 */
|
|
175
|
+
shootType?: '' | 'time' | 'distance' | 'none';
|
|
176
|
+
/** ir / visable,多个值以逗号分隔;允许空字符串。 */
|
|
177
|
+
supportLightType?: string;
|
|
178
|
+
longitude: number;
|
|
179
|
+
latitude: number;
|
|
180
|
+
}
|
|
181
|
+
/** 航线编辑配置;中点编辑与整线吸附编辑互斥,不影响飞行操控。 */
|
|
182
|
+
export type RouteEditConfig = {
|
|
183
|
+
/** midpoint 显示固定中点;snap 沿整条线定位临时编辑点;默认 midpoint。 */
|
|
184
|
+
mode?: 'midpoint' | 'snap';
|
|
185
|
+
/** 吸附编辑时鼠标靠近航线的像素容差,有限正数,默认 10。 */
|
|
186
|
+
pixelTolerance?: number;
|
|
187
|
+
};
|
|
188
|
+
/** 航线互斥操作模式;创建与停止时为 idle。 */
|
|
189
|
+
export type RouteMode = 'idle' | 'takeoff' | 'draw' | 'control' | 'edit';
|
|
190
|
+
export type RouteInputAction = RouteControl | 'waypoint';
|
|
191
|
+
/** 输入显式启用;面板使用 data-route-control 声明动作。 */
|
|
192
|
+
export type RouteInputConfig = {
|
|
193
|
+
keyboard?: boolean;
|
|
194
|
+
/** 业务操作区 DOM 或容器 ID(不带 #);绑定前须已存在。 */
|
|
195
|
+
container?: HTMLElement | string;
|
|
196
|
+
};
|
|
197
|
+
/** 可直接用于界面展示的状态,不暴露地图要素。 */
|
|
198
|
+
export type RouteState = {
|
|
199
|
+
mode: RouteMode;
|
|
200
|
+
hasTakeoff: boolean;
|
|
201
|
+
waypointCount: number;
|
|
202
|
+
selectedWaypoint: RouteWaypoint | null;
|
|
203
|
+
aircraft: {
|
|
204
|
+
longitude: number;
|
|
205
|
+
latitude: number;
|
|
206
|
+
heading: number;
|
|
207
|
+
height: number;
|
|
208
|
+
speed: number;
|
|
209
|
+
} | null;
|
|
210
|
+
activeControls: readonly RouteInputAction[];
|
|
211
|
+
editConfig: Required<RouteEditConfig>;
|
|
212
|
+
};
|
|
213
|
+
/** 航点交互的自建图层与样式配置。 */
|
|
214
|
+
export type RouteConfig = Partial<LayerConfig> & {
|
|
215
|
+
/** 初始编辑配置,可通过 setEditConfig 更新。 */
|
|
216
|
+
edit?: RouteEditConfig;
|
|
217
|
+
/** 可选键盘与自定义面板输入,自动跟随模式与生命周期。 */
|
|
218
|
+
input?: RouteInputConfig;
|
|
219
|
+
/** 地面移动速度,单位米/秒,有限正数,默认 10。 */
|
|
220
|
+
speed?: number;
|
|
221
|
+
/** 机头转向速度,单位度/秒,有限正数,默认 60。 */
|
|
222
|
+
turnSpeed?: number;
|
|
223
|
+
/** 升降速度,单位米/秒,有限正数,默认 1。 */
|
|
224
|
+
verticalSpeed?: number;
|
|
225
|
+
/** 航线所属地图;省略时使用 createMapInstance() 创建的默认实例。 */
|
|
226
|
+
map?: Map$1;
|
|
227
|
+
/** 航点和连线样式;省略时使用内置航线样式,null 隐藏。 */
|
|
228
|
+
style?: StyleLike | FlatStyleLike | null;
|
|
229
|
+
/** 起飞点样式;省略时继承整体 style。 */
|
|
230
|
+
takeoffStyle?: StyleLike;
|
|
231
|
+
/** 航线样式;省略时继承整体 style。 */
|
|
232
|
+
lineStyle?: StyleLike;
|
|
233
|
+
/** 普通航点样式;省略时继承整体 style。 */
|
|
234
|
+
pointStyle?: StyleLike;
|
|
235
|
+
/** 实时飞行器样式;函数可根据 Feature 的 heading(度)设置旋转。 */
|
|
236
|
+
aircraftStyle?: StyleLike;
|
|
237
|
+
/** 编辑模式下可拖动的线段中点样式。 */
|
|
238
|
+
midpointStyle?: StyleLike;
|
|
239
|
+
/** 重复位置被拒绝时调用,参数为 EPSG:4326 经纬度副本。 */
|
|
240
|
+
onDuplicate?: (coordinate: Coordinate) => void;
|
|
241
|
+
};
|
|
242
|
+
/** 飞行操控动作,与键盘或面板输入无关。 */
|
|
243
|
+
export type RouteControl = 'forward' | 'backward' | 'left' | 'right' | 'turnLeft' | 'turnRight' | 'ascend' | 'descend';
|
|
154
244
|
//#endregion
|
|
155
245
|
//#region src/tdt-vts/source.d.ts
|
|
156
246
|
interface SourceDiagnostics {
|
|
@@ -330,6 +420,49 @@ export declare const getDrawStyle: (feature: FeatureLike, drawStyle?: Style | un
|
|
|
330
420
|
/** 创建绘制交互。 */
|
|
331
421
|
export declare const createDrawInteraction: (type: Type | undefined, vectorLayer: VectorLayer, openTip?: boolean) => Draw;
|
|
332
422
|
//#endregion
|
|
423
|
+
//#region src/interaction/route.d.ts
|
|
424
|
+
/** 仅支持 EPSG:4326 经纬度;设置起飞点或导入航点后可追加与操控,停止后保留结果。 */
|
|
425
|
+
export declare const createRouteController: (config?: RouteConfig) => Interaction & {
|
|
426
|
+
/** 获取轻量状态快照;不逐帧导出整条航线。 */
|
|
427
|
+
getState(): RouteState;
|
|
428
|
+
/** 立即提供快照,返回取消订阅函数;销毁时自动解除全部订阅。 */
|
|
429
|
+
subscribe(listener: (state: RouteState) => void): () => void;
|
|
430
|
+
/** 统一切换操作模式;先校验,再清理旧操作,重复设置保持当前会话。 */
|
|
431
|
+
setMode(next: RouteMode): void;
|
|
432
|
+
/** 更新编辑配置;校验失败保留配置、选择和拖动。 */
|
|
433
|
+
setEditConfig(options: RouteEditConfig): void;
|
|
434
|
+
/** 清空航线并回到空闲,保留输入与样式配置,实例可以继续使用。 */
|
|
435
|
+
clear(): void;
|
|
436
|
+
/** 导出当前点位与业务字段的副本,indexNo 从 0 连续编号;空航线返回空数组。 */
|
|
437
|
+
exportWaypoints(): RouteWaypoint[];
|
|
438
|
+
/** 按 indexNo 升序替换整条航线;首点为起飞点,空数组清空,校验失败保留原数据。 */
|
|
439
|
+
importWaypoints(waypoints: readonly RouteWaypoint[]): void;
|
|
440
|
+
/** 永久销毁本航线:清空点线、移除图层与交互,释放编辑、飞控和监听;可重复调用。 */
|
|
441
|
+
destroy(): void;
|
|
442
|
+
setMap(nextMap: Map$2 | null): void;
|
|
443
|
+
setActive(active: boolean): void;
|
|
444
|
+
/** 获取编辑模式下点击选中的航点。 */
|
|
445
|
+
getSelectedWaypoint(): Feature$1<Point$1> | undefined;
|
|
446
|
+
/** 编辑模式调整指定航点高度(米),省略时使用选中点;最低 0,不改变二维位置。 */
|
|
447
|
+
adjustWaypointHeight(delta: number, point?: Feature$1<Point$1, {
|
|
448
|
+
[x: string]: any;
|
|
449
|
+
}> | undefined): boolean;
|
|
450
|
+
/** 删除指定普通航点,省略参数时删除选中点;起飞点、非编辑状态或其他航线的点返回 false。 */
|
|
451
|
+
removeWaypoint(point?: Feature$1<Point$1> | undefined): boolean;
|
|
452
|
+
/** 获取自动创建的航线图层;移除交互后图层和结果仍保留。 */
|
|
453
|
+
getLayer(): VectorLayer<VectorSource<Feature$1<import("ol/geom").Geometry, {
|
|
454
|
+
[x: string]: any;
|
|
455
|
+
}>>, Feature$1<import("ol/geom").Geometry, {
|
|
456
|
+
[x: string]: any;
|
|
457
|
+
}>>;
|
|
458
|
+
/** 当前航线是否已经通过地图点击或导入设置起飞点。 */
|
|
459
|
+
hasTakeoff(): boolean;
|
|
460
|
+
/** 替换完整动作集合;空集合停止运动。输入监听由可选 input 配置托管。 */
|
|
461
|
+
setRouteControls(next: readonly RouteControl[]): void;
|
|
462
|
+
/** 在当前飞行位置追加航点;重复位置或未开启操控时不产生数据。 */
|
|
463
|
+
addRouteWaypoint(): void;
|
|
464
|
+
};
|
|
465
|
+
//#endregion
|
|
333
466
|
//#region src/layer/geojson-layer.d.ts
|
|
334
467
|
/** 直接从 GeoJSON 创建矢量图层。 */
|
|
335
468
|
export declare const createGeoJsonLayer: (geoJson: any, style: StyleLike | FlatStyleLike | null | undefined, config?: LayerConfig) => VectorLayer<VectorSource<import("ol").Feature<import("ol/geom").Geometry, {
|
|
@@ -466,6 +599,12 @@ export declare const addMassMarksLayer: (getImgUrlFn: GetImgUrlFn) => (dataList:
|
|
|
466
599
|
* @param checkedStatusList
|
|
467
600
|
*/
|
|
468
601
|
export declare const updateMarksLayersByStatus: (checkedStatusList?: string[]) => MassData[];
|
|
602
|
+
/**
|
|
603
|
+
*
|
|
604
|
+
* @param layerName
|
|
605
|
+
* @param visibleIdSet
|
|
606
|
+
*/
|
|
607
|
+
export declare const changeFeaturesVisibleByIds: (layerName: string, visibleIdSet: Set<string>) => void;
|
|
469
608
|
//#endregion
|
|
470
609
|
//#region src/layer/cluster-layer.d.ts
|
|
471
610
|
/**
|
package/dist/index.d.mts
CHANGED
|
@@ -7,9 +7,10 @@ import TileLayer from "ol/layer/Tile";
|
|
|
7
7
|
import { Layer, Tile } from "ol/layer";
|
|
8
8
|
import VectorImageLayer from "ol/layer/Image";
|
|
9
9
|
import RasterSource from "ol/source/Raster";
|
|
10
|
+
import Map$1 from "ol/Map";
|
|
10
11
|
import { AnimationOptions, FitOptions } from "ol/View";
|
|
11
12
|
import { CRSTypes } from "gcoord";
|
|
12
|
-
import { Feature, Map as Map$
|
|
13
|
+
import { Feature, Map as Map$2, Overlay } from "ol";
|
|
13
14
|
import { Select } from "ol/interaction";
|
|
14
15
|
import Feature$1, { FeatureLike } from "ol/Feature";
|
|
15
16
|
import Point from "ol/geom/Point";
|
|
@@ -17,18 +18,19 @@ import VectorLayer from "ol/layer/Vector";
|
|
|
17
18
|
import VectorSource from "ol/source/Vector";
|
|
18
19
|
import { Style, Text } from "ol/style";
|
|
19
20
|
import Draw from "ol/interaction/Draw";
|
|
21
|
+
import Interaction from "ol/interaction/Interaction";
|
|
22
|
+
import { StyleLike } from "ol/style/Style";
|
|
23
|
+
import Collection from "ol/Collection";
|
|
20
24
|
import { Point as Point$1, SimpleGeometry } from "ol/geom";
|
|
21
25
|
import Cluster from "ol/source/Cluster";
|
|
22
26
|
import { Coordinate } from "ol/coordinate";
|
|
27
|
+
import { FlatStyleLike } from "ol/style/flat";
|
|
23
28
|
import Layer$1 from "ol/layer/Layer";
|
|
24
29
|
import { Options } from "ol/Overlay";
|
|
25
30
|
import Geometry, { Type } from "ol/geom/Geometry";
|
|
26
|
-
import { FlatStyleLike } from "ol/style/flat";
|
|
27
|
-
import { StyleLike } from "ol/style/Style";
|
|
28
|
-
import Collection from "ol/Collection";
|
|
29
31
|
export * from "tdt-vts-core";
|
|
30
32
|
//#region src/core/types.d.ts
|
|
31
|
-
export interface CustomMap extends Map$
|
|
33
|
+
export interface CustomMap extends Map$2 {
|
|
32
34
|
activeBaseLayer?: string;
|
|
33
35
|
changeBaseLayer?: () => void;
|
|
34
36
|
removeLayerByName?: (name: string) => void;
|
|
@@ -151,6 +153,94 @@ export interface ElasticDataItemConfig extends DataItemConfig {
|
|
|
151
153
|
smallImg: string;
|
|
152
154
|
largeImg: string;
|
|
153
155
|
}
|
|
156
|
+
/** 导入、导出的航点数据,经纬度采用 EPSG:4326。 */
|
|
157
|
+
export interface RouteWaypoint {
|
|
158
|
+
/** 其他业务属性,导入保存到 extData,导出原样带回。 */
|
|
159
|
+
[key: string]: unknown;
|
|
160
|
+
/** 稳定的航点标识;导入可省略并自动生成,导出始终携带。 */
|
|
161
|
+
uuid?: string;
|
|
162
|
+
/** 航线 ID,允许空字符串。 */
|
|
163
|
+
waylineId?: string;
|
|
164
|
+
/** 导入按序号稳定升序排列;导出按当前航线顺序从 0 连续编号。 */
|
|
165
|
+
indexNo: number;
|
|
166
|
+
/** 航点速度(m/s),仅保存为业务属性。 */
|
|
167
|
+
pointSpeed?: number;
|
|
168
|
+
/** 航点高度(米),有限非负数,默认 0;不改变二维地图坐标。 */
|
|
169
|
+
height?: number;
|
|
170
|
+
/** 云台俯仰角,保留业务接口的字段拼写。 */
|
|
171
|
+
gimbalPichAngle?: number;
|
|
172
|
+
/** 航向角(度);缺省时朝正北。 */
|
|
173
|
+
direction?: number;
|
|
174
|
+
/** 拍照模式,允许空字符串。 */
|
|
175
|
+
shootType?: '' | 'time' | 'distance' | 'none';
|
|
176
|
+
/** ir / visable,多个值以逗号分隔;允许空字符串。 */
|
|
177
|
+
supportLightType?: string;
|
|
178
|
+
longitude: number;
|
|
179
|
+
latitude: number;
|
|
180
|
+
}
|
|
181
|
+
/** 航线编辑配置;中点编辑与整线吸附编辑互斥,不影响飞行操控。 */
|
|
182
|
+
export type RouteEditConfig = {
|
|
183
|
+
/** midpoint 显示固定中点;snap 沿整条线定位临时编辑点;默认 midpoint。 */
|
|
184
|
+
mode?: 'midpoint' | 'snap';
|
|
185
|
+
/** 吸附编辑时鼠标靠近航线的像素容差,有限正数,默认 10。 */
|
|
186
|
+
pixelTolerance?: number;
|
|
187
|
+
};
|
|
188
|
+
/** 航线互斥操作模式;创建与停止时为 idle。 */
|
|
189
|
+
export type RouteMode = 'idle' | 'takeoff' | 'draw' | 'control' | 'edit';
|
|
190
|
+
export type RouteInputAction = RouteControl | 'waypoint';
|
|
191
|
+
/** 输入显式启用;面板使用 data-route-control 声明动作。 */
|
|
192
|
+
export type RouteInputConfig = {
|
|
193
|
+
keyboard?: boolean;
|
|
194
|
+
/** 业务操作区 DOM 或容器 ID(不带 #);绑定前须已存在。 */
|
|
195
|
+
container?: HTMLElement | string;
|
|
196
|
+
};
|
|
197
|
+
/** 可直接用于界面展示的状态,不暴露地图要素。 */
|
|
198
|
+
export type RouteState = {
|
|
199
|
+
mode: RouteMode;
|
|
200
|
+
hasTakeoff: boolean;
|
|
201
|
+
waypointCount: number;
|
|
202
|
+
selectedWaypoint: RouteWaypoint | null;
|
|
203
|
+
aircraft: {
|
|
204
|
+
longitude: number;
|
|
205
|
+
latitude: number;
|
|
206
|
+
heading: number;
|
|
207
|
+
height: number;
|
|
208
|
+
speed: number;
|
|
209
|
+
} | null;
|
|
210
|
+
activeControls: readonly RouteInputAction[];
|
|
211
|
+
editConfig: Required<RouteEditConfig>;
|
|
212
|
+
};
|
|
213
|
+
/** 航点交互的自建图层与样式配置。 */
|
|
214
|
+
export type RouteConfig = Partial<LayerConfig> & {
|
|
215
|
+
/** 初始编辑配置,可通过 setEditConfig 更新。 */
|
|
216
|
+
edit?: RouteEditConfig;
|
|
217
|
+
/** 可选键盘与自定义面板输入,自动跟随模式与生命周期。 */
|
|
218
|
+
input?: RouteInputConfig;
|
|
219
|
+
/** 地面移动速度,单位米/秒,有限正数,默认 10。 */
|
|
220
|
+
speed?: number;
|
|
221
|
+
/** 机头转向速度,单位度/秒,有限正数,默认 60。 */
|
|
222
|
+
turnSpeed?: number;
|
|
223
|
+
/** 升降速度,单位米/秒,有限正数,默认 1。 */
|
|
224
|
+
verticalSpeed?: number;
|
|
225
|
+
/** 航线所属地图;省略时使用 createMapInstance() 创建的默认实例。 */
|
|
226
|
+
map?: Map$2;
|
|
227
|
+
/** 航点和连线样式;省略时使用内置航线样式,null 隐藏。 */
|
|
228
|
+
style?: StyleLike | FlatStyleLike | null;
|
|
229
|
+
/** 起飞点样式;省略时继承整体 style。 */
|
|
230
|
+
takeoffStyle?: StyleLike;
|
|
231
|
+
/** 航线样式;省略时继承整体 style。 */
|
|
232
|
+
lineStyle?: StyleLike;
|
|
233
|
+
/** 普通航点样式;省略时继承整体 style。 */
|
|
234
|
+
pointStyle?: StyleLike;
|
|
235
|
+
/** 实时飞行器样式;函数可根据 Feature 的 heading(度)设置旋转。 */
|
|
236
|
+
aircraftStyle?: StyleLike;
|
|
237
|
+
/** 编辑模式下可拖动的线段中点样式。 */
|
|
238
|
+
midpointStyle?: StyleLike;
|
|
239
|
+
/** 重复位置被拒绝时调用,参数为 EPSG:4326 经纬度副本。 */
|
|
240
|
+
onDuplicate?: (coordinate: Coordinate) => void;
|
|
241
|
+
};
|
|
242
|
+
/** 飞行操控动作,与键盘或面板输入无关。 */
|
|
243
|
+
export type RouteControl = 'forward' | 'backward' | 'left' | 'right' | 'turnLeft' | 'turnRight' | 'ascend' | 'descend';
|
|
154
244
|
//#endregion
|
|
155
245
|
//#region src/tdt-vts/source.d.ts
|
|
156
246
|
interface SourceDiagnostics {
|
|
@@ -330,6 +420,49 @@ export declare const getDrawStyle: (feature: FeatureLike, drawStyle?: Style | un
|
|
|
330
420
|
/** 创建绘制交互。 */
|
|
331
421
|
export declare const createDrawInteraction: (type: Type | undefined, vectorLayer: VectorLayer, openTip?: boolean) => Draw;
|
|
332
422
|
//#endregion
|
|
423
|
+
//#region src/interaction/route.d.ts
|
|
424
|
+
/** 仅支持 EPSG:4326 经纬度;设置起飞点或导入航点后可追加与操控,停止后保留结果。 */
|
|
425
|
+
export declare const createRouteController: (config?: RouteConfig) => Interaction & {
|
|
426
|
+
/** 获取轻量状态快照;不逐帧导出整条航线。 */
|
|
427
|
+
getState(): RouteState;
|
|
428
|
+
/** 立即提供快照,返回取消订阅函数;销毁时自动解除全部订阅。 */
|
|
429
|
+
subscribe(listener: (state: RouteState) => void): () => void;
|
|
430
|
+
/** 统一切换操作模式;先校验,再清理旧操作,重复设置保持当前会话。 */
|
|
431
|
+
setMode(next: RouteMode): void;
|
|
432
|
+
/** 更新编辑配置;校验失败保留配置、选择和拖动。 */
|
|
433
|
+
setEditConfig(options: RouteEditConfig): void;
|
|
434
|
+
/** 清空航线并回到空闲,保留输入与样式配置,实例可以继续使用。 */
|
|
435
|
+
clear(): void;
|
|
436
|
+
/** 导出当前点位与业务字段的副本,indexNo 从 0 连续编号;空航线返回空数组。 */
|
|
437
|
+
exportWaypoints(): RouteWaypoint[];
|
|
438
|
+
/** 按 indexNo 升序替换整条航线;首点为起飞点,空数组清空,校验失败保留原数据。 */
|
|
439
|
+
importWaypoints(waypoints: readonly RouteWaypoint[]): void;
|
|
440
|
+
/** 永久销毁本航线:清空点线、移除图层与交互,释放编辑、飞控和监听;可重复调用。 */
|
|
441
|
+
destroy(): void;
|
|
442
|
+
setMap(nextMap: Map$1 | null): void;
|
|
443
|
+
setActive(active: boolean): void;
|
|
444
|
+
/** 获取编辑模式下点击选中的航点。 */
|
|
445
|
+
getSelectedWaypoint(): Feature$1<Point> | undefined;
|
|
446
|
+
/** 编辑模式调整指定航点高度(米),省略时使用选中点;最低 0,不改变二维位置。 */
|
|
447
|
+
adjustWaypointHeight(delta: number, point?: Feature$1<Point, {
|
|
448
|
+
[x: string]: any;
|
|
449
|
+
}> | undefined): boolean;
|
|
450
|
+
/** 删除指定普通航点,省略参数时删除选中点;起飞点、非编辑状态或其他航线的点返回 false。 */
|
|
451
|
+
removeWaypoint(point?: Feature$1<Point> | undefined): boolean;
|
|
452
|
+
/** 获取自动创建的航线图层;移除交互后图层和结果仍保留。 */
|
|
453
|
+
getLayer(): VectorLayer<VectorSource<Feature$1<import("ol/geom").Geometry, {
|
|
454
|
+
[x: string]: any;
|
|
455
|
+
}>>, Feature$1<import("ol/geom").Geometry, {
|
|
456
|
+
[x: string]: any;
|
|
457
|
+
}>>;
|
|
458
|
+
/** 当前航线是否已经通过地图点击或导入设置起飞点。 */
|
|
459
|
+
hasTakeoff(): boolean;
|
|
460
|
+
/** 替换完整动作集合;空集合停止运动。输入监听由可选 input 配置托管。 */
|
|
461
|
+
setRouteControls(next: readonly RouteControl[]): void;
|
|
462
|
+
/** 在当前飞行位置追加航点;重复位置或未开启操控时不产生数据。 */
|
|
463
|
+
addRouteWaypoint(): void;
|
|
464
|
+
};
|
|
465
|
+
//#endregion
|
|
333
466
|
//#region src/layer/geojson-layer.d.ts
|
|
334
467
|
/** 直接从 GeoJSON 创建矢量图层。 */
|
|
335
468
|
export declare const createGeoJsonLayer: (geoJson: any, style: StyleLike | FlatStyleLike | null | undefined, config?: LayerConfig) => VectorLayer<VectorSource<import("ol").Feature<import("ol/geom").Geometry, {
|
|
@@ -466,6 +599,12 @@ export declare const addMassMarksLayer: (getImgUrlFn: GetImgUrlFn) => (dataList:
|
|
|
466
599
|
* @param checkedStatusList
|
|
467
600
|
*/
|
|
468
601
|
export declare const updateMarksLayersByStatus: (checkedStatusList?: string[]) => MassData[];
|
|
602
|
+
/**
|
|
603
|
+
*
|
|
604
|
+
* @param layerName
|
|
605
|
+
* @param visibleIdSet
|
|
606
|
+
*/
|
|
607
|
+
export declare const changeFeaturesVisibleByIds: (layerName: string, visibleIdSet: Set<string>) => void;
|
|
469
608
|
//#endregion
|
|
470
609
|
//#region src/layer/cluster-layer.d.ts
|
|
471
610
|
/**
|
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 ee from"ol/source/Raster";import te from"ol/Map";import ne from"ol/View";import{defaults as re}from"ol/control";import y from"gcoord";import{Feature as b,Overlay as x}from"ol";import{Select as ie,defaults as ae}from"ol/interaction";import{boundingExtent as oe,getCenter as se}from"ol/extent";import{singleClick as ce}from"ol/events/condition";import le from"ol/Feature";import S from"ol/geom/Point";import C from"ol/layer/Vector";import w from"ol/source/Vector";import{Circle as ue,Fill as T,Icon as E,RegularShape as de,Stroke as D,Style as O,Text as k}from"ol/style";import fe from"ol/interaction/Draw";import{getArea as pe,getLength as me}from"ol/sphere";import he from"ol/format/GeoJSON";import{Point as ge}from"ol/geom";import _e from"ol/source/Cluster";import ve from"ol/style/Circle";export*from"tdt-vts-core";let ye=/* @__PURE__ */ function(e){return e.LineString=`LineString`,e.MultiLineString=`MultiLineString`,e.Polygon=`Polygon`,e.MultiPolygon=`MultiPolygon`,e.Invalid=`Invalid`,e}({});const be=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()},xe=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}},Se=async e=>{let t=await be(e.style);if(t?.version!==8||!t.sources||!Array.isArray(t.layers))throw TypeError(`style 必须是 Style v8 对象或其 JSON 地址`);let{source:n}=xe({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}},A=s();let j;const Ce=e=>{j=e},we=()=>{j=void 0},M=(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},Te=()=>j?.getAllLayers().map(e=>e.get(`_dataList`)||[]).flat(2)||[],Ee=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 f,N=/* @__PURE__ */ new Map,Oe=async e=>{let t=N.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 N.set(e,r),r},ke=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 Oe(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)})},P=(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()},F=`c77eddc667c5bed016fded560baf93e7`,I=(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)},Ae=(e,t=F)=>{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)},je=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})}),Me=(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}`})}),Ne=e=>j.getAllLayers().find(t=>(t.get(`_layerName`)||t.getClassName())===e),Pe=e=>{j.getAllLayers().filter(t=>(t.get(`_layerName`)||t.getClassName())===e).forEach(e=>{P(j,e)})},Fe=()=>Math.max(1,Math.min(4,globalThis.navigator?.hardwareConcurrency??2)),L=(e,t,n,r={})=>{let i=new ee({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??Fe()});return i.on(`beforeoperations`,e=>{e.data.ratioArray=n,e.data.rgbColorArray=t}),i},Ie=(e,t,n,r={})=>new v({source:L(e,t,n,r)}),R=(e=``)=>{j&&j.getOverlays().getArray().filter(t=>t.get(e||`position`)).forEach(e=>j.removeOverlay(e))},Le=()=>R(`_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 x({element:o,stopEvent:!1,positioning:`bottom-center`,position:y.transform([+i[0],+i[1]],a||y.WGS84,y.WGS84)});c.set(`_isAnimationMarker`,!0),j.addOverlay(c)},ze=(e={id:`popup-container`,positioning:`top-center`})=>new x(Object.assign({element:document.getElementById(e.id)||void 0},e)),Be=()=>{R(),j.getAllLayers().forEach(e=>{e.get(`_selectInteraction`)?.getFeatures().clear()})},z=()=>{R(),j&&j.getAllLayers().forEach(e=>{e.get(`_isBaseLayer`)||P(j,e)})},Ve=()=>{R(),j.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=j.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 B=[119.71512016971076,30.122490541963536];const Ue=(e={})=>{if(j)return j;let t=V(e);return Ce(t),t},V=(e={})=>{let t=Object.assign({zoom:9.4,maxZoom:18,minZoom:9.4,center:B,baseLayer:`vec-layer`,projection:`EPSG:4326`,layers:[I()],constrainResolution:!1,smoothExtentConstraint:!1,tk:F},e||{}),n=new te({view:new ne(t),controls:re({zoom:!1,rotate:!1,attribution:!1}),interactions:ae({pinchRotate:!1,doubleClickZoom:!1,altShiftDragRotate:!1}),layers:t.layers||[I()]});B=t.center||B,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&&P(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},H=()=>{if(!j)return;let e=j;e.get(`_disposePointerMove`)?.(),e.unset(`_disposePointerMove`),e.getOverlays().forEach(t=>{e.removeOverlay(t)}),e.getInteractions().clear(),e.getAllLayers().forEach(t=>P(e,t)),e.setTarget(``),e.dispose(),we()},We=()=>H(),Ge=()=>j,U=(e=B)=>{j&&j.getView().animate({zoom:9.4,center:e,duration:1e3})},Ke=(e={center:B,isClearAll:!0})=>{z(),U(e.center||B)},W={padding:[50,50,50,50],duration:1e3},qe=(e,t=j,n)=>{let r=t.getView();if(e.length===1)r.animate({zoom:14,duration:1e3,center:e[0],...n||{}});else{let t=oe(e);r.fit(t,{...W,...n||{}})}},Je=(e,t=j,n)=>{t.getView().fit(e,{...W,...n||{}})},Ye=(e,t=j,n)=>{let r=e.getSource();if(!r||r.isEmpty())return;let i=r.getExtent();i&&t.getView().fit(i,{...W,...n||{}})},Xe=(e,t)=>{let n=j.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})},G=e=>new k({text:e.text,offsetY:e.offsetY,offsetX:e.offsetX,justify:`center`,textAlign:`center`,font:`16px PingFangSC-Semibold`,fill:new T({color:`rgba(255, 255, 255, 0.8)`})}),K=(e,t=!1)=>new O({image:new E({scale:e.scale||1,rotation:e.rotation||0,anchor:e.anchor||[.5,1],src:t&&e.activeImg||e.img}),text:e.showText?G(e):void 0}),q=(e,t)=>{let n=new le({geometry:new S([+e.lng,+e.lat]),data:Object.assign({},e||{},{layerName:t.layerName})});return n.setStyle(K(e)),n},J=(e,t)=>{let{layerName:n,visible:r=!0,zIndex:i=10}=t,a=new w;return e.forEach(e=>a.addFeature(q(e,t))),new C({zIndex:i,visible:r,source:a,className:n||`marker-layer`})},Y=(e,t)=>{let n=t>=14?`largeImg`:t>=11?`smallImg`:`img`;e.forEach(e=>{let t=e.get(`data`);t.isSelected||e.setStyle(K({...t,img:t[n]},!1))})},X=(e,t)=>{let n=e.get(`data`),r={...n,isSelected:t};e.set(`data`,r),n.isElastic?Y([e],j.getView().getZoom()):e.setStyle(K(r,t))},Ze=e=>{e.forEach(e=>{X(e,!1)}),e.clear()},Qe=(e,t)=>{let n=e.map(e=>({...e,isElastic:!0})),r=J(n,t),i=r.getSource().getFeatures(),a=j.getView();return Y(i,a.getZoom()),r.set(`_resolutionChangeKey`,a.on(`change:resolution`,()=>Y(i,a.getZoom()))),r},$e=(e,t)=>{let n=q(e,t),r=new C({className:t.layerName||`ol-layer`,source:new w({features:[n]})});return j.addLayer(r),{vectorLayer:r}},et=(e,t)=>{let n=t.getProperties(),{activeStyle:r}=n;if(t.setStyle(r),A.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`),A.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=j.getView();e.animate({duration:1e3,zoom:e.getZoom(),center:se(t.getGeometry().getExtent())})}},Z=e=>{let t=new ie({style:null,multi:!1,hitTolerance:10,layers:[e],condition:t=>{if(!ce(t))return!1;let n=!1;return j.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&&et(e,n[0])}else et(e,t)}if(r.length){let t=r[0],n=t.getProperties();t.setStyle(n.unActiveStyle),e.set(`_hasActive`,!1)}}),j.addInteraction(t),e.set(`_selectInteraction`,t),t},tt=(e,t,n)=>{let r=new ie({style:null,layers:t=>e.includes(t.getClassName())});return r.on(`select`,({deselected:e,selected:r})=>{if(e.length){let t=e[0];X(t,!1),n?.(t)}if(r.length){let e=r[0];X(e,!0),t?.(e)}}),r},nt=e=>{let t=pe(e,{projection:`EPSG:4326`});return t>1e4?`${Math.round(t/1e6*100)/100} km\xB2`:`${Math.round(t*100)/100} m\xB2`},rt=e=>{let t=me(e,{projection:`EPSG:4326`});return t>100?`${Math.round(t/1e3*100)/100} km`:`${Math.round(t*100)/100} m`},it=new O({fill:new T({color:`rgba(255, 255, 255, 0.2)`}),stroke:new D({color:`rgba(0, 0, 0, 0.5)`,lineDash:[10,10],width:2}),image:new ue({radius:5,stroke:new D({color:`rgba(0, 0, 0, 0.7)`}),fill:new T({color:`rgba(255, 255, 255, 0.2)`})})}),at=/* @__PURE__ */ new WeakMap,ot=e=>{let t=at.get(e);if(t)return t;let n=new O({text:new k({font:`14px`,fill:new T({color:`rgba(255, 255, 255, 1)`}),backgroundFill:new T({color:`rgba(0, 0, 0, 0.7)`}),padding:[3,3,3,3],textBaseline:`bottom`,offsetY:-15}),image:new de({radius:8,points:3,angle:Math.PI,displacement:[0,10],fill:new T({color:`rgba(0, 0, 0, 0.7)`})})});return at.set(e,n),n},st=(e,t=it)=>{let n=t?[t]:[],r=e.getGeometry(),i,a;if(r.getType()===`Polygon`?(i=r.getInteriorPoint(),a=nt(r)):r.getType()===`LineString`&&(i=new S(r.getLastCoordinate()),a=rt(r)),i&&a){let t=ot(e);t.setGeometry(i),t.getText().setText(a),n.push(t)}return n},ct=(e=`Point`,t,n)=>new fe({source:t.getSource(),type:e,style:n?e=>st(e,void 0):void 0}),lt=(e,t,n)=>{let{layerName:r}=n||{},i=Object.assign({className:r||`ol-layer`,source:new w({features:new he().readFeatures(e)}),style:t||new O({stroke:new D({color:`red`,lineDash:[10],width:3}),fill:new T({color:`rgba(0, 0, 255, 0.1)`})})},n||{});return new C(i)},Q=(e,t,n,r)=>t&&n?.get(e[t])||r,ut=(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||Ee(r);t!==`Invalid`&&i.push({type:`Feature`,properties:{...e},geometry:{type:t,coordinates:r}})}}catch(e){console.error(`创建线状数据失败:${e}`)}}),y.transform({type:`FeatureCollection`,features:i},r||y.WGS84,y.WGS84)},dt=(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 O({stroke:new D({width:f??c??4,color:d||Q(p,a,r,o)})}),h=new O({stroke:new D({width:c??2,color:Q(p,a,r,o)})});return n||(m.setFill(new T({color:M(l||i||``,u??s??1)||M(Q(p,a,r,i)||``,s??1)})),h.setFill(new T({color:M(Q(p,a,r,i)||``,s??1)}))),e.setProperties({activeStyle:m,unActiveStyle:h}),h},ft=(e,t)=>{let n=ut(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(dt(e,t))}),{features:r,acceptedData:i}},$=(e,t)=>{let{isAutoFit:n,layerName:r,openClick:i}=t,{features:a,acceptedData:o}=ft(e,t),s=new C({zIndex:5,className:r||`ol-layer`,source:new w({features:a})});return i&&Z(s),s.setProperties({_isCustom:!0,_isAutoFit:n,_isVectorLayer:!0,_vectorConfig:t,_layerName:r,_dataList:o,_uuidSet:new Set(o.map(e=>e._uuid))}),s},pt=(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])},mt=(e=[],t)=>$(e,Object.assign({},t,{isLine:!1})),ht=(e=[],t)=>$(e,Object.assign({},t,{isLine:!0})),gt=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 O({zIndex:88+e,image:new E({width:c,height:l,src:t,anchor:[.5,1]})});let n=s(`${r}-${e}-active`,`.webp`);u[e+i]=new O({zIndex:120,image:new E({width:c*a,height:l*a,anchor:[.5,1],src:n||t})})}return u},_t=(e,t=[])=>e.map(e=>{let{crsForm:n}=e,r=y.transform([+e.lnglat[0],+e.lnglat[1]],n||y.WGS84,y.WGS84),i=new b({geometry:new ge(r)});return i.setProperties({...e,unActiveStyle:t[e.style],activeStyle:t[e.style+t.length/2]}),i.setStyle(t[e.style]),i}),vt=(e,t,n={})=>{let r=e.get(`_massMarksStyles`),i=e?.getSource(),{clear:a}=n,o=_t(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)))},yt=(e,t=[])=>{let n=new C({zIndex:2e3,source:new w({features:_t(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},bt=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||gt(e)({baseUrl:a,markerIcon:f,markerSize:m,statusNum:d||5,activeScale:h||1.3}),v=yt(t,_);if(r&&(v.setProperties({_offset:i,_isAutoFit:u}),Z(v)),o){let e=$(t,Object.assign({},{key:`line`,isLine:!0,openClick:!1,strokeWeight:4,strokeColor:`rgba(29, 235, 255, 0.8)`},g||{}));j.addLayer(e)}if(s){let e=$(t,Object.assign({},{isLine:!1,key:`faceList`,strokeWeight:1,openClick:!1,fillColor:`#4247DF`,strokeStyle:`dashed`,strokeColor:`#4247DF`},g||{}));j.addLayer(e)}return v.setProperties({_isCustom:!0,_offset:i,_hasLine:o,_hasFace:s,className:c,_layerName:c,_isVectorLayer:!0,_isDynamic:l,_massMarksStyles:_}),j.addLayer(v),v},xt=(e=[])=>{let t=new O({}),n=new Set(e),r=[];return j.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},St=(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 O({image:new ve({radius:i*20,stroke:new D({width:2,color:`hsla(${180-i*180}, 100%, 40%, 1)`}),fill:new T({color:`hsla(${180-i*180}, 100%, 50%, 1)`})}),text:new k({text:t.toString(),fill:new T({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 C({zIndex:200,className:u,source:new _e({distance:i||80,minDistance:a||0,source:new w({features:e.map(e=>{let t=new b(new ge(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&&Z(p),p};export{ye as GeometryType,He as activeFeatureByUid,vt as addFeaturesByLayer,bt as addMassMarksLayer,pt as appendFeaturesByLayer,je as baseLayers,gt as buildMassMarksStyles,Ie as changeLayer,L as changeSource,Ze as changeUnselectStyle,Re as createAnimationMarker,I as createBaseLayer,$ as createBusinessLayer,St as createClusterLayer,ct as createDrawInteraction,Qe as createElasticMarkerLayer,lt as createGeoJsonLayer,K as createIconStyle,tt as createLayerSelectByNames,V as createMap,Ue as createMapInstance,Ae as createMapWorldLayer,q as createMarker,J as createMarkersLayer,yt as createMassMarksLayer,$e as createMoveMarkerLayer,ze as createOverlay,Z as createSelectByLayer,xe as createTdtVectorSource,Se as createTdtVtsLayer,G as createText,mt as createVectorFaceLayer,ht as createVectorLineLayer,ke as createWmtsLayer,Me as createZheJiangLayer,We as disposeInstance,H as disposeMap,A as emitter,Xe as flyToAnimate,st as getDrawStyle,Ne as getLayerByName,Te as getLayersDataList,Ge as getMapInstance,j as instance,z as removeAllLayers,Pe as removeLayerByName,R as removeOverlays,Ve as resetActiveFeature,Be as resetActiveVector,Ke as resetMap,U as resetZoomAndCenter,qe as setFitViewByCoords,Je as setFitViewByGeom,Ye as setFitViewByLayer,xt 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 z,Stroke as B,Style as V,Text as H}from"ol/style";import ee from"ol/interaction/Draw";import{getArea as te,getLength as ne,offset as U}from"ol/sphere";import re from"ol/geom/LineString";import W from"ol/interaction/Interaction";import G from"ol/style/Circle";import K from"ol/style/Fill";import q from"ol/style/Icon";import J from"ol/style/Stroke";import ie from"ol/style/Style";import ae from"ol/style/Text";import oe from"ol/Collection";import se from"ol/interaction/Select";import ce from"ol/interaction/Translate";import le from"ol/interaction/Snap";import ue from"ol/format/GeoJSON";import{Point as de}from"ol/geom";import fe from"ol/source/Cluster";export*from"tdt-vts-core";let pe=/* @__PURE__ */ function(e){return e.LineString=`LineString`,e.MultiLineString=`MultiLineString`,e.Polygon=`Polygon`,e.MultiPolygon=`MultiPolygon`,e.Invalid=`Invalid`,e}({});const me=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()},he=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}},ge=async e=>{let t=await me(e.style);if(t?.version!==8||!t.sources||!Array.isArray(t.layers))throw TypeError(`style 必须是 Style v8 对象或其 JSON 地址`);let{source:n}=he({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}},_e=s();let Y;const ve=e=>{Y=e},ye=()=>{Y=void 0},be=(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},xe=()=>Y?.getAllLayers().map(e=>e.get(`_dataList`)||[]).flat(2)||[],Se=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`}},Ce=new f,we=/* @__PURE__ */ new Map,Te=async e=>{let t=we.get(e);if(t)return t;let n=await fetch(e);if(!n.ok)throw Error(`WMTS capabilities 请求失败:${n.status}`);let r=Ce.read(await n.text());return we.set(e,r),r},Ee=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 Te(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)})},X=(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()},De=`c77eddc667c5bed016fded560baf93e7`,Oe=(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)},ke=(e,t=De)=>{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)},Ae=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})}),je=(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}`})}),Me=e=>Y.getAllLayers().find(t=>(t.get(`_layerName`)||t.getClassName())===e),Ne=e=>{Y.getAllLayers().filter(t=>(t.get(`_layerName`)||t.getClassName())===e).forEach(e=>{X(Y,e)})},Pe=()=>Math.max(1,Math.min(4,globalThis.navigator?.hardwareConcurrency??2)),Fe=(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??Pe()});return i.on(`beforeoperations`,e=>{e.data.ratioArray=n,e.data.rgbColorArray=t}),i},Ie=(e,t,n,r={})=>new v({source:Fe(e,t,n,r)}),Z=(e=``)=>{Y&&Y.getOverlays().getArray().filter(t=>t.get(e||`position`)).forEach(e=>Y.removeOverlay(e))},Le=()=>Z(`_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),Y.addOverlay(c)},ze=(e={id:`popup-container`,positioning:`top-center`})=>new T(Object.assign({element:document.getElementById(e.id)||void 0},e)),Be=()=>{Z(),Y.getAllLayers().forEach(e=>{e.get(`_selectInteraction`)?.getFeatures().clear()})},Ve=()=>{Z(),Y&&Y.getAllLayers().forEach(e=>{e.get(`_isBaseLayer`)||X(Y,e)})},He=()=>{Z(),Y.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=Y.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(Y)return Y;let t=Ge(e);return ve(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:[Oe()],constrainResolution:!1,smoothExtentConstraint:!1,tk:De},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||[Oe()]});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&&X(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(!Y)return;let e=Y;e.get(`_disposePointerMove`)?.(),e.unset(`_disposePointerMove`),e.getOverlays().forEach(t=>{e.removeOverlay(t)}),e.getInteractions().clear(),e.getAllLayers().forEach(t=>X(e,t)),e.setTarget(``),e.dispose(),ye()},qe=()=>Ke(),Je=()=>Y,Ye=(e=Q)=>{Y&&Y.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=Y,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=Y,n)=>{t.getView().fit(e,{...Ze,...n||{}})},et=(e,t=Y,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=Y.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 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)`})}),rt=(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?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],Y.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=Y.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 Y.addLayer(r),{vectorLayer:r}},dt=(e,t)=>{let n=t.getProperties(),{activeStyle:r}=n;if(t.setStyle(r),_e.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`),_e.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=Y.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 Y.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)}}),Y.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=te(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=ne(e,{projection:`EPSG:4326`});return t>100?`${Math.round(t/1e3*100)/100} km`:`${Math.round(t*100)/100} m`},gt=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)`})})}),_t=/* @__PURE__ */ new WeakMap,vt=e=>{let t=_t.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 _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 ee({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=U(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}},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}`);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=()=>{let t=[.../* @__PURE__ */ new Set([...o.values(),...[...s.values()].map(({action:e})=>e)])];e.setRouteControls(e.getMode()===`control`?t.filter(e=>e!==`waypoint`):[]),e.setActiveControls(t)},d=(e,t)=>{try{t.hasPointerCapture(e)&&t.releasePointerCapture(e)}catch{}},f=()=>{o.clear();let e=[...s.entries()];s.clear();for(let[t,{button:n}]of e)d(t,n);u()},p=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}},m=e=>!!e&&(!!n?.contains(e)||!!r?.contains(e))&&!e.closest(`input, textarea, select, a, [contenteditable]:not([contenteditable="false"])`),h=t=>{e.getMode()===`edit`&&Ct(t)?e.adjustWaypointHeight(t===`ascend`?1:-1):e.getMode()===`control`&&t===`waypoint`&&e.addRouteWaypoint()},g=e=>{if(!m(i.activeElement)||i.hidden)return;if(e.ctrlKey||e.altKey||e.metaKey||e.isComposing){f();return}let n=p(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||r?.contains(c)&&e.code!==`Space`&&e.code!==`Enter`)&&(e.preventDefault(),!(e.repeat||o.has(e.code))&&(o.set(e.code,s),u(),h(s)))},_=e=>{o.delete(e.code)&&(e.preventDefault(),u())},v=e=>{if(e.button!==0||i.hidden)return;let t=p(e.target);if(t){e.preventDefault(),t.button.focus({preventScroll:!0}),s.set(e.pointerId,t);try{t.button.setPointerCapture(e.pointerId)}catch{}u()}},y=e=>{let t=s.get(e.pointerId);t&&(s.delete(e.pointerId),d(e.pointerId,t.button),u())},b=e=>{let t=p(e.target);t&&!i.hidden&&h(t.action)},x=()=>{m(i.activeElement)||f()},S=e=>{m(e.relatedTarget)||f()},C=()=>{i.hidden&&f()};return i.addEventListener(`keydown`,g),i.addEventListener(`keyup`,_,!0),i.addEventListener(`focusin`,x),i.addEventListener(`focusout`,S),i.addEventListener(`visibilitychange`,C),i.addEventListener(`pointerup`,y),i.addEventListener(`pointercancel`,y),a.addEventListener(`blur`,f),r?.addEventListener(`pointerdown`,v),r?.addEventListener(`lostpointercapture`,y),r?.addEventListener(`click`,b),()=>{i.removeEventListener(`keydown`,g),i.removeEventListener(`keyup`,_,!0),i.removeEventListener(`focusin`,x),i.removeEventListener(`focusout`,S),i.removeEventListener(`visibilitychange`,C),i.removeEventListener(`pointerup`,y),i.removeEventListener(`pointercancel`,y),a.removeEventListener(`blur`,f),r?.removeEventListener(`pointerdown`,v),r?.removeEventListener(`lostpointercapture`,y),r?.removeEventListener(`click`,b),f(),c&&n.getAttribute(`tabindex`)===`0`&&n.removeAttribute(`tabindex`)}},Tt=()=>{let e=new ie({image:new G({radius:9,fill:new K({color:`#22c55e`}),stroke:new J({color:`#fff`,width:2})}),text:new ae({text:`起飞`,offsetY:-20,fill:new K({color:`#15803d`}),stroke:new J({color:`#fff`,width:3})}),zIndex:2}),t,n=new ie({fill:new K({color:`rgba(59, 130, 246, .2)`}),stroke:new J({color:`#3b82f6`,width:3}),image:new G({radius:6,fill:new K({color:`#3b82f6`})})}),r=e=>(t??=new ie({image:new q({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}},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)}`},Dt=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}}),Ot=(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})},kt=(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}},At=({interaction:e,vectorLayer:t,source:n,points:r,layerOptions:i,midpointStyle:a,pointStyle:o,onDuplicate:s,getTakeoff:c,isDestroyed:l,isEditing:u,getEditConfig:d,syncPath:f})=>{let p,m,h=()=>{let e=m;m=void 0,p=void 0,e?.()};return{get select(){return p},clearEditing:h,updateEditing:()=>{if(h(),l()||m)return;let g=e.getMap();if(!u()||!g||!e.getActive())return;let _=d(),v=new F,y=new P({...i,source:v,style:a??new V({image:new I({radius:5,fill:new L({color:`#fff`}),stroke:new B({color:`#3b82f6`,width:2})})}),zIndex:1/0}),b=()=>{y.setVisible(t.getVisible()),v.clear(),_.mode===`snap`?E():r.slice(1).forEach((e,t)=>{let n=r[t].getGeometry().getCoordinates(),i=e.getGeometry().getCoordinates();v.addFeature(new M({geometry:new N([(n[0]+i[0])/2,(n[1]+i[1])/2]),insertIndex:t+1}))})},x=new se({layers:[t],filter:e=>e!==c()&&r.includes(e),hitTolerance:6});p=x;let S=new ce({condition:A,filter:e=>e!==c()&&(r.includes(e)||v.hasFeature(e)),hitTolerance:6}),C=new oe,w=_.mode===`snap`?new le({features:C,pixelTolerance:_.pixelTolerance}):void 0;w?.on(`snap`,e=>{if(T||!t.getVisible())return;let n=e.feature.get(`insertIndex`);if(!e.segment||typeof n!=`number`){v.clear();return}let r=v.getFeatures()[0];r||(r=new M(new N(e.vertex)),v.addFeature(r)),r.set(`insertIndex`,n),r.getGeometry().setCoordinates(e.vertex)}),w?.on(`unsnap`,()=>{T||v.clear()});let T,E=()=>{C.clear(),!T&&t.getVisible()&&r.forEach((e,t)=>{C.push(new M(e.getGeometry().clone())),t>0&&C.push(new M({geometry:new re([r[t-1].getGeometry().getCoordinates(),e.getGeometry().getCoordinates()]),insertIndex:t}))})};if(w){let e=w.handleEvent.bind(w);w.handleEvent=t=>{let n=e(t);return t.type===`pointerdown`&&!T&&v.getFeatures().length&&g.renderSync(),n}}let D=()=>{if(!T)return;let e=T;T=void 0,!l()&&(e.inserted?(r.splice(r.indexOf(e.point),1),n.removeFeature(e.point)):e.point.getGeometry().setCoordinates(e.coordinate),f(),b())};S.on(`translatestart`,e=>{let t=e.features.item(0);T={point:t,coordinate:t.getGeometry().getCoordinates(),insertIndex:t.get(`insertIndex`),inserted:!1,moved:!1},C.clear()}),S.on(`translating`,e=>{let t=T;if(t&&(t.moved=!0,w&&t.point.getGeometry().setCoordinates(e.coordinate),T===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),T!==t)return}f(),T===t&&b()}}),S.on(`translateend`,()=>{if(!T)return;let{point:t,moved:n}=T,i=t.getGeometry().getCoordinates();n&&r.some(e=>{let n=e.getGeometry().getCoordinates();return e!==t&&n[0]===i[0]&&n[1]===i[1]})?(D(),s?.(i.slice())):(T=void 0,b(),n&&e.changed())}),x.on(`select`,()=>e.changed());let O=()=>{x.getFeatures().clear(),D(),t.un(`change:visible`,b),g.removeInteraction(S),g.removeInteraction(x),w&&(g.removeInteraction(w),w.dispose()),C.clear(),S.dispose(),x.dispose(),y.setMap(null),y.clearRenderer(),y.setSource(null),v.clear(),v.dispose()};m=O,t.on(`change:visible`,b),b(),y.setMap(g),m===O&&(g.addInteraction(x),m===O&&(g.addInteraction(S),m===O&&w&&g.addInteraction(w)))}}},jt=(e={})=>{let t=e.style===void 0?Tt():{},{map:n=Y,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,input:f,speed:p=10,turnSpeed:m=60,verticalSpeed:h=1,...g}=e,_=kt(u);if([p,m,h].some(e=>!Number.isFinite(e)||e<=0))throw Error(`飞行速度、转向速度和升降速度必须为有限正数`);if(!n)throw Error(`请先创建地图实例或通过 config.map 指定地图`);let v=new F,y=new P({...g,className:r||`ol-layer`,source:v,style:i});y.set(`_layerName`,r);let b=new re([]),x=new M(b);x.setStyle(o);let S,C,w=[],T=!1,E=0,D=0,O=`idle`,k=[],A,j,I=0,L=/* @__PURE__ */ new Set,R=e=>{I++;try{return e()}finally{I--,!I&&!T&&U.changed()}},z=()=>{if(!(I||T))for(let e of[...L]){if(T)break;L.has(e)&&e(q.getState())}},B=()=>{let e=A;A=void 0,e?.(),k=[]},V=()=>{B(),!T&&U.getMap()&&U.getActive()&&(f?.keyboard||f?.container!==void 0)&&(A=wt({getMode:()=>O,getTarget:()=>n.getTargetElement()??void 0,setRouteControls:e=>q.setRouteControls(e),addRouteWaypoint:()=>q.addRouteWaypoint(),adjustWaypointHeight:e=>q.adjustWaypointHeight(e),setActiveControls:e=>{k=[...e],z()}},{...f}))},H=()=>{B(),j?.(),j=void 0,G.stopRouteControl(),K.clearEditing()},ee=e=>b.getCoordinates().findIndex(t=>t[0]===e[0]&&t[1]===e[1]),te=e=>{if(ee(e)!==-1){d?.(e.slice());return}let t=E;if(b.appendCoordinate(e),T||t!==E)return;let n=new M({uuid:Et(),geometry:new N(e),extData:{height:G.aircraft?.get(`height`)??C?.get(`extData`)?.height??0},isTakeoff:b.getCoordinates().length===1,isAircraft:!G.aircraft,heading:G.heading});n.setStyle(n.get(`isTakeoff`)?a:s),C?.set(`isAircraft`,!1,!0),C=n,S||=n,w.push(n),v.addFeature(n),!(T||t!==E)&&(b.getCoordinates().length===2&&v.addFeature(x),U.changed())},ne=()=>{if(T)return;let e=E;S=w[0],C=w.at(-1);for(let t of w){let n=t===S;if(t.get(`isTakeoff`)!==n&&t.setStyle(n?a:s),T||e!==E||(t.setProperties({isTakeoff:n,isAircraft:t===C}),T||e!==E))return}b.setCoordinates(w.map(e=>e.getGeometry().getCoordinates())),!(T||e!==E)&&(w.length>1&&!v.hasFeature(x)&&v.addFeature(x),w.length<2&&v.hasFeature(x)&&v.removeFeature(x))},U=new W({handleEvent(e){if(T||!U.getActive()||e.type!==`singleclick`||O!==`draw`&&O!==`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=O===`takeoff`,r=ee(t);return r!==-1&&(!n||r>0)?(d?.(t.slice()),!1):(R(()=>{let e=E,r=D;if(n&&S){let n=b.getCoordinates();if(n[0]=t,b.setCoordinates(n),T||e!==E)return;S.getGeometry().setCoordinates(t)}else te(t);n&&!T&&e===E&&r===D&&q.setMode(`idle`)}),!1)}}),G=xt({speed:p,turnSpeed:m,verticalSpeed:h,interaction:U,geometry:b,vectorLayer:y,aircraftStyle:c,getLastWaypoint:()=>C,isDestroyed:()=>T}),K=At({interaction:U,vectorLayer:y,source:v,points:w,layerOptions:g,midpointStyle:l,pointStyle:s,onDuplicate:d,getTakeoff:()=>S,isDestroyed:()=>T,isEditing:()=>O===`edit`,getEditConfig:()=>_,syncPath:ne});U.on(`change`,z),U.on(`change:active`,()=>{!U.getActive()&&!T&&q.setMode(`idle`)});let q=Object.assign(U,{getState(){let e=K.select?.getFeatures().item(0),t=G.aircraft,n=t?.getGeometry().getCoordinates();return{mode:O,hasTakeoff:!!S,waypointCount:w.length,selectedWaypoint:e?{...Dt([e])[0],indexNo:w.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:[...k],editConfig:{..._}}},subscribe(e){if(T)throw Error(`航线已销毁`);L.add(e);try{e(q.getState())}catch(t){throw L.delete(e),t}return()=>{L.delete(e)}},setMode(e){if(T)throw Error(`航线已销毁`);if(![`idle`,`takeoff`,`draw`,`control`,`edit`].includes(e))throw Error(`不支持的航线模式`);if([`draw`,`control`,`edit`].includes(e)&&!S)throw Error(`请先设置起飞点`);if(e!==O){if(e!==`idle`&&U.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`)}R(()=>{let t=++D,r=()=>T||t!==D,i=O;if(H(),!r()&&(O=e,e!==`idle`&&W.prototype.setActive.call(U,!0),!r()))try{if(e===`control`){let e=G.startRouteControl();if(r())return;e.on(`change`,z),j=()=>e.un(`change`,z)}if(K.updateEditing(),r()||(V(),r()))return;f?.keyboard&&e!==`idle`&&n.getTargetElement()?.focus({preventScroll:!0})}catch(e){throw r()||(H(),r())||(O=i===`control`?`idle`:i,K.updateEditing(),V()),e}})}},setEditConfig(e){if(T)throw Error(`航线已销毁`);let t=kt(e,_);R(()=>{_=t,O===`edit`&&K.updateEditing()})},clear(){q.importWaypoints([])},exportWaypoints(){return Dt(w)},importWaypoints(e){if(T)throw Error(`航线已销毁,请创建新的 Route`);let t=Ot(e,{takeoffStyle:a,pointStyle:s});R(()=>{++D;let e=++E,n=()=>T||e!==E;if(H(),!n()&&(O=O===`edit`&&t.length?`edit`:`idle`,w.length=0,S=void 0,C=void 0,v.clear(!0),!n())){for(let e of t)w.push(e);S=w[0],C=w.at(-1),b.setCoordinates(w.map(e=>e.getGeometry().getCoordinates())),!n()&&(v.addFeatures(w.length>1?[...w,x]:w),!n()&&(K.updateEditing(),n()||V()))}})},destroy(){T||(T=!0,++D,O=`idle`,L.clear(),H(),n.un(`change:target`,J),n.un(`change:view`,J),U.getMap()?.removeInteraction(U),W.prototype.setMap.call(U,null),U.setActive(!1),w.length=0,S=void 0,C=void 0,b.setCoordinates([]),n.removeLayer(y),y.clearRenderer(),y.setSource(null),v.clear(!0),v.dispose(),U.dispose())},setMap(e){if(T)e?.removeInteraction(U);else{if(e&&e!==n)throw Error(`航线不能迁移到其他地图`);e!==U.getMap()&&R(()=>{++D,H(),O=`idle`,W.prototype.setMap.call(U,e),V()})}},setActive(e){W.prototype.setActive.call(U,e&&!T)},getSelectedWaypoint(){return K.select?.getFeatures().item(0)},adjustWaypointHeight(e,t=K.select?.getFeatures().item(0)){if(!Number.isFinite(e))throw Error(`高度变化必须为有限数值`);if(T||O!==`edit`||!U.getActive()||!t||!w.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}),!T&&w.includes(t)&&U.changed(),!0)},removeWaypoint(e=K.select?.getFeatures().item(0)){return!K.select||!e||e===S||!w.includes(e)?!1:(K.clearEditing(),w.includes(e)?(w.splice(w.indexOf(e),1),v.removeFeature(e),ne(),K.updateEditing(),U.changed(),!0):(K.updateEditing(),U.changed(),!1))},getLayer(){return y},hasTakeoff(){return!!S},setRouteControls(e){G.setRouteControls(e)},addRouteWaypoint(){G.aircraft&&U.getActive()&&te(G.aircraft.getGeometry().getCoordinates())}}),J=()=>{T||R(()=>{++D,H(),O=`idle`,V()})};try{n.addLayer(y),n.addInteraction(q),n.on(`change:target`,J),n.on(`change:view`,J),V()}catch(e){throw q.destroy(),e}return q},Mt=(e,t,n)=>{let{layerName:r}=n||{},i=Object.assign({className:r||`ol-layer`,source:new F({features:new ue().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)},Nt=(e,t,n,r)=>t&&n?.get(e[t])||r,Pt=(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||Se(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)},Ft=(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||Nt(p,a,r,o)})}),h=new V({stroke:new B({width:c??2,color:Nt(p,a,r,o)})});return n||(m.setFill(new L({color:be(l||i||``,u??s??1)||be(Nt(p,a,r,i)||``,s??1)})),h.setFill(new L({color:be(Nt(p,a,r,i)||``,s??1)}))),e.setProperties({activeStyle:m,unActiveStyle:h}),h},It=(e,t)=>{let n=Pt(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(Ft(e,t))}),{features:r,acceptedData:i}},$=(e,t)=>{let{isAutoFit:n,layerName:r,openClick:i}=t,{features:a,acceptedData:o}=It(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}=It(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)=>$(e,Object.assign({},t,{isLine:!1})),zt=(e=[],t)=>$(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 de(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=$(t,Object.assign({},{key:`line`,isLine:!0,openClick:!1,strokeWeight:4,strokeColor:`rgba(29, 235, 255, 0.8)`},g||{}));Y.addLayer(e)}if(s){let e=$(t,Object.assign({},{isLine:!1,key:`faceList`,strokeWeight:1,openClick:!1,fillColor:`#4247DF`,strokeStyle:`dashed`,strokeColor:`#4247DF`},g||{}));Y.addLayer(e)}return v.setProperties({_isCustom:!0,_offset:i,_hasLine:o,_hasFace:s,className:c,_layerName:c,_isVectorLayer:!0,_isDynamic:l,_massMarksStyles:_}),Y.addLayer(v),v},Gt=(e=[])=>{let t=new V({}),n=new Set(e),r=[];return Y.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=Y.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 G({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 fe({distance:i||80,minDistance:a||0,source:new F({features:e.map(e=>{let t=new w(new de(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{pe as GeometryType,Ue as activeFeatureByUid,Ht as addFeaturesByLayer,Wt as addMassMarksLayer,Lt as appendFeaturesByLayer,Ae as baseLayers,Bt as buildMassMarksStyles,Kt as changeFeaturesVisibleByIds,Ie as changeLayer,Fe as changeSource,ct as changeUnselectStyle,Re as createAnimationMarker,Oe as createBaseLayer,$ as createBusinessLayer,qt as createClusterLayer,bt as createDrawInteraction,lt as createElasticMarkerLayer,Mt as createGeoJsonLayer,rt as createIconStyle,pt as createLayerSelectByNames,Ge as createMap,We as createMapInstance,ke as createMapWorldLayer,it as createMarker,at as createMarkersLayer,Ut as createMassMarksLayer,ut as createMoveMarkerLayer,ze as createOverlay,jt as createRouteController,ft as createSelectByLayer,he as createTdtVectorSource,ge as createTdtVtsLayer,nt as createText,Rt as createVectorFaceLayer,zt as createVectorLineLayer,Ee as createWmtsLayer,je as createZheJiangLayer,qe as disposeInstance,Ke as disposeMap,_e as emitter,tt as flyToAnimate,yt as getDrawStyle,Me as getLayerByName,xe as getLayersDataList,Je as getMapInstance,Y as instance,Ve as removeAllLayers,Ne as removeLayerByName,Z 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.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "OpenLayers utilities with browser-side Tianditu private VTS loading and conversion",
|
|
6
6
|
"files": [
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"gcoord": "^1.0.7",
|
|
40
40
|
"mitt": "^3.0.1",
|
|
41
|
-
"ol-mapbox-style": "^13.
|
|
41
|
+
"ol-mapbox-style": "^13.8.0",
|
|
42
42
|
"tdt-vts-core": "^1.0.0"
|
|
43
43
|
},
|
|
44
44
|
"peerDependencies": {
|