map-ol-utils 0.1.31 → 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.
@@ -0,0 +1,482 @@
1
+ import { NormalizeStats, RestoreMode, TdtDecoderWorkerClient, TdtDecoderWorkerClientOptions } from "tdt-vts-core";
2
+ import VectorTileLayer from "ol/layer/VectorTile.js";
3
+ import VectorTileSource from "ol/source/VectorTile.js";
4
+ import { Emitter, EventType } from "mitt";
5
+ import { Source, WMTS, XYZ } from "ol/source.js";
6
+ import TileLayer from "ol/layer/Tile.js";
7
+ import { Layer, Tile } from "ol/layer.js";
8
+ import VectorImageLayer from "ol/layer/Image.js";
9
+ import RasterSource from "ol/source/Raster.js";
10
+ import { AnimationOptions, FitOptions } from "ol/View.js";
11
+ import { CRSTypes } from "gcoord";
12
+ import { Feature, Map as Map$1, Overlay } from "ol";
13
+ import { Select } from "ol/interaction.js";
14
+ import Feature$1, { FeatureLike } from "ol/Feature.js";
15
+ import Point from "ol/geom/Point.js";
16
+ import VectorLayer from "ol/layer/Vector.js";
17
+ import VectorSource from "ol/source/Vector.js";
18
+ import { Style, Text } from "ol/style.js";
19
+ import Draw from "ol/interaction/Draw.js";
20
+ import { Point as Point$1, SimpleGeometry } from "ol/geom.js";
21
+ import Cluster from "ol/source/Cluster.js";
22
+ import { Coordinate } from "ol/coordinate.js";
23
+ import Layer$1 from "ol/layer/Layer.js";
24
+ import { Options } from "ol/Overlay.js";
25
+ import Geometry, { Type } from "ol/geom/Geometry.js";
26
+ import { FlatStyleLike } from "ol/style/flat.js";
27
+ import { StyleLike } from "ol/style/Style.js";
28
+ import Collection from "ol/Collection.js";
29
+ export * from "tdt-vts-core";
30
+ //#region src/core/types.d.ts
31
+ interface CustomMap extends Map$1 {
32
+ activeBaseLayer?: string;
33
+ changeBaseLayer?: () => void;
34
+ removeLayerByName?: (name: string) => void;
35
+ getLayerByName?: (name: string) => Layer<Source> | undefined;
36
+ changeLayersByNames?: (activeNames: Array<string>, allLayerNames: Array<string>) => void;
37
+ }
38
+ type GetImgUrl = (name: string, ext?: string) => string;
39
+ type GetImgUrlFn = (baseUrl: string) => GetImgUrl;
40
+ type VectorConfig = {
41
+ key: string;
42
+ zIndex?: number;
43
+ isRaw?: boolean;
44
+ isLine: boolean;
45
+ colorKey?: string;
46
+ layerName?: string;
47
+ openClick?: boolean;
48
+ fillColor?: string;
49
+ isAutoFit?: boolean;
50
+ crsForm?: CRSTypes;
51
+ fillOpacity?: number;
52
+ strokeColor?: string;
53
+ strokeStyle?: string;
54
+ strokeWeight?: number;
55
+ needTransform?: boolean;
56
+ activeFillColor?: string;
57
+ activeStrokeColor?: string;
58
+ activeFillOpacity?: number;
59
+ activeStrokeWeight?: number;
60
+ colorMap?: Map<string, string>;
61
+ };
62
+ type ClusterData = {
63
+ _uuid: string;
64
+ name: string;
65
+ style: number;
66
+ lnglat: Array<number>;
67
+ rawData: {
68
+ [key: string]: any;
69
+ };
70
+ };
71
+ type ClusterConfig = {
72
+ distance: number;
73
+ layerName?: string;
74
+ openClick?: boolean;
75
+ minDistance: number;
76
+ singleStyles: Style[];
77
+ computedRadius?: (size: number) => number;
78
+ buildStyle?: (feature: FeatureLike) => Style;
79
+ };
80
+ type IconConfig = {
81
+ baseUrl: string;
82
+ hasLine?: boolean;
83
+ layerName?: string;
84
+ hasFace?: boolean;
85
+ statusNum?: number;
86
+ isDynamic?: boolean;
87
+ markerIcon: string;
88
+ activeScale?: number;
89
+ isAutoFit?: boolean;
90
+ marksStyles?: Style[];
91
+ offset?: [number, number];
92
+ vectorConfig?: VectorConfig;
93
+ markerSize: [number, number];
94
+ };
95
+ type MassData = {
96
+ _uuid?: string;
97
+ id: string;
98
+ style: number;
99
+ name: string;
100
+ status: string;
101
+ width?: number;
102
+ height?: number;
103
+ crsForm?: CRSTypes;
104
+ rawData: {
105
+ [key: string]: any;
106
+ };
107
+ lnglat: [string, string] | [number, number];
108
+ };
109
+ type WmtsSourceOptions = {
110
+ style?: string;
111
+ format?: string;
112
+ version?: string;
113
+ layerName: string;
114
+ matrixSet?: string;
115
+ };
116
+ declare enum GeometryType {
117
+ LineString = "LineString",
118
+ MultiLineString = "MultiLineString",
119
+ Polygon = "Polygon",
120
+ MultiPolygon = "MultiPolygon",
121
+ Invalid = "Invalid"
122
+ }
123
+ type GeometryCoordinates = Coordinate[] | Coordinate[][] | Coordinate[][][];
124
+ type HzsyType = 'hzsyraster' | 'hzsyvector' | 'hzsyvector_dark';
125
+ type ZheJiangType = 'emap' | 'emap_lab' | 'imgmap' | 'imgmap_lab';
126
+ type WorldLayerType = 'vec_c' | 'cva_c' | 'img_c' | 'cia_c' | 'ter_c' | 'cta_c' | 'ibo_c';
127
+ /** 通用图层配置。 */
128
+ type LayerConfig = {
129
+ zIndex?: number;
130
+ visible?: boolean;
131
+ minZoom?: number;
132
+ maxZoom?: number;
133
+ layerName: string;
134
+ };
135
+ /** Marker 数据结构。 */
136
+ type DataItemConfig = {
137
+ lng: string | number;
138
+ lat: string | number;
139
+ img: string | undefined;
140
+ activeImg?: string | undefined;
141
+ text?: string;
142
+ offsetX?: number;
143
+ offsetY?: number;
144
+ scale?: number;
145
+ showText?: boolean;
146
+ anchor?: Array<number>;
147
+ rawData?: any;
148
+ rotation?: number;
149
+ };
150
+ interface ElasticDataItemConfig extends DataItemConfig {
151
+ smallImg: string;
152
+ largeImg: string;
153
+ }
154
+ //#endregion
155
+ //#region src/tdt-vts/source.d.ts
156
+ interface SourceDiagnostics {
157
+ onDecoded?: (stats: NormalizeStats & {
158
+ contentType: string | null;
159
+ cacheControl: string | null;
160
+ }, redactedUrl: string) => void;
161
+ onError?: (error: Error, redactedUrl: string) => void;
162
+ }
163
+ interface CreateTdtSourceOptions {
164
+ token?: string;
165
+ restoreMode: RestoreMode;
166
+ hosts: readonly [string, ...string[]];
167
+ minZoom?: number;
168
+ maxZoom?: number;
169
+ diagnostics?: SourceDiagnostics;
170
+ decoderOptions?: TdtDecoderWorkerClientOptions;
171
+ }
172
+ interface TdtSourceBundle {
173
+ source: VectorTileSource<FeatureLike>;
174
+ decoder: TdtDecoderWorkerClient;
175
+ }
176
+ interface CreateTdtVtsLayerOptions {
177
+ token?: string;
178
+ hosts: readonly [string, ...string[]];
179
+ style: string | TdtVtsStyle;
180
+ }
181
+ interface TdtVtsStyle {
182
+ version: 8;
183
+ sources: Record<string, Record<string, unknown>>;
184
+ layers: Array<{
185
+ id: string;
186
+ type: string;
187
+ layout?: Record<string, unknown>;
188
+ [key: string]: unknown;
189
+ }>;
190
+ [key: string]: unknown;
191
+ }
192
+ declare const createTdtVectorSource: (options: CreateTdtSourceOptions) => TdtSourceBundle;
193
+ declare const createTdtVtsLayer: (options: CreateTdtVtsLayerOptions) => Promise<VectorTileLayer<VectorTileSource<FeatureLike>>>;
194
+ //#endregion
195
+ //#region src/core/emitter.d.ts
196
+ declare const emitter: Emitter<Record<EventType, any>>;
197
+ //#endregion
198
+ //#region src/core/helper.d.ts
199
+ declare const getLayersDataList: () => any[];
200
+ //#endregion
201
+ //#region src/layer/ogc-utils.d.ts
202
+ /**
203
+ * 创建WMTS图层
204
+ * @param serverUrl
205
+ */
206
+ declare const createWmtsLayer: (serverUrl: string) => (config: WmtsSourceOptions) => Promise<TileLayer>;
207
+ //#endregion
208
+ //#region src/layer/base-layer.d.ts
209
+ /**
210
+ * 创建杭州规自地图
211
+ * @param layerName - 'hzsyraster' | 'hzsyvector' | 'hzsyvector_dark'
212
+ */
213
+ declare const createBaseLayer: (layerName?: HzsyType) => Tile<XYZ>;
214
+ /**
215
+ * 创建全国天地图
216
+ * @param layerName - 图层名称
217
+ * @param tk - 天地图TK
218
+ */
219
+ declare const createMapWorldLayer: (layerName: WorldLayerType, tk?: string) => Tile<WMTS>;
220
+ /**
221
+ * 创建天地图矢量/影像底图组合。
222
+ * @param tk - 天地图访问令牌
223
+ */
224
+ declare const baseLayers: (tk: string) => {
225
+ baseImgLayer: Tile<XYZ>;
226
+ baseCiaLayer: Tile<XYZ>;
227
+ baseVecLayer: Tile<XYZ>;
228
+ baseCvaLayer: Tile<XYZ>;
229
+ };
230
+ /**
231
+ * 浙江省天地图
232
+ * @param layerName - 图层名称
233
+ * @param tk -
234
+ */
235
+ declare const createZheJiangLayer: (layerName?: ZheJiangType, tk?: string) => Tile<XYZ>;
236
+ /**
237
+ * 根据图层名称获取图层
238
+ * @param name
239
+ */
240
+ declare const getLayerByName: (name: string) => Layer<import("ol/source").Source, import("ol/renderer/Layer").default<any>, {
241
+ [x: string]: any;
242
+ }> | undefined;
243
+ /**
244
+ * 根据图层名称删除图层
245
+ * @param name
246
+ */
247
+ declare const removeLayerByName: (name: string) => void;
248
+ //#endregion
249
+ //#region src/layer/raster-layer.d.ts
250
+ interface RasterTransformOptions {
251
+ threads?: number;
252
+ }
253
+ /** 使用 RGB 比例和目标颜色转换栅格图层。 */
254
+ declare const changeSource: (layer: Layer$1, rgbColorArray: number[], ratioArray: number[], options?: RasterTransformOptions) => RasterSource;
255
+ /** 使用 changeSource 创建可显示的 VectorImageLayer。 */
256
+ declare const changeLayer: (layer: Layer$1, rgbColorArray: number[], ratioArray: number[], options?: RasterTransformOptions) => VectorImageLayer<RasterSource>;
257
+ //#endregion
258
+ //#region src/core/map-context.d.ts
259
+ /** 当前 OpenLayers 单例。集中存放以避免业务模块之间互相引用。 */
260
+ declare let instance: CustomMap;
261
+ //#endregion
262
+ //#region src/map/create-map.d.ts
263
+ declare const createMapInstance: (config?: {}) => CustomMap;
264
+ declare const createMap: (config?: {}) => CustomMap;
265
+ declare const disposeMap: () => void;
266
+ /** 兼容别名;复用 map-ol-utils 现有的完整销毁语义。 */
267
+ declare const disposeInstance: () => void;
268
+ declare const getMapInstance: () => CustomMap;
269
+ declare const resetZoomAndCenter: (center?: [number, number]) => void;
270
+ declare const resetMap: (config?: {
271
+ center: [number, number];
272
+ isClearAll: boolean;
273
+ }) => void;
274
+ //#endregion
275
+ //#region src/overlay/overlay.d.ts
276
+ /**
277
+ * 移除带指定属性键的 Overlay(默认按 'position')
278
+ * @param key
279
+ */
280
+ declare const removeOverlays: (key?: string) => void;
281
+ /**
282
+ * 创建动画标注 Overlay
283
+ * @param imgUrl
284
+ * @param data
285
+ */
286
+ declare const createAnimationMarker: (imgUrl: string, data: MassData) => void;
287
+ /**
288
+ * 创建 Overlay
289
+ * @param config
290
+ */
291
+ declare const createOverlay: (config?: Options) => Overlay;
292
+ //#endregion
293
+ //#region src/map/view-fit.d.ts
294
+ /**
295
+ * 根据 Array<Coordinate> Fit
296
+ * @param coords
297
+ * @param mapInstance
298
+ * @param fitOptions
299
+ */
300
+ declare const setFitViewByCoords: (coords: Array<Coordinate>, mapInstance?: CustomMap, fitOptions?: FitOptions | AnimationOptions) => void;
301
+ /**
302
+ * 根据 SimpleGeometry Fit
303
+ * @param geom
304
+ * @param mapInstance
305
+ * @param fitOptions
306
+ */
307
+ declare const setFitViewByGeom: (geom: SimpleGeometry, mapInstance?: CustomMap, fitOptions?: FitOptions) => void;
308
+ /**
309
+ * 根据 VectorLayer 要素的四至信息 Fit
310
+ * @param layer
311
+ * @param mapInstance
312
+ * @param fitOptions
313
+ */
314
+ declare const setFitViewByLayer: (layer: VectorLayer, mapInstance?: CustomMap, fitOptions?: FitOptions) => void;
315
+ /** 使用两段缩放动画飞到目标位置。 */
316
+ declare const flyToAnimate: (center: Array<any>[number], zoom?: number) => void;
317
+ //#endregion
318
+ //#region src/interaction/select.d.ts
319
+ /**
320
+ * 创建点击交互
321
+ * @param vectorLayer
322
+ */
323
+ declare const createSelectByLayer: (vectorLayer: VectorLayer) => Select;
324
+ /** 按多个 className 创建选择交互。 */
325
+ declare const createLayerSelectByNames: (layerNames: Array<string>, selectedHandler?: (feature: Feature) => void, unSelectHandler?: (feature: Feature) => void) => Select;
326
+ //#endregion
327
+ //#region src/interaction/draw.d.ts
328
+ /** 为绘制中的线和面追加长度/面积标签。 */
329
+ declare const getDrawStyle: (feature: FeatureLike, drawStyle?: Style | undefined) => Style[];
330
+ /** 创建绘制交互。 */
331
+ declare const createDrawInteraction: (type: Type | undefined, vectorLayer: VectorLayer, openTip?: boolean) => Draw;
332
+ //#endregion
333
+ //#region src/layer/geojson-layer.d.ts
334
+ /** 直接从 GeoJSON 创建矢量图层。 */
335
+ declare const createGeoJsonLayer: (geoJson: any, style: StyleLike | FlatStyleLike | null | undefined, config?: LayerConfig) => VectorLayer<VectorSource<import("ol").Feature<import("ol/geom").Geometry, {
336
+ [x: string]: any;
337
+ }>>, import("ol").Feature<import("ol/geom").Geometry, {
338
+ [x: string]: any;
339
+ }>>;
340
+ //#endregion
341
+ //#region src/layer/marker-layer.d.ts
342
+ /** 创建 Marker 文本标注。 */
343
+ declare const createText: (item: DataItemConfig) => Text;
344
+ /** 创建 Marker 默认态或激活态样式。 */
345
+ declare const createIconStyle: (item: DataItemConfig, active?: boolean) => Style;
346
+ /** 创建带 data 属性约定的 Marker Feature。 */
347
+ declare const createMarker: (item: DataItemConfig, config: LayerConfig) => Feature$1<Point, {
348
+ [x: string]: any;
349
+ }>;
350
+ /** 批量创建 Marker 矢量图层。 */
351
+ declare const createMarkersLayer: (dataList: Array<DataItemConfig>, config: LayerConfig) => VectorLayer<VectorSource<Feature$1<Geometry, {
352
+ [x: string]: any;
353
+ }>>, Feature$1<Geometry, {
354
+ [x: string]: any;
355
+ }>>;
356
+ /** 清空外部选择集合并恢复 Marker 未选中样式。 */
357
+ declare const changeUnselectStyle: (featureList: Collection<Feature$1>) => void;
358
+ /** 创建随缩放级别切换小图/大图的 Marker 图层。 */
359
+ declare const createElasticMarkerLayer: (dataList: Array<ElasticDataItemConfig>, config: LayerConfig) => VectorLayer<VectorSource<Feature$1<Geometry, {
360
+ [x: string]: any;
361
+ }>>, Feature$1<Geometry, {
362
+ [x: string]: any;
363
+ }>>;
364
+ /** 创建单 Marker 图层并直接加入当前地图实例。 */
365
+ declare const createMoveMarkerLayer: (dataItem: DataItemConfig, config: LayerConfig) => {
366
+ vectorLayer: VectorLayer<VectorSource<Feature$1<Point, {
367
+ [x: string]: any;
368
+ }>>, Feature$1<Point, {
369
+ [x: string]: any;
370
+ }>>;
371
+ };
372
+ //#endregion
373
+ //#region src/layer/layer-manager.d.ts
374
+ /**
375
+ * 重置激活的矢量数据(清空 overlay 与各图层选择交互的要素集合)
376
+ */
377
+ declare const resetActiveVector: () => void;
378
+ /**
379
+ * 移除覆盖物以及所有非底图自定义图层
380
+ */
381
+ declare const removeAllLayers: () => void;
382
+ /**
383
+ * 重置激活 Feature
384
+ */
385
+ declare const resetActiveFeature: () => void;
386
+ /**
387
+ * 按 _uuid 激活要素
388
+ * @param uid
389
+ */
390
+ declare const activeFeatureByUid: (uid: string) => void;
391
+ //#endregion
392
+ //#region src/layer/vector-layer.d.ts
393
+ /**
394
+ * 创建业务矢量图层(自动推断线/面,生成默认/激活样式)
395
+ * @param dataList
396
+ * @param config
397
+ */
398
+ declare const createBusinessLayer: (dataList: MassData[], config: VectorConfig) => VectorLayer<VectorSource<Feature<import("ol/geom").Geometry, {
399
+ [x: string]: any;
400
+ }>>, Feature<import("ol/geom").Geometry, {
401
+ [x: string]: any;
402
+ }>>;
403
+ /**
404
+ * 追加 Features
405
+ * @param targetLayer
406
+ * @param dataList
407
+ * @param crsForm
408
+ */
409
+ declare const appendFeaturesByLayer: (targetLayer: VectorLayer, dataList: MassData[], crsForm?: CRSTypes) => void;
410
+ /**
411
+ * 创建面状图层
412
+ * @param dataList
413
+ * @param config
414
+ */
415
+ declare const createVectorFaceLayer: (dataList: MassData[] | undefined, config: VectorConfig) => VectorLayer<VectorSource<Feature<import("ol/geom").Geometry, {
416
+ [x: string]: any;
417
+ }>>, Feature<import("ol/geom").Geometry, {
418
+ [x: string]: any;
419
+ }>>;
420
+ /**
421
+ * 创建矢量线图层
422
+ * @param dataList
423
+ * @param config
424
+ */
425
+ declare const createVectorLineLayer: (dataList: MassData[] | undefined, config: VectorConfig) => VectorLayer<VectorSource<Feature<import("ol/geom").Geometry, {
426
+ [x: string]: any;
427
+ }>>, Feature<import("ol/geom").Geometry, {
428
+ [x: string]: any;
429
+ }>>;
430
+ //#endregion
431
+ //#region src/layer/mass-marks.d.ts
432
+ /**
433
+ * 构建 MassMarks 样式数组(默认段 + 激活段,长度 statusNum * 2)
434
+ */
435
+ declare const buildMassMarksStyles: (getImgUrlFn: GetImgUrlFn) => (iconConfig: IconConfig) => any[];
436
+ /**
437
+ * 向海量点图层增量添加 Features
438
+ * @param targetLayer
439
+ * @param dataList
440
+ * @param config
441
+ */
442
+ declare const addFeaturesByLayer: (targetLayer: VectorLayer, dataList: MassData[], config?: {
443
+ clear?: boolean;
444
+ }) => void;
445
+ /**
446
+ * 创建 massMarksLayer
447
+ * @param dataList
448
+ * @param styleList
449
+ */
450
+ declare const createMassMarksLayer: (dataList: MassData[], styleList?: StyleLike[]) => VectorLayer<VectorSource<Feature<Point$1, {
451
+ [x: string]: any;
452
+ }>>, Feature<Point$1, {
453
+ [x: string]: any;
454
+ }>>;
455
+ /**
456
+ * 添加 massMarksLayer(按需附带线/面图层)
457
+ * @param getImgUrlFn
458
+ */
459
+ declare const addMassMarksLayer: (getImgUrlFn: GetImgUrlFn) => (dataList: never[] | undefined, iconConfig: IconConfig, openClick?: boolean) => VectorLayer<VectorSource<Feature<Point$1, {
460
+ [x: string]: any;
461
+ }>>, Feature<Point$1, {
462
+ [x: string]: any;
463
+ }>>;
464
+ /**
465
+ * 按选中状态列表更新海量点显隐
466
+ * @param checkedStatusList
467
+ */
468
+ declare const updateMarksLayersByStatus: (checkedStatusList?: string[]) => MassData[];
469
+ //#endregion
470
+ //#region src/layer/cluster-layer.d.ts
471
+ /**
472
+ * 创建聚合图层(半径/颜色随聚合数量动态计算)
473
+ * @param dataList
474
+ * @param config
475
+ */
476
+ declare const createClusterLayer: (dataList: ClusterData[], config: ClusterConfig) => VectorLayer<Cluster<Feature<Point$1, {
477
+ [x: string]: any;
478
+ }>>, Feature<import("ol/geom").Geometry, {
479
+ [x: string]: any;
480
+ }>>;
481
+ //#endregion
482
+ export { ClusterConfig, ClusterData, type CreateTdtSourceOptions, type CreateTdtVtsLayerOptions, CustomMap, DataItemConfig, ElasticDataItemConfig, GeometryCoordinates, GeometryType, GetImgUrl, GetImgUrlFn, HzsyType, IconConfig, LayerConfig, MassData, type SourceDiagnostics, type TdtSourceBundle, type TdtVtsStyle, VectorConfig, WmtsSourceOptions, WorldLayerType, ZheJiangType, activeFeatureByUid, addFeaturesByLayer, addMassMarksLayer, appendFeaturesByLayer, baseLayers, buildMassMarksStyles, changeLayer, changeSource, changeUnselectStyle, createAnimationMarker, createBaseLayer, createBusinessLayer, createClusterLayer, createDrawInteraction, createElasticMarkerLayer, createGeoJsonLayer, createIconStyle, createLayerSelectByNames, createMap, createMapInstance, createMapWorldLayer, createMarker, createMarkersLayer, createMassMarksLayer, createMoveMarkerLayer, createOverlay, createSelectByLayer, createTdtVectorSource, createTdtVtsLayer, createText, createVectorFaceLayer, createVectorLineLayer, createWmtsLayer, createZheJiangLayer, disposeInstance, disposeMap, emitter, flyToAnimate, getDrawStyle, getLayerByName, getLayersDataList, getMapInstance, instance, removeAllLayers, removeLayerByName, removeOverlays, resetActiveFeature, resetActiveVector, resetMap, resetZoomAndCenter, setFitViewByCoords, setFitViewByGeom, setFitViewByLayer, updateMarksLayersByStatus };
package/dist/index.mjs ADDED
@@ -0,0 +1 @@
1
+ import{TdtDecoderWorkerClient as e,createTdtVtsUrl as t,redactTdtToken as n}from"tdt-vts-core";import r from"ol/format/MVT.js";import i from"ol/layer/VectorTile.js";import a from"ol/TileState.js";import o from"ol/source/VectorTile.js";import s from"mitt";import{WMTS as c,XYZ as l}from"ol/source.js";import u from"ol/layer/Tile.js";import{GeoJSON as d,WMTSCapabilities as f}from"ol/format.js";import{optionsFromCapabilities as p}from"ol/source/WMTS.js";import{TileGrid as m}from"ol/tilegrid.js";import{Tile as h}from"ol/layer.js";import g from"ol/tilegrid/WMTS.js";import{unByKey as _}from"ol/Observable.js";import v from"ol/layer/Image.js";import ee from"ol/source/Raster.js";import te from"ol/Map.js";import ne from"ol/View.js";import{defaults as re}from"ol/control.js";import y from"gcoord";import{Feature as b,Overlay as ie}from"ol";import{Select as x,defaults as ae}from"ol/interaction.js";import{boundingExtent as oe,getCenter as se}from"ol/extent.js";import{singleClick as ce}from"ol/events/condition.js";import le from"ol/Feature.js";import ue from"ol/geom/Point.js";import S from"ol/layer/Vector.js";import C from"ol/source/Vector.js";import{Circle as de,Fill as w,Icon as T,RegularShape as fe,Stroke as E,Style as D,Text as O}from"ol/style.js";import pe from"ol/interaction/Draw.js";import{getArea as me,getLength as he}from"ol/sphere.js";import ge from"ol/format/GeoJSON.js";import{Point as k}from"ol/geom.js";import _e from"ol/source/Cluster.js";import ve from"ol/style/Circle.js";export*from"tdt-vts-core";let ye=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()},A=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}},xe=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}=A({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}},j=s();let M;const Se=e=>{M=e},Ce=()=>{M=void 0},N=(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},we=()=>M?.getAllLayers().map(e=>e.get(`_dataList`)||[]).flat(2)||[],Te=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`}},Ee=new f,P=new Map,De=async e=>{let t=P.get(e);if(t)return t;let n=await fetch(e);if(!n.ok)throw Error(`WMTS capabilities 请求失败:${n.status}`);let r=Ee.read(await n.text());return P.set(e,r),r},Oe=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 De(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)})},F=`c77eddc667c5bed016fded560baf93e7`,I=(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()},L=(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=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)},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=>M.getAllLayers().find(t=>(t.get(`_layerName`)||t.getClassName())===e),Ne=e=>{let t=Me(e);t&&I(M,t)},Pe=()=>Math.max(1,Math.min(4,globalThis.navigator?.hardwareConcurrency??2)),Fe=(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??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)}),R=(e=``)=>{M&&M.getOverlays().getArray().filter(t=>t.get(e||`position`)).forEach(e=>M.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 ie({element:o,stopEvent:!1,positioning:`bottom-center`,position:y.transform([+i[0],+i[1]],a||y.WGS84,y.WGS84)});c.set(`_isAnimationMarker`,!0),M.addOverlay(c)},ze=(e={id:`popup-container`,positioning:`top-center`})=>new ie(Object.assign({element:document.getElementById(e.id)||void 0},e)),Be=()=>{R(),M.getAllLayers().forEach(e=>{e.get(`_selectInteraction`)?.getFeatures().clear()})},Ve=()=>{R(),M&&M.getAllLayers().forEach(e=>{e.get(`_isBaseLayer`)||I(M,e)})},He=()=>{R(),M.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=M.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 z=[119.71512016971076,30.122490541963536];const We=(e={})=>{if(M)return M;let t=B(e);return Se(t),t},B=(e={})=>{let t=Object.assign({zoom:9.4,maxZoom:18,minZoom:9.4,center:z,baseLayer:`vec-layer`,projection:`EPSG:4326`,layers:[L()],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||[L()]});z=t.center||z,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&&I(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,a&&(n.getTargetElement().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},V=()=>{if(!M)return;let e=M;e.get(`_disposePointerMove`)?.(),e.unset(`_disposePointerMove`),e.getOverlays().forEach(t=>{e.removeOverlay(t)}),e.getInteractions().clear(),e.getAllLayers().forEach(t=>I(e,t)),e.setTarget(``),e.dispose(),Ce()},Ge=()=>V(),Ke=()=>M,H=(e=z)=>{M&&M.getView().animate({zoom:9.4,center:e,duration:1e3})},qe=(e={center:z,isClearAll:!0})=>{Ve(),H(e.center||z)},U={padding:[50,50,50,50],duration:1e3},Je=(e,t=M,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,{...U,...n||{}})}},Ye=(e,t=M,n)=>{t.getView().fit(e,{...U,...n||{}})},Xe=(e,t=M,n)=>{let r=e.getSource();if(!r||r.isEmpty())return;let i=r.getExtent();i&&t.getView().fit(i,{...U,...n||{}})},Ze=(e,t)=>{let n=M.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})},W=e=>new O({text:e.text,offsetY:e.offsetY,offsetX:e.offsetX,justify:`center`,textAlign:`center`,font:`16px PingFangSC-Semibold`,fill:new w({color:`rgba(255, 255, 255, 0.8)`})}),G=(e,t=!1)=>new D({image:new T({scale:e.scale||1,rotation:e.rotation||0,anchor:e.anchor||[.5,1],src:t&&e.activeImg||e.img}),text:e.showText?W(e):void 0}),K=(e,t)=>{let n=new le({geometry:new ue([+e.lng,+e.lat]),data:Object.assign({},e||{},{layerName:t.layerName})});return n.setStyle(G(e)),n},q=(e,t)=>{let{layerName:n,visible:r=!0,zIndex:i=10}=t,a=new C;return e.forEach(e=>a.addFeature(K(e,t))),new S({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(G({...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],M.getView().getZoom()):e.setStyle(G(r,t))},Qe=e=>{e.forEach(e=>{Y(e,!1)}),e.clear()},$e=(e,t)=>{let n=e.map(e=>({...e,isElastic:!0})),r=q(n,t),i=r.getSource().getFeatures(),a=M.getView();return J(i,a.getZoom()),r.set(`_resolutionChangeKey`,a.on(`change:resolution`,()=>J(i,a.getZoom()))),r},et=(e,t)=>{let n=K(e,t),r=new S({className:t.layerName||`ol-layer`,source:new C({features:[n]})});return M.addLayer(r),{vectorLayer:r}},tt=(e,t)=>{let n=t.getProperties(),{activeStyle:r}=n;if(t.setStyle(r),j.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`),j.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=M.getView();e.animate({duration:1e3,zoom:e.getZoom(),center:se(t.getGeometry().getExtent())})}},X=e=>{let t=new x({style:null,multi:!1,hitTolerance:10,layers:[e],condition:t=>{if(!ce(t))return!1;let n=!1;return M.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&&tt(e,n[0])}else tt(e,t)}if(r.length){let t=r[0],n=t.getProperties();t.setStyle(n.unActiveStyle),e.set(`_hasActive`,!1)}}),M.addInteraction(t),e.set(`_selectInteraction`,t),t},nt=(e,t,n)=>{let r=new x({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},rt=e=>{let t=me(e,{projection:`EPSG:4326`});return t>1e4?`${Math.round(t/1e6*100)/100} km\xB2`:`${Math.round(t*100)/100} m\xB2`},it=e=>{let t=he(e,{projection:`EPSG:4326`});return t>100?`${Math.round(t/1e3*100)/100} km`:`${Math.round(t*100)/100} m`},at=new D({fill:new w({color:`rgba(255, 255, 255, 0.2)`}),stroke:new E({color:`rgba(0, 0, 0, 0.5)`,lineDash:[10,10],width:2}),image:new de({radius:5,stroke:new E({color:`rgba(0, 0, 0, 0.7)`}),fill:new w({color:`rgba(255, 255, 255, 0.2)`})})}),ot=new WeakMap,st=e=>{let t=ot.get(e);if(t)return t;let n=new D({text:new O({font:`14px`,fill:new w({color:`rgba(255, 255, 255, 1)`}),backgroundFill:new w({color:`rgba(0, 0, 0, 0.7)`}),padding:[3,3,3,3],textBaseline:`bottom`,offsetY:-15}),image:new fe({radius:8,points:3,angle:Math.PI,displacement:[0,10],fill:new w({color:`rgba(0, 0, 0, 0.7)`})})});return ot.set(e,n),n},ct=(e,t=at)=>{let n=t?[t]:[],r=e.getGeometry(),i,a;if(r.getType()===`Polygon`?(i=r.getInteriorPoint(),a=rt(r)):r.getType()===`LineString`&&(i=new ue(r.getLastCoordinate()),a=it(r)),i&&a){let t=st(e);t.setGeometry(i),t.getText().setText(a),n.push(t)}return n},lt=(e=`Point`,t,n)=>new pe({source:t.getSource(),type:e,style:n?e=>ct(e,void 0):void 0}),ut=(e,t,n)=>{let{layerName:r}=n||{},i=Object.assign({className:r||`ol-layer`,source:new C({features:new ge().readFeatures(e)}),style:t||new D({stroke:new E({color:`red`,lineDash:[10],width:3}),fill:new w({color:`rgba(0, 0, 255, 0.1)`})})},n||{});return new S(i)},Z=(e,t,n,r)=>t&&n?.get(e[t])||r,dt=(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||Te(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)},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 D({stroke:new E({width:f??c??4,color:d||Z(p,a,r,o)})}),h=new D({stroke:new E({width:c??2,color:Z(p,a,r,o)})});return n||(m.setFill(new w({color:N(l||i||``,u??s??1)||N(Z(p,a,r,i)||``,s??1)})),h.setFill(new w({color:N(Z(p,a,r,i)||``,s??1)}))),e.setProperties({activeStyle:m,unActiveStyle:h}),h},Q=(e,t)=>{let n=dt(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}=Q(e,t),s=new S({zIndex:5,className:r||`ol-layer`,source:new C({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},pt=(e,t,n)=>{let r=e.getSource(),{_vectorConfig:i}=e.getProperties()||{},{features:a,acceptedData:o}=Q(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 D({zIndex:88+e,image:new T({width:c,height:l,src:t,anchor:[.5,1]})});let n=s(`${r}-${e}-active`,`.webp`);u[e+i]=new D({zIndex:120,image:new T({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 k(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 S({zIndex:2e3,source:new C({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}),X(v)),o){let e=$(t,Object.assign({},{key:`line`,isLine:!0,openClick:!1,strokeWeight:4,strokeColor:`rgba(29, 235, 255, 0.8)`},g||{}));M.addLayer(e)}if(s){let e=$(t,Object.assign({},{isLine:!1,key:`faceList`,strokeWeight:1,openClick:!1,fillColor:`#4247DF`,strokeStyle:`dashed`,strokeColor:`#4247DF`},g||{}));M.addLayer(e)}return v.setProperties({_isCustom:!0,_offset:i,_hasLine:o,_hasFace:s,className:c,_layerName:c,_isVectorLayer:!0,_isDynamic:l,_massMarksStyles:_}),M.addLayer(v),v},xt=(e=[])=>{let t=new D({}),n=new Set(e),r=[];return M.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 D({image:new ve({radius:i*20,stroke:new E({width:2,color:`hsla(${180-i*180}, 100%, 40%, 1)`}),fill:new w({color:`hsla(${180-i*180}, 100%, 50%, 1)`})}),text:new O({text:t.toString(),fill:new w({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 S({zIndex:200,className:u,source:new _e({distance:i||80,minDistance:a||0,source:new C({features:e.map(e=>{let t=new b(new k(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};export{ye as GeometryType,Ue as activeFeatureByUid,vt as addFeaturesByLayer,bt as addMassMarksLayer,pt as appendFeaturesByLayer,Ae as baseLayers,gt as buildMassMarksStyles,Ie as changeLayer,Fe as changeSource,Qe as changeUnselectStyle,Re as createAnimationMarker,L as createBaseLayer,$ as createBusinessLayer,St as createClusterLayer,lt as createDrawInteraction,$e as createElasticMarkerLayer,ut as createGeoJsonLayer,G as createIconStyle,nt as createLayerSelectByNames,B as createMap,We as createMapInstance,ke as createMapWorldLayer,K as createMarker,q as createMarkersLayer,yt as createMassMarksLayer,et as createMoveMarkerLayer,ze as createOverlay,X as createSelectByLayer,A as createTdtVectorSource,xe as createTdtVtsLayer,W as createText,mt as createVectorFaceLayer,ht as createVectorLineLayer,Oe as createWmtsLayer,je as createZheJiangLayer,Ge as disposeInstance,V as disposeMap,j as emitter,Ze as flyToAnimate,ct as getDrawStyle,Me as getLayerByName,we as getLayersDataList,Ke as getMapInstance,M as instance,Ve as removeAllLayers,Ne as removeLayerByName,R as removeOverlays,He as resetActiveFeature,Be as resetActiveVector,qe as resetMap,H as resetZoomAndCenter,Je as setFitViewByCoords,Ye as setFitViewByGeom,Xe as setFitViewByLayer,xt as updateMarksLayersByStatus};
package/package.json CHANGED
@@ -1,39 +1,53 @@
1
1
  {
2
2
  "name": "map-ol-utils",
3
- "version": "0.1.31",
3
+ "version": "1.0.0",
4
4
  "type": "module",
5
- "description": "Openlayers utils library",
5
+ "description": "OpenLayers utilities with browser-side Tianditu private VTS loading and conversion",
6
6
  "files": [
7
- "dist"
7
+ "dist",
8
+ "README.md",
9
+ "LICENSE"
8
10
  ],
11
+ "sideEffects": false,
9
12
  "author": "Tomxuetao",
10
- "license": "ISC",
13
+ "license": "MIT",
11
14
  "main": "./dist/index.cjs",
12
- "module": "./dist/index.js",
13
- "types": "./dist/index.d.ts",
15
+ "module": "./dist/index.mjs",
16
+ "types": "./dist/index.d.mts",
14
17
  "exports": {
15
18
  ".": {
16
- "types": "./dist/index.d.ts",
17
- "import": "./dist/index.js",
18
- "require": "./dist/index.cjs"
19
+ "import": {
20
+ "types": "./dist/index.d.mts",
21
+ "default": "./dist/index.mjs"
22
+ },
23
+ "require": {
24
+ "types": "./dist/index.d.cts",
25
+ "default": "./dist/index.cjs"
26
+ }
19
27
  }
20
28
  },
21
29
  "keywords": [
22
30
  "ol",
23
31
  "map",
32
+ "mvt",
33
+ "tianditu",
24
34
  "openlayers",
35
+ "vector-tile",
25
36
  "openlayers-utils"
26
37
  ],
27
38
  "dependencies": {
28
39
  "gcoord": "^1.0.7",
29
40
  "mitt": "^3.0.1",
30
- "ol": "^10.9.0"
41
+ "ol-mapbox-style": "^13.4.3",
42
+ "tdt-vts-core": "^1.0.0"
31
43
  },
32
44
  "peerDependencies": {
33
- "ol": ">=10.5.0"
45
+ "ol": "^10.10.0"
34
46
  },
35
47
  "scripts": {
36
- "build": "tsup",
37
- "dev": "tsup --watch"
48
+ "build": "tsdown",
49
+ "check:types": "tsc --noEmit",
50
+ "dev": "tsdown --watch",
51
+ "test": "pnpm run build && pnpm run check:types && node --test \"test/**/*.test.ts\""
38
52
  }
39
53
  }