jgis 1.0.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/LICENSE +22 -0
- package/README.md +223 -0
- package/dist/2d/core.d.ts +73 -0
- package/dist/2d/index.d.ts +20 -0
- package/dist/2d/index.js +1 -0
- package/dist/2d/index.mjs +591 -0
- package/dist/2d/index2.d.ts +23 -0
- package/dist/2d/interaction.d.ts +55 -0
- package/dist/2d/layer.d.ts +70 -0
- package/dist/2d/source.d.ts +24 -0
- package/dist/2d/store.d.ts +16 -0
- package/dist/2d/style.d.ts +2 -0
- package/dist/2d/types.d.ts +80 -0
- package/dist/2d/utils.d.ts +57 -0
- package/dist/2d.d.ts +2 -0
- package/dist/3d/baseMap.d.ts +10 -0
- package/dist/3d/camera.d.ts +0 -0
- package/dist/3d/core.d.ts +19 -0
- package/dist/3d/entity.d.ts +0 -0
- package/dist/3d/index.d.ts +4 -0
- package/dist/3d/index.js +1 -0
- package/dist/3d/index.mjs +120 -0
- package/dist/3d/primitive.d.ts +0 -0
- package/dist/3d/types.d.ts +0 -0
- package/dist/3d.d.ts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/index.mjs +5 -0
- package/package.json +70 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2015 EOX IT Services GmbH
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
package/README.md
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
# JGIS
|
|
2
|
+
|
|
3
|
+
<p align="left">
|
|
4
|
+
<img src="https://img.shields.io/badge/version-1.0.0-blue.svg" alt="Version">
|
|
5
|
+
<img src="https://img.shields.io/badge/license-MIT-green.svg" alt="License">
|
|
6
|
+
<img src="https://img.shields.io/badge/build-vite-646CFF" alt="Vite">
|
|
7
|
+
<img src="https://img.shields.io/badge/typescript-100%25-blue" alt="TypeScript">
|
|
8
|
+
</p>
|
|
9
|
+
|
|
10
|
+
**JGIS** 是一个基于函数式编程思维构建的轻量级 GIS 工具库。它采用多入口架构,严格分离二维(OpenLayers)与三维(Cesium)依赖,提供开箱即用的高阶交互钩子和统一的 API 设计。
|
|
11
|
+
|
|
12
|
+
## ✨ 核心特性
|
|
13
|
+
|
|
14
|
+
* **📦 多入口架构 (Multi-Entry)**:
|
|
15
|
+
* 按需引入 `jgis/2d` 或 `jgis/3d`。
|
|
16
|
+
* 使用 2D 功能时绝不会打包 Cesium 代码,保持体积轻量。
|
|
17
|
+
* **🚀 函数式编程 (Functional)**:
|
|
18
|
+
* 摒弃复杂的类继承,使用 Hooks 风格(如 `useSelect`, `useMap`)。
|
|
19
|
+
* 支持**隐式上下文**:初始化地图后,功能函数自动绑定当前地图实例,无需重复传参。
|
|
20
|
+
* **⚡️ 全能拾取器 (Universal Picker)**:
|
|
21
|
+
* **Hybrid Select**:一套 API 同时支持本地 Vector 图层和远程 WMS 服务(自动解析 GetFeatureInfo)。
|
|
22
|
+
* **Unified Styling**:WMS 图层也能像 Vector 一样拥有动态高亮样式。
|
|
23
|
+
* **🎨 灵活的样式系统**:
|
|
24
|
+
* 支持根据图层、属性动态渲染高亮样式,完全控制权交给用户。
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 📦 安装
|
|
29
|
+
|
|
30
|
+
JGIS 依赖 `ol` (OpenLayers) 和 `cesium` 作为对等依赖 (Peer Dependencies),请确保你的项目中已安装它们。
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# 安装 jgis
|
|
34
|
+
npm install jgis
|
|
35
|
+
|
|
36
|
+
# 安装核心依赖
|
|
37
|
+
npm install ol
|
|
38
|
+
npm install cesium
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 🗺️ 快速开始 (2D)
|
|
44
|
+
|
|
45
|
+
### 1. 初始化地图
|
|
46
|
+
|
|
47
|
+
```vue
|
|
48
|
+
<template>
|
|
49
|
+
<!-- ⚠️ 注意:必须给容器设置高度,否则地图无法显示 -->
|
|
50
|
+
<div id="map-container" style="height: 100vh; width: 100%;"></div>
|
|
51
|
+
</template>
|
|
52
|
+
|
|
53
|
+
<script setup>
|
|
54
|
+
import { onMounted } from 'vue';
|
|
55
|
+
import 'ol/ol.css'; // ⚠️ 别忘了引入 OpenLayers 样式
|
|
56
|
+
import { createMap2D } from 'jgis/2d';
|
|
57
|
+
|
|
58
|
+
onMounted(() => {
|
|
59
|
+
// 初始化地图,会自动注册为全局激活实例
|
|
60
|
+
createMap2D({
|
|
61
|
+
target: 'map-container',
|
|
62
|
+
center: [116.4, 39.9],
|
|
63
|
+
zoom: 10
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
</script>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 2. 使用交互功能 (Select / Hover)
|
|
70
|
+
|
|
71
|
+
JGIS 的核心优势在于**同时处理 Vector 和 WMS 图层**,并提供统一的样式回调。
|
|
72
|
+
|
|
73
|
+
```javascript
|
|
74
|
+
import { useSelect } from 'jgis/2d';
|
|
75
|
+
import { Style, Stroke, Fill } from 'ol/style'; // 或从 jgis 导出
|
|
76
|
+
|
|
77
|
+
// 假设你有两个图层:一个是本地 Vector,一个是 Geoserver WMS
|
|
78
|
+
const vectorLayer = ...;
|
|
79
|
+
const wmsLayer = ...;
|
|
80
|
+
|
|
81
|
+
// 开启选择交互 (无需传入 map 实例)
|
|
82
|
+
const select = useSelect({
|
|
83
|
+
// 监听这些图层 (不传则监听所有)
|
|
84
|
+
layers: [vectorLayer, wmsLayer],
|
|
85
|
+
|
|
86
|
+
// 支持多选 (Shift + 点击)
|
|
87
|
+
multi: false,
|
|
88
|
+
|
|
89
|
+
// 自定义高亮样式 (支持函数或对象)
|
|
90
|
+
style: (feature) => {
|
|
91
|
+
// 自动识别数据来源
|
|
92
|
+
const layer = feature.get('_origin_layer'); // WMS 注入的标记
|
|
93
|
+
const type = feature.get('type');
|
|
94
|
+
|
|
95
|
+
// 根据业务逻辑返回不同样式
|
|
96
|
+
if (layer === wmsLayer) {
|
|
97
|
+
return new Style({
|
|
98
|
+
stroke: new Stroke({ color: 'red', width: 3 }),
|
|
99
|
+
fill: new Fill({ color: 'rgba(255,0,0,0.1)' })
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
// 默认样式
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
// 监听回调
|
|
108
|
+
select.onSelect((res) => {
|
|
109
|
+
if (res && res.length > 0) {
|
|
110
|
+
// res 是一个数组,包含 feature, layer 和 properties
|
|
111
|
+
const item = res[0];
|
|
112
|
+
console.log('选中要素属性:', item.properties);
|
|
113
|
+
console.log('所属图层:', item.layer);
|
|
114
|
+
} else {
|
|
115
|
+
console.log('取消选中');
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
// 页面销毁时可调用
|
|
120
|
+
// select.destroy();
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## 🌍 快速开始 (3D)
|
|
126
|
+
|
|
127
|
+
三维模块完全隔离,不会污染二维项目。
|
|
128
|
+
|
|
129
|
+
```javascript
|
|
130
|
+
import { createMap3D, flyTo } from 'jgis/3d';
|
|
131
|
+
|
|
132
|
+
// 初始化
|
|
133
|
+
const viewer = createMap3D('cesium-container');
|
|
134
|
+
|
|
135
|
+
// 使用工具函数
|
|
136
|
+
flyTo(viewer, {
|
|
137
|
+
lng: 116.4,
|
|
138
|
+
lat: 39.9,
|
|
139
|
+
height: 2000
|
|
140
|
+
});
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## 🛠️ 项目配置指南 (Vite & TS)
|
|
146
|
+
|
|
147
|
+
### 1. 解决 OpenLayers/Cesium 双重实例报错 (Instance Mismatch)
|
|
148
|
+
|
|
149
|
+
如果你在控制台看到 `instanceof` 检查失败、样式不生效或报错,通常是因为依赖被重复打包。请在宿主项目的 `vite.config.ts` 中强制合并依赖。
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
// vite.config.ts
|
|
153
|
+
import { defineConfig } from 'vite';
|
|
154
|
+
|
|
155
|
+
export default defineConfig({
|
|
156
|
+
resolve: {
|
|
157
|
+
// 🟢 关键配置:强制指向项目根目录的 node_modules
|
|
158
|
+
dedupe: ['ol', 'cesium'],
|
|
159
|
+
// 配合 yalc 或 npm link 使用时建议开启
|
|
160
|
+
preserveSymlinks: true
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### 2. TypeScript 提示找不到模块
|
|
166
|
+
|
|
167
|
+
如果报错 `Cannot find module 'jgis/2d'`,是因为 TS 默认不解析 `package.json` 的 `exports` 字段。
|
|
168
|
+
|
|
169
|
+
请修改 `tsconfig.json`:
|
|
170
|
+
|
|
171
|
+
```json
|
|
172
|
+
{
|
|
173
|
+
"compilerOptions": {
|
|
174
|
+
// 推荐设置为 bundler 以完美支持多入口库
|
|
175
|
+
"moduleResolution": "bundler"
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## 📂 目录结构
|
|
183
|
+
|
|
184
|
+
```text
|
|
185
|
+
jgis/
|
|
186
|
+
├── dist/ # 打包产物
|
|
187
|
+
├── src/
|
|
188
|
+
│ ├── 2d/ # 基于 OpenLayers 的封装
|
|
189
|
+
│ │ ├── core/ # 地图初始化与 Context 管理
|
|
190
|
+
│ │ ├── layer/ # 图层操作
|
|
191
|
+
│ │ ├── select.ts # 全能选择器 (Hybrid Select)
|
|
192
|
+
│ │ └── hover.ts # 悬停交互 (带防抖)
|
|
193
|
+
│ ├── 3d/ # 基于 Cesium 的封装
|
|
194
|
+
│ ├── utils/ # 通用几何/数学工具
|
|
195
|
+
│ └── index.ts # 公共类型导出
|
|
196
|
+
├── package.json # 定义 exports 多入口
|
|
197
|
+
└── vite.config.ts # 构建配置 (external正则配置)
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## ❓ 常见问题 FAQ
|
|
203
|
+
|
|
204
|
+
**Q: 地图不显示,页面一片白?**
|
|
205
|
+
A: 请检查地图容器 `div` 是否设置了 `height`。块级元素默认高度为 0,必须显式设置(如 `height: 100vh`)。
|
|
206
|
+
|
|
207
|
+
**Q: 样式错乱,缩放控件显示异常?**
|
|
208
|
+
A: 必须在项目入口或组件中引入 `import 'ol/ol.css'`。
|
|
209
|
+
|
|
210
|
+
**Q: WMS 图层点击没反应?**
|
|
211
|
+
A:
|
|
212
|
+
1. 检查 WMS 服务是否开启跨域 (CORS)。
|
|
213
|
+
2. 检查 WMS 服务是否支持 `INFO_FORMAT=application/json`。
|
|
214
|
+
3. 检查控制台 Network 面板,确认 `GetFeatureInfo` 请求 URL 是否正确。
|
|
215
|
+
|
|
216
|
+
**Q: Prettier/ESLint 报错 Cannot find module?**
|
|
217
|
+
A: 这是一个 ESM/CJS 混用问题。请将 `.prettierrc.js` 重命名为 `.prettierrc.json`,并清理 `node_modules` 重新安装。
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## License
|
|
222
|
+
|
|
223
|
+
MIT
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Feature, Map } from 'ol';
|
|
2
|
+
import { flyOptions, LayerOptions } from './types';
|
|
3
|
+
/***
|
|
4
|
+
* 创建地图
|
|
5
|
+
* @param el 地图容器
|
|
6
|
+
* @param options 地图配置
|
|
7
|
+
* @returns {Map}
|
|
8
|
+
*/
|
|
9
|
+
export declare function createMap(el: any, options?: any): Map;
|
|
10
|
+
/**
|
|
11
|
+
* 创建图层
|
|
12
|
+
* @param layerName 图层名称
|
|
13
|
+
* @param data 数据
|
|
14
|
+
* @param options 配置项
|
|
15
|
+
* @returns 图层
|
|
16
|
+
*/
|
|
17
|
+
export declare function addMarker(map: Map, layerName: string, data: any, options?: LayerOptions): void;
|
|
18
|
+
/**
|
|
19
|
+
* 定位
|
|
20
|
+
* @param map 地图实例
|
|
21
|
+
* @param coordinate [经度, 纬度]
|
|
22
|
+
* @param options {flyOptions} 配置项
|
|
23
|
+
*/
|
|
24
|
+
export declare function flyTo(map: Map, coordinate: [number, number], options?: flyOptions): Promise<boolean>;
|
|
25
|
+
/**
|
|
26
|
+
* 通过当前框定位
|
|
27
|
+
* @param map 地图实例
|
|
28
|
+
* @param options {flyOptions} 配置项
|
|
29
|
+
* @returns 经纬度
|
|
30
|
+
*/
|
|
31
|
+
export declare function flyToByExtent(map: Map, options: flyOptions): Promise<boolean>;
|
|
32
|
+
/**
|
|
33
|
+
* 根据要素定位
|
|
34
|
+
* @param map 地图实例
|
|
35
|
+
* @param feature 要素
|
|
36
|
+
* @param options {flyOptions} 配置项
|
|
37
|
+
*/
|
|
38
|
+
export declare function flyToByFeature(map: Map, feature: Feature, options: flyOptions): Promise<boolean>;
|
|
39
|
+
/**
|
|
40
|
+
* 获取地图缩放级别
|
|
41
|
+
* @param map 地图实例
|
|
42
|
+
* @returns 地图缩放级别
|
|
43
|
+
*/
|
|
44
|
+
export declare function getProjection(map: Map): import('ol/proj').Projection;
|
|
45
|
+
/**
|
|
46
|
+
* 获取地图中心点位
|
|
47
|
+
* @param map 地图实例
|
|
48
|
+
* @returns 地图缩放级别
|
|
49
|
+
*/
|
|
50
|
+
export declare function getCenter(map: Map): import('ol/coordinate').Coordinate;
|
|
51
|
+
/**
|
|
52
|
+
* 设置地图中心点位
|
|
53
|
+
* @param map 地图实例
|
|
54
|
+
* @returns 地图缩放级别
|
|
55
|
+
*/
|
|
56
|
+
export declare function setCenter(map: Map, coordinate: [number, number]): void;
|
|
57
|
+
/**
|
|
58
|
+
* 获取地图缩放级别
|
|
59
|
+
* @param map 地图实例
|
|
60
|
+
* @returns 地图缩放级别
|
|
61
|
+
*/
|
|
62
|
+
export declare function getZoom(map: Map): number;
|
|
63
|
+
/**
|
|
64
|
+
* 设置地图缩放级别
|
|
65
|
+
* @param map 地图实例
|
|
66
|
+
* @returns 地图缩放级别
|
|
67
|
+
*/
|
|
68
|
+
export declare function setZoom(map: Map, zoom: number): void;
|
|
69
|
+
/**
|
|
70
|
+
* @param map 地图实例
|
|
71
|
+
* 销毁绑定事件
|
|
72
|
+
*/
|
|
73
|
+
export declare function destroyMap(map: Map, targetId: string): void;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { mapConfigOptions, MapContext } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* 创建地图
|
|
4
|
+
* @param el 地图元素Id
|
|
5
|
+
* @param config 配置
|
|
6
|
+
* @returns 地图方法和地图实例
|
|
7
|
+
*/
|
|
8
|
+
export declare const useMap: (el: string, config: mapConfigOptions) => MapContext;
|
|
9
|
+
/**
|
|
10
|
+
* 保证能获取到方法
|
|
11
|
+
* @param id
|
|
12
|
+
* @param callback
|
|
13
|
+
*/
|
|
14
|
+
export declare function onMapReady(id: string, callback: (ctx: MapContext) => void): void;
|
|
15
|
+
/**
|
|
16
|
+
* 获取地图返回的上下文
|
|
17
|
+
* @param id
|
|
18
|
+
* @returns Promise<MapContext>
|
|
19
|
+
*/
|
|
20
|
+
export declare function getMapContext(id: string): Promise<MapContext>;
|
package/dist/2d/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var te=Object.defineProperty,re=Object.defineProperties;var ne=Object.getOwnPropertyDescriptors;var Z=Object.getOwnPropertySymbols;var oe=Object.prototype.hasOwnProperty,se=Object.prototype.propertyIsEnumerable;var q=(e,t,r)=>t in e?te(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,R=(e,t)=>{for(var r in t||(t={}))oe.call(t,r)&&q(e,r,t[r]);if(Z)for(var r of Z(t))se.call(t,r)&&q(e,r,t[r]);return e},k=(e,t)=>re(e,ne(t));var I=(e,t,r)=>new Promise((n,o)=>{var s=c=>{try{a(r.next(c))}catch(u){o(u)}},i=c=>{try{a(r.throw(c))}catch(u){o(u)}},a=c=>c.done?n(c.value):Promise.resolve(c.value).then(s,i);a((r=r.apply(e,t)).next())});Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const V=require("ol"),L=require("ol/layer"),w=require("ol/source"),A=require("ol/format"),ae=require("ol/Overlay"),T=require("ol/geom"),ce=require("ol/Feature");require("ol/extent");const p=require("ol/style"),ie=require("ol/events/condition.js"),le=require("ol/interaction/Select");var g=63710088e-1,ue={centimeters:g*100,centimetres:g*100,degrees:360/(2*Math.PI),feet:g*3.28084,inches:g*39.37,kilometers:g/1e3,kilometres:g/1e3,meters:g,metres:g,miles:g/1609.344,millimeters:g*1e3,millimetres:g*1e3,nauticalmiles:g/1852,radians:1,yards:g*1.0936};function W(e,t,r={}){const n={type:"Feature"};return(r.id===0||r.id)&&(n.id=r.id),r.bbox&&(n.bbox=r.bbox),n.properties=t||{},n.geometry=e,n}function C(e,t,r={}){if(!e)throw new Error("coordinates is required");if(!Array.isArray(e))throw new Error("coordinates must be an Array");if(e.length<2)throw new Error("coordinates must be at least 2 numbers long");if(!G(e[0])||!G(e[1]))throw new Error("coordinates must contain numbers");return W({type:"Point",coordinates:e},t,r)}function fe(e,t,r={}){for(const o of e){if(o.length<4)throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");if(o[o.length-1].length!==o[0].length)throw new Error("First and last Position are not equivalent.");for(let s=0;s<o[o.length-1].length;s++)if(o[o.length-1][s]!==o[0][s])throw new Error("First and last Position are not equivalent.")}return W({type:"Polygon",coordinates:e},t,r)}function ye(e,t="kilometers"){const r=ue[t];if(!r)throw new Error(t+" units is invalid");return e/r}function $(e){return e%(2*Math.PI)*180/Math.PI}function j(e){return e%360*Math.PI/180}function G(e){return!isNaN(e)&&e!==null&&!Array.isArray(e)}function ge(e){if(!e)throw new Error("coord is required");if(!Array.isArray(e)){if(e.type==="Feature"&&e.geometry!==null&&e.geometry.type==="Point")return[...e.geometry.coordinates];if(e.type==="Point")return[...e.coordinates]}if(Array.isArray(e)&&e.length>=2&&!Array.isArray(e[0])&&!Array.isArray(e[1]))return[...e];throw new Error("coord must be GeoJSON Point or an Array of numbers")}function de(e,t,r,n={}){const o=ge(e),s=j(o[0]),i=j(o[1]),a=j(r),c=ye(t,n.units),u=Math.asin(Math.sin(i)*Math.cos(c)+Math.cos(i)*Math.sin(c)*Math.cos(a)),d=s+Math.atan2(Math.sin(a)*Math.sin(c)*Math.cos(i),Math.cos(c)-Math.sin(i)*Math.sin(u)),x=$(d),l=$(u);return o[2]!==void 0?C([x,l,o[2]],n.properties):C([x,l],n.properties)}function me(e,t,r={}){const n=r.steps||64,o=r.properties?r.properties:!Array.isArray(e)&&e.type==="Feature"&&e.properties?e.properties:{},s=[];for(let i=0;i<n;i++)s.push(de(e,t,i*-360/n,r).geometry.coordinates);return s.push(s[0]),fe([s],o)}function J(e){return e.lttd&&e.lgtd?[Number(e.lgtd),Number(e.lttd)]:e.jd&&e.wd?[Number(e.jd),Number(e.wd)]:e.latitude&&e.longitude?[Number(e.longitude),Number(e.latitude)]:e.lon&&e.lat?[Number(e.lon),Number(e.lat)]:[0,0]}function B(e,t){e.getLayers().getArray().forEach(n=>{n.get("name")==t&&("setSource"in n&&n.setSource(null),"dispose"in n&&n.dispose(),e.removeLayer(n))})}function we(e,t,r){const n=[];let o;const s=r.type||"Point";t.forEach(a=>{switch(s){case"Point":o=be(a);break;case"LineString":o=Me(a);break;case"MultiLineString":o=Se(a);break;case"MultiPolygon":o=Pe(a);break;case"Polygon":o=Ee(a);break}if(!o)return;const c=new ce({geometry:o,data:a});c.set("layerName",e),n.push(c)});const i=new w.Vector;return n.length>0&&i.addFeatures(n),i}function he(e,t){return t.cqlFilter&&(t.cqlFilter?t.CQL_FILTER+=` and ${t.cqlFilter}`:t.CQL_FILTER=t.cqlFilter),new w.TileWMS({url:t.url,params:{LAYERS:t.layers,CQL_FILTER:t.CQL_FILTER},serverType:"geoserver",crossOrigin:"anonymous"})}function be(e){const t=J(e);if(t)return new T.Point(t)}function Me(e){return new T.LineString(e.coordinates)}function Se(e){return new T.MultiLineString(e.coordinates)}function Pe(e){return new T.MultiPolygon(e.coordinates)}function Ee(e){return new T.Polygon(e.coordinates)}function N(e,t){let r=null;return t.style?r=t.style:t.getStyle?r=(n,o)=>t.getStyle(e,n,o):r=Le(),r}function Le(){return(t,r)=>new p.Style({image:new p.Circle({radius:5,fill:new p.Fill({color:"red"})})})}function xe(e,t={}){const r=t.token||"dadcbbdb5206b626a29ca739686b3087",n=t.baseType||"img",o=t.noteType||"cia",s=new L.Tile({className:"tdt-base-layer",source:new w.XYZ({url:`http://t0.tianditu.com/DataServer?T=${n}_w&x={x}&y={y}&l={z}&tk=${r}`,maxZoom:t.maxZoom||18,minZoom:t.minZoom||2}),zIndex:t.zIndex||1});s.set("name","tdt-base-layer");const i=new L.Tile({className:"tdt-base-layer",source:new w.XYZ({url:`http://t0.tianditu.com/DataServer?T=${o}_w&x={x}&y={y}&l={z}&tk=${r}`,maxZoom:t.maxZoom||18,minZoom:t.minZoom||2}),zIndex:t.zIndex?t.zIndex+1:2});return i.set("name","tdt-baseNote-layer"),e.addLayer(s),e.addLayer(i),s}function U(e,t,r,n){(!n||!n.type)&&(n=Object.assign({},r,n));const o=n.type||"Point";let s;switch(o){case"GeoJSON":s=Fe(t,r,e,n);break;case"Wms":s=Te(t,e,n);break;case"Point":case"LineString":case"MultiLineString":case"Polygon":case"MultiPolygon":s=Ie(t,r,e,n);break;case"Circle":s=Ae(t,r,e,n);break;case"Overlay":s=Oe(t,r,e,n);break}return s}function ve(e,t){Array.isArray(t)?t.forEach(r=>{B(e,r)}):B(e,t)}function Fe(e,t,r,n){console.log(typeof t,t);const o=new A.GeoJSON().readFeatures(t,{dataProjection:"EPSG:4326",featureProjection:"EPSG:4326"}),s=new w.Vector;s.addFeatures(o);const i=new L.Vector({source:s,style:N(e,n),zIndex:n.zIndex||10});return i.set("name",e),i.set("type","webgl"),r.addLayer(i),i}function Te(e,t,r){const n=new L.Tile({opacity:r.opacity||1,source:he(e,r),zIndex:r.zIndex||10});return n.set("name",e),t.addLayer(n),n}function Ie(e,t,r,n){if(!t||t.length===0)return null;const o=new L.Vector({source:we(e,t,n),style:N(e,n),zIndex:n.zIndex||10});return o.set("name",e),o.set("type","webgl"),r.addLayer(o),o}function Ae(e,t,r,n){const o=J(t),s=me(o,n.radius,{steps:300,units:"meters"}),i=new A.GeoJSON().readFeature(s,{dataProjection:"EPSG:4326",featureProjection:"EPSG:4490"}),a=new w.Vector({wrapX:!1});a.addFeature(i);const c=new L.Vector({source:a,style:N(e,n),zIndex:n.zIndex?n.zIndex:10});return c.set("name",e),c.set("type","webgl"),r.addLayer(c),c}function Oe(e,t,r,n){const o=document.createElement("div"),s=new ae({element:o,stopEvent:!1,positioning:n.positioning||"bottom-center"});return s.set("name",e),s.set("type","webgl"),r.addOverlay(s),{overlayer:s,content:o}}const F=new Map,E={},v={},Re=(e,t)=>{F.has(e)&&console.warn(`Map with target '${e}' already exists. Overwriting...`),F.set(e,t),E[e]&&(E[e].forEach(r=>r(t)),delete E[e]),v[e]&&(v[e].forEach(r=>r(t)),delete v[e])};function D(e){const t=F.get(e);return t?Promise.resolve(t):(console.warn(`Map '${e}' not found. Make sure useMap() is called first.`),new Promise(r=>{v[e]=v[e]||[],v[e].push(r)}))}const ke=e=>{F.has(e)&&(F.delete(e),delete E[e])},H=(e,t)=>{const r=F.get(e);if(r){t(r);return}E[e]||(E[e]=[]),E[e].push(t)};function pe(e,t={}){if(!e&&!e.target)throw new Error("请传入地图容器");arguments.length===1&&typeof e=="object"&&(t=e,e=t.target);const n=Object.assign({zoom:10,center:[104.064839,30.548857],minZoom:2,maxZoom:19,projection:"EPSG:4326"},t),o=new V.Map({target:e,layers:[],view:new V.View({projection:n.projection,center:n.center,zoom:n.zoom,minZoom:n.minZoom,maxZoom:n.maxZoom})});return o.targetId=e,o}function je(e,t,r,n){U(e,t,r,k(R({},n),{type:"Point"}))}function Q(e,t,r){return new Promise((n,o)=>{e.getView().animate({center:t,duration:r.duration||1e3,zoom:r.zoom||X(e),rotation:r.rotation||0,easing:r.easing},n)})}function Y(e,t){const r=(t.extend[0]+t.extend[2])/2,n=(t.extend[1]+t.extend[3])/2;return Q(e,[r,n],t)}function Ne(e,t,r){const n=t.getGeometry().getExtent();return Y(e,k(R({},r),{extend:n}))}function _e(e){return e.getView().getProjection()}function X(e){return e.getView().getZoom()}function ze(e,t){e.getView().setZoom(t)}function Ze(e,t){e.un("click",()=>{}),e.un("pointermove",()=>{}),ke(t)}let P=null;function qe(e,t={}){const r=new A.GeoJSON;P=new le({condition:ie.click,multi:t.multi||!1,style:a=>{if(typeof t.getStyle=="function"){const c=a.get("layerName");return t.getStyle(c,a)}else return t.style},layers:t.layers?a=>t.layers.includes(a):void 0}),e.addInteraction(P);const n=P.getFeatures(),o=a=>I(null,null,function*(){const c=(t.layers||e.getLayers().getArray()).filter(h=>{const b=h.getSource();return h.getVisible()&&(b instanceof w.TileWMS||b instanceof w.ImageWMS)});if(c.length===0)return;const u=e.getView(),d=c.map(h=>I(null,null,function*(){const f=h.getSource().getFeatureInfoUrl(a.coordinate,u.getResolution(),u.getProjection(),{INFO_FORMAT:"application/json",FEATURE_COUNT:1});if(f)try{const M=yield(yield fetch(f)).json();if(M.features&&M.features.length>0){const m=r.readFeatures(M);return m.forEach(y=>{y.set("wms_layer_source",h),y.set("wms_event_source",a),y.set("layerName",h.get("name"))}),m}}catch(S){console.warn(S)}return[]})),l=(yield Promise.all(d)).flat();l.length>0&&(t.multi,n.extend(l),P.dispatchEvent({type:"select",selected:l,deselected:[],mapBrowserEvent:a}))});e.on("singleclick",o);const s=new Set;P.on("select",a=>{const c=n.getArray();if(c.length>0){const u=c.map(d=>({feature:d,properties:d.getProperties(),layer:d.get("wms_layer_source")||P.getLayer(d),event:d.get("wms_event_source")||a}));i(u)}else i(null)});const i=a=>s.forEach(c=>c(a));return{onSelect:a=>(s.add(a),()=>s.delete(a)),clear:()=>{s.clear(),n.clear()},destroy:()=>{e.removeInteraction(P),e.un("singleclick",o),s.clear()}}}function Ve(e,t={}){var x;const r=new A.GeoJSON,n=(x=t.debounceTime)!=null?x:200,o=new w.Vector,s=new L.Vector({source:o,map:e,style:t.style,zIndex:1e4,properties:{title:"JG_HOVER_LAYER"}});let i=null,a=null;const c=new Set,u=(l,h,b)=>{const f=l[0];if(i!==f)if(i=f,o.clear(),f?(o.addFeature(f),t.cursor!==!1&&(e.getTargetElement().style.cursor="pointer")):t.cursor!==!1&&(e.getTargetElement().style.cursor=""),f){const S={feature:f,layer:h,properties:f.getProperties(),coordinate:b};c.forEach(M=>M([S]))}else c.forEach(S=>S(null))},d=l=>{if(l.dragging)return;const h=l.pixel,b=l.coordinate;let f=!1;if(e.forEachFeatureAtPixel(h,(m,y)=>{f||y!==s&&(t.layers&&!t.layers.includes(y)||(f=!0,a&&clearTimeout(a),u([m],y,b)))}),f)return;i&&(i=null,o.clear(),e.getTargetElement().style.cursor="",c.forEach(m=>m(null))),a&&clearTimeout(a);const M=(t.layers||e.getLayers().getArray()).filter(m=>{const y=m.getSource();return m.getVisible()&&(y instanceof w.TileWMS||y instanceof w.ImageWMS)});M.length!==0&&(a=setTimeout(()=>I(null,null,function*(){const m=e.getView();for(const y of M){const _=y.getSource().getFeatureInfoUrl(b,m.getResolution(),m.getProjection(),{INFO_FORMAT:"application/json",FEATURE_COUNT:1});if(_)try{const O=yield(yield fetch(_)).json();if(O.features&&O.features.length>0){const z=r.readFeatures(O);z.forEach(ee=>ee.set("wms_layer_source",y)),u(z,y,b);return}}catch(K){}}}),n))};return e.on("pointermove",d),{onHover:l=>(c.add(l),()=>c.delete(l)),clear:()=>{o.clear(),i=null},destroy:()=>{e.un("pointermove",d),e.removeLayer(s),c.clear(),a&&clearTimeout(a)}}}const Ce=(e,t)=>{const r=pe(e,t);xe(r,t.baseLayers);const n={targetId:e,instance:r,addMarker:(o,s,i)=>je(r,o,s,i),createLayer:(o,s,i)=>U(r,o,s,i),removeLayer:o=>ve(r,o),useSelect:o=>qe(r,o),useHover:o=>Ve(r,o),flyTo:(o,s)=>Q(r,o,s),flyToByExtent:o=>Y(r,o),flyToByFeature:(o,s)=>Ne(r,o,s),getProjection:()=>_e(r),getZoom:()=>X(r),setZoom:o=>ze(r,o),getMapContext:o=>D(o),onMapReady:(o,s)=>H(o,s),destroyMap:()=>Ze(r,e)};return Re(e,n),n};function $e(e,t){H(e,t)}function Ge(e){return D(e)}exports.getMapContext=Ge;exports.onMapReady=$e;exports.useMap=Ce;
|