map-ol-utils 0.1.27 → 0.1.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -69,6 +69,7 @@ var index_exports = {};
69
69
  __export(index_exports, {
70
70
  GeometryType: () => GeometryType,
71
71
  activeFeatureByUid: () => activeFeatureByUid,
72
+ addFeaturesByLayer: () => addFeaturesByLayer,
72
73
  addMassMarksLayer: () => addMassMarksLayer,
73
74
  appendFeaturesByLayer: () => appendFeaturesByLayer,
74
75
  buildMassMarksStyles: () => buildMassMarksStyles,
@@ -126,19 +127,9 @@ var import_Map = __toESM(require("ol/Map"), 1);
126
127
  var import_View = __toESM(require("ol/View"), 1);
127
128
  var import_control = require("ol/control");
128
129
 
129
- // src/layer-utils.ts
130
- var import_format = require("ol/format");
131
- var import_ol = require("ol");
132
- var import_Cluster = __toESM(require("ol/source/Cluster"), 1);
133
- var import_interaction = require("ol/interaction");
134
- var import_Circle = __toESM(require("ol/style/Circle"), 1);
130
+ // src/overlay.ts
135
131
  var import_gcoord = __toESM(require("gcoord"), 1);
136
- var import_Vector = __toESM(require("ol/layer/Vector"), 1);
137
- var import_Vector2 = __toESM(require("ol/source/Vector"), 1);
138
- var import_geom = require("ol/geom");
139
- var import_condition = require("ol/events/condition");
140
- var import_extent = require("ol/extent");
141
- var import_style = require("ol/style");
132
+ var import_ol = require("ol");
142
133
  var removeOverlays = (key = "") => {
143
134
  if (instance) {
144
135
  const overlays = instance.getOverlays().getArray().filter((overlay) => overlay.get(key || "position"));
@@ -164,6 +155,18 @@ var createAnimationMarker = (imgUrl, data) => {
164
155
  overlay.set("_isAnimationMarker", true);
165
156
  instance.addOverlay(overlay);
166
157
  };
158
+ var createOverlay = (config = { id: "popup-container", positioning: "top-center" }) => {
159
+ return new import_ol.Overlay(
160
+ Object.assign(
161
+ {
162
+ element: document.getElementById(config.id) || void 0
163
+ },
164
+ config
165
+ )
166
+ );
167
+ };
168
+
169
+ // src/layer-manager.ts
167
170
  var resetActiveVector = () => {
168
171
  removeOverlays();
169
172
  const layers = instance.getAllLayers();
@@ -172,167 +175,6 @@ var resetActiveVector = () => {
172
175
  interaction == null ? void 0 : interaction.getFeatures().clear();
173
176
  });
174
177
  };
175
- var setFitViewByCoords = (coords, mapInstance = instance, fitOptions) => {
176
- const view = mapInstance.getView();
177
- if (coords.length === 1) {
178
- view.animate(__spreadValues({
179
- zoom: 14,
180
- duration: 1e3,
181
- center: coords[0]
182
- }, fitOptions || {}));
183
- } else {
184
- const extent = (0, import_extent.boundingExtent)(coords);
185
- view.fit(extent, __spreadValues({
186
- padding: [50, 50, 50, 50],
187
- duration: 1e3
188
- }, fitOptions || {}));
189
- }
190
- };
191
- var setFitViewByGeom = (geom, mapInstance = instance, fitOptions) => {
192
- mapInstance.getView().fit(geom, __spreadValues({
193
- padding: [50, 50, 50, 50],
194
- duration: 1e3
195
- }, fitOptions || {}));
196
- };
197
- var setFitViewByLayer = (layer, mapInstance = instance, fitOptions) => {
198
- var _a;
199
- const extent = ((_a = layer.getSource()) == null ? void 0 : _a.getExtent()) || [];
200
- mapInstance.getView().fit(extent, __spreadValues({
201
- padding: [50, 50, 50, 50],
202
- duration: 1e3
203
- }, fitOptions || {}));
204
- };
205
- var assembleGeoJson = (dataList, config) => {
206
- const { key, crsForm } = config;
207
- const tempList = [];
208
- dataList.forEach((item) => {
209
- try {
210
- const pathArray = Array.isArray(item[key]) ? item[key] : JSON.parse(item[key] || "[]");
211
- if (pathArray.length) {
212
- const type = item["geoType"] || determineGeometryType(pathArray);
213
- if (type !== "Invalid" /* Invalid */) {
214
- tempList.push({
215
- type: "Feature",
216
- properties: __spreadValues({}, item),
217
- geometry: {
218
- type,
219
- coordinates: pathArray
220
- }
221
- });
222
- }
223
- }
224
- } catch (e) {
225
- console.error(`\u521B\u5EFA\u7EBF\u72B6\u6570\u636E\u5931\u8D25\uFF1A${e}`);
226
- }
227
- });
228
- return import_gcoord.default.transform(
229
- { type: "FeatureCollection", features: tempList },
230
- crsForm || import_gcoord.default.WGS84,
231
- import_gcoord.default.WGS84
232
- );
233
- };
234
- var createVectorStyle = (feature, config) => {
235
- const {
236
- isLine,
237
- colorMap,
238
- fillColor,
239
- colorKey,
240
- strokeColor,
241
- fillOpacity,
242
- strokeWeight,
243
- activeFillColor,
244
- activeFillOpacity,
245
- activeStrokeColor,
246
- activeStrokeWeight
247
- } = config || {};
248
- const data = feature.getProperties();
249
- const activeStyle = new import_style.Style({
250
- stroke: new import_style.Stroke({
251
- width: activeStrokeWeight || strokeWeight || 4,
252
- color: activeStrokeColor || (colorKey ? (colorMap == null ? void 0 : colorMap.get(data[colorKey])) || strokeColor : strokeColor)
253
- })
254
- });
255
- const unActiveStyle = new import_style.Style({
256
- stroke: new import_style.Stroke({
257
- width: strokeWeight || 2,
258
- color: colorKey ? (colorMap == null ? void 0 : colorMap.get(data[colorKey])) || strokeColor : strokeColor
259
- })
260
- });
261
- if (!isLine) {
262
- activeStyle.setFill(
263
- new import_style.Fill({
264
- color: hexToRgba(
265
- activeFillColor || fillColor || "",
266
- activeFillOpacity || 1
267
- ) || hexToRgba(
268
- (colorKey ? (colorMap == null ? void 0 : colorMap.get(data[colorKey])) || fillColor : fillColor) || "",
269
- fillOpacity || 1
270
- )
271
- })
272
- );
273
- unActiveStyle.setFill(
274
- new import_style.Fill({
275
- color: hexToRgba(
276
- (colorKey ? (colorMap == null ? void 0 : colorMap.get(data[colorKey])) || fillColor : fillColor) || "",
277
- fillOpacity || 1
278
- )
279
- })
280
- );
281
- }
282
- feature.setProperties(
283
- Object.assign(data, {
284
- activeStyle,
285
- unActiveStyle
286
- })
287
- );
288
- return unActiveStyle;
289
- };
290
- var createBusinessLayer = (dataList, config) => {
291
- const { isAutoFit, layerName, openClick } = config;
292
- const geoJson = assembleGeoJson(dataList, config);
293
- const vectorLayer = new import_Vector.default({
294
- zIndex: 5,
295
- className: layerName ? layerName : "ol-layer",
296
- source: new import_Vector2.default({
297
- features: new import_format.GeoJSON().readFeatures(geoJson).map((feature) => {
298
- feature.setStyle(createVectorStyle(feature, config));
299
- return feature;
300
- })
301
- })
302
- });
303
- if (openClick) {
304
- createSelectByLayer(vectorLayer);
305
- }
306
- vectorLayer.setProperties({
307
- _isCustom: true,
308
- _isAutoFit: isAutoFit,
309
- _isVectorLayer: true,
310
- _vectorConfig: config,
311
- _layerName: layerName,
312
- _dataList: [...dataList],
313
- _uuidSet: new Set(dataList.map((item) => item._uuid) || [])
314
- });
315
- return vectorLayer;
316
- };
317
- var appendFeaturesByLayer = (targetLayer, dataList, crsForm) => {
318
- const vectorSource = targetLayer.getSource();
319
- const tempSet = targetLayer.get("_uuidSet") || /* @__PURE__ */ new Set();
320
- dataList.forEach((item) => tempSet.add(item._uuid));
321
- targetLayer.set("_uuidSet", tempSet);
322
- const { _vectorConfig: config } = targetLayer.getProperties() || {};
323
- const geoJson = assembleGeoJson(
324
- dataList,
325
- Object.assign({}, config, { crsForm })
326
- );
327
- vectorSource.addFeatures(
328
- new import_format.GeoJSON().readFeatures(geoJson).map((feature) => {
329
- feature.setStyle(createVectorStyle(feature, config));
330
- return feature;
331
- })
332
- );
333
- };
334
- var createVectorFaceLayer = (dataList = [], config) => createBusinessLayer(dataList, Object.assign({}, config, { isLine: false }));
335
- var createVectorLineLayer = (dataList = [], config) => createBusinessLayer(dataList, Object.assign({}, config, { isLine: true }));
336
178
  var removeAllLayers = () => {
337
179
  removeOverlays();
338
180
  if (instance) {
@@ -395,57 +237,416 @@ var activeFeatureByUid = (uid) => {
395
237
  }
396
238
  }
397
239
  };
398
- var buildMassMarksStyles = (getImgUrlFn) => {
399
- return (iconConfig) => {
400
- const {
401
- baseUrl,
402
- markerIcon,
403
- statusNum = 5,
404
- activeScale = 1.3,
405
- markerSize = [32, 32]
406
- } = iconConfig;
407
- const getMarkerUrl = getImgUrlFn(baseUrl);
408
- const [x, y] = markerSize;
409
- const massMarksStyles = new Array(statusNum * 2);
410
- for (let i = 0; i < statusNum; i++) {
411
- const imageUrl = getMarkerUrl(`${markerIcon}-${i}`, ".webp");
412
- massMarksStyles[i] = new import_style.Style({
413
- zIndex: 88 + i,
414
- image: new import_style.Icon({
415
- width: x,
416
- height: y,
417
- src: imageUrl,
418
- anchor: [0.5, 1]
419
- })
420
- });
421
- const activeImage = getMarkerUrl(`${markerIcon}-${i}-active`, ".webp");
422
- massMarksStyles[i + statusNum] = new import_style.Style({
423
- zIndex: 120,
424
- image: new import_style.Icon({
425
- width: x * activeScale,
426
- height: y * activeScale,
427
- anchor: [0.5, 1],
428
- src: activeImage ? activeImage : imageUrl
429
- })
430
- });
240
+
241
+ // src/create-map.ts
242
+ var import_interaction = require("ol/interaction");
243
+
244
+ // src/base-layer.ts
245
+ var import_source = require("ol/source");
246
+ var import_tilegrid = require("ol/tilegrid");
247
+ var import_layer = require("ol/layer");
248
+ var import_WMTS = __toESM(require("ol/tilegrid/WMTS"), 1);
249
+
250
+ // src/constants.ts
251
+ var DEFAULT_TIANDITU_TK = "c77eddc667c5bed016fded560baf93e7";
252
+ var DEFAULT_ZHEJIANG_TOKEN = "3b0cdd02-c366-4363-b6de-081a9f12b364";
253
+
254
+ // src/base-layer.ts
255
+ var createBaseLayer = (layerName = "hzsyvector_dark") => {
256
+ const config = {
257
+ zIndex: -5,
258
+ preload: 1,
259
+ minZoom: 8,
260
+ maxZoom: 21,
261
+ source: new import_source.XYZ({
262
+ tileGrid: new import_tilegrid.TileGrid({
263
+ tileSize: 256,
264
+ resolutions: [
265
+ 0.00549933137253187,
266
+ 0.00274966568626595,
267
+ 0.00137483284313297,
268
+ 687416421566485e-18,
269
+ 343708210783242e-18,
270
+ 171854105391621e-18,
271
+ 859270526958104e-19,
272
+ 429635263479052e-19,
273
+ 214817631739526e-19,
274
+ 107408815869763e-19,
275
+ 537044079348816e-20,
276
+ 268522039674407e-20,
277
+ 134261019837204e-20
278
+ ],
279
+ origin: [118.122911693886, 31.2869311022836],
280
+ extent: [
281
+ 116.43263049006,
282
+ 28.6201742126026,
283
+ 123.705594256347,
284
+ 31.9765041681924
285
+ ]
286
+ }),
287
+ projection: "EPSG:4326",
288
+ urls: [
289
+ `https://cb.hangzhoumap.gov.cn/E36CCEA93443D1495DB9B9F2B2FFE348CB1A367D75176F815040AB19E54CDCA5DAAA25813AF965E2ABD0CC2463DD1223/PBS/rest/services/hzsyvector_dark/Mapserver/tile/${layerName}/{z}/{y}/{x}`
290
+ ]
291
+ }),
292
+ properties: {
293
+ _isBaseLayer: true,
294
+ _layerName: layerName
431
295
  }
432
- return massMarksStyles;
433
296
  };
297
+ return new import_layer.Tile(config);
434
298
  };
435
- var selectEventHandle = (vectorLayer, feature) => {
436
- const data = feature.getProperties();
437
- const { activeStyle } = data;
438
- feature.setStyle(activeStyle);
439
- emitter_default.emit("selected-feature", data);
440
- vectorLayer.set("_hasActive", true);
441
- if (vectorLayer.get("_isDynamic")) {
442
- const activeImage = activeStyle.getImage();
443
- setTimeout(() => {
444
- emitter_default.emit(
445
- "dynamic-marker",
446
- Object.assign({}, data.rawData || {}, {
447
- lnglat: data.lnglat,
448
- style: data.style,
299
+ var createMapWorldLayer = (layerName, tk = DEFAULT_TIANDITU_TK) => {
300
+ const [name, matrixSet] = layerName.split("_");
301
+ const config = {
302
+ preload: 1,
303
+ zIndex: -10,
304
+ cacheSize: 20240,
305
+ properties: {
306
+ _isBaseLayer: true,
307
+ _layerName: layerName
308
+ },
309
+ source: new import_source.WMTS({
310
+ crossOrigin: "anonymous",
311
+ projection: "EPSG:4326",
312
+ wrapX: true,
313
+ layer: name,
314
+ style: "default",
315
+ version: "1.0.0",
316
+ format: "image/png",
317
+ matrixSet,
318
+ tileGrid: new import_WMTS.default({
319
+ tileSize: 256,
320
+ origin: [-180, 90],
321
+ matrixIds: [
322
+ "1",
323
+ "2",
324
+ "3",
325
+ "4",
326
+ "5",
327
+ "6",
328
+ "7",
329
+ "8",
330
+ "9",
331
+ "10",
332
+ "11",
333
+ "12",
334
+ "13",
335
+ "14",
336
+ "15",
337
+ "16",
338
+ "17",
339
+ "18",
340
+ "19"
341
+ ],
342
+ resolutions: [
343
+ 0.703125,
344
+ 0.3515625,
345
+ 0.17578125,
346
+ 0.087890625,
347
+ 0.0439453125,
348
+ 0.02197265625,
349
+ 0.010986328125,
350
+ 0.0054931640625,
351
+ 0.00274658203125,
352
+ 0.001373291015625,
353
+ 6866455078125e-16,
354
+ 34332275390625e-17,
355
+ 171661376953125e-18,
356
+ 858306884765625e-19,
357
+ 4291534423828125e-20,
358
+ 21457672119140625e-21,
359
+ 10728836059570312e-21,
360
+ 5364418029785156e-21,
361
+ 2682209014892578e-21
362
+ ]
363
+ }),
364
+ url: `https://t{0-7}.tianditu.gov.cn/${layerName}/wmts?tk=${tk}`
365
+ })
366
+ };
367
+ return new import_layer.Tile(config);
368
+ };
369
+ var createZheJiangLayer = (layerName = "emap", tk = DEFAULT_ZHEJIANG_TOKEN) => {
370
+ return new import_layer.Tile({
371
+ preload: 1,
372
+ minZoom: 4,
373
+ maxZoom: 20,
374
+ zIndex: -10,
375
+ cacheSize: 20240,
376
+ source: new import_source.XYZ({
377
+ wrapX: true,
378
+ projection: "EPSG:4326",
379
+ crossOrigin: "anonymous",
380
+ url: `https://ditu{0-6}.zjzwfw.gov.cn/services/wmts/${layerName}/default/oss/getTile/{z}/{y}/{x}?token=${tk}`
381
+ })
382
+ });
383
+ };
384
+ var getLayerByName = (name) => instance.getAllLayers().find((item) => (item.get("_layerName") || item.getClassName()) === name);
385
+ var removeLayerByName = (name) => {
386
+ const layer = getLayerByName(name);
387
+ if (layer) {
388
+ const source = layer.getSource();
389
+ if (source && source.dispose) {
390
+ source.dispose();
391
+ }
392
+ instance.removeLayer(layer);
393
+ layer.dispose();
394
+ }
395
+ };
396
+ var changeLayersByNames = (activeNames, allLayerNames) => {
397
+ const changeLayers = instance.getAllLayers().filter((item) => allLayerNames.includes(item.getClassName()));
398
+ changeLayers.forEach((layer) => {
399
+ layer.setVisible(activeNames == null ? void 0 : activeNames.includes(layer.getClassName()));
400
+ });
401
+ };
402
+
403
+ // src/create-map.ts
404
+ var instance;
405
+ var mapCenter = [119.71512016971076, 30.122490541963536];
406
+ var createMapInstance = (config = {}) => {
407
+ if (instance) {
408
+ return instance;
409
+ }
410
+ instance = createMap(config);
411
+ return instance;
412
+ };
413
+ var createMap = (config = {}) => {
414
+ const innerConfig = Object.assign(
415
+ {
416
+ zoom: 9.4,
417
+ maxZoom: 18,
418
+ minZoom: 9.4,
419
+ center: mapCenter,
420
+ baseLayer: "vec-layer",
421
+ projection: "EPSG:4326",
422
+ layers: [createBaseLayer()],
423
+ constrainResolution: false,
424
+ smoothExtentConstraint: false,
425
+ tk: DEFAULT_TIANDITU_TK
426
+ },
427
+ config || {}
428
+ );
429
+ const map = new import_Map.default({
430
+ view: new import_View.default(innerConfig),
431
+ controls: (0, import_control.defaults)({
432
+ zoom: false,
433
+ rotate: false,
434
+ attribution: false
435
+ }),
436
+ interactions: (0, import_interaction.defaults)({
437
+ pinchRotate: false,
438
+ doubleClickZoom: false,
439
+ altShiftDragRotate: false
440
+ }),
441
+ layers: innerConfig.layers || [createBaseLayer()]
442
+ });
443
+ mapCenter = innerConfig.center || mapCenter;
444
+ map.activeBaseLayer = innerConfig.baseLayer;
445
+ map.getLayerByName = getLayerByName;
446
+ map.removeLayerByName = removeLayerByName;
447
+ map.changeLayersByNames = changeLayersByNames;
448
+ map.on("pointermove", (evt) => {
449
+ map.getTargetElement().style.cursor = map.hasFeatureAtPixel(evt.pixel) ? "pointer" : "";
450
+ });
451
+ return map;
452
+ };
453
+ var disposeMap = () => {
454
+ instance.getOverlays().forEach((overlay) => {
455
+ instance.removeOverlay(overlay);
456
+ });
457
+ instance.getInteractions().clear();
458
+ const layers = instance.getAllLayers();
459
+ layers.forEach((layer) => {
460
+ const source = layer.getSource();
461
+ if (source && source.dispose) {
462
+ source.dispose();
463
+ }
464
+ instance.removeLayer(layer);
465
+ layer.dispose();
466
+ });
467
+ instance.setTarget("");
468
+ instance.dispose();
469
+ instance = void 0;
470
+ };
471
+ var getMapInstance = () => instance;
472
+ var resetZoomAndCenter = (center = mapCenter) => {
473
+ if (instance) {
474
+ const view = instance.getView();
475
+ view.animate({
476
+ zoom: 9.4,
477
+ center,
478
+ duration: 1e3
479
+ });
480
+ }
481
+ };
482
+ var resetMap = (config = { center: mapCenter, isClearAll: true }) => {
483
+ removeAllLayers();
484
+ resetZoomAndCenter(config.center || mapCenter);
485
+ };
486
+
487
+ // src/helper.ts
488
+ var hexToRgba = (hex, alpha) => {
489
+ if (hex.startsWith("#")) {
490
+ let tempHex = hex.replace("#", "");
491
+ if (tempHex.length === 3) {
492
+ tempHex = tempHex[0] + tempHex[0] + tempHex[1] + tempHex[1] + tempHex[2] + tempHex[2];
493
+ }
494
+ const r = parseInt(tempHex.substring(0, 2), 16);
495
+ const g = parseInt(tempHex.substring(2, 4), 16);
496
+ const b = parseInt(tempHex.substring(4, 6), 16);
497
+ return `rgba(${r}, ${g}, ${b}, ${alpha})`;
498
+ } else {
499
+ return hex;
500
+ }
501
+ };
502
+ var getLayersDataList = () => {
503
+ var _a;
504
+ return ((_a = instance) == null ? void 0 : _a.getAllLayers().map((layer) => layer.get("_dataList") || []).flat(2)) || [];
505
+ };
506
+ var determineGeometryType = (coordinates) => {
507
+ const getArrayDepth = (arr) => {
508
+ if (!Array.isArray(arr) || arr.length === 0) return 0;
509
+ return 1 + getArrayDepth(arr[0]);
510
+ };
511
+ const isClosedRing = (coords) => {
512
+ if (!Array.isArray(coords) || coords.length < 3) return false;
513
+ const first = coords[0];
514
+ const last = coords[coords.length - 1];
515
+ return first[0] === last[0] && first[1] === last[1];
516
+ };
517
+ const isValidCoordinate = (coord) => {
518
+ return Array.isArray(coord) && coord.length >= 2 && typeof coord[0] === "number" && typeof coord[1] === "number";
519
+ };
520
+ const isValidLineString = (coords) => {
521
+ return Array.isArray(coords) && coords.length >= 2 && coords.every(isValidCoordinate);
522
+ };
523
+ const isValidPolygon = (coords) => {
524
+ if (!Array.isArray(coords)) return false;
525
+ const rings = getArrayDepth(coords) === 2 ? [coords] : coords;
526
+ return rings.every(
527
+ (ring) => Array.isArray(ring) && ring.length >= 4 && isClosedRing(ring) && ring.every(isValidCoordinate)
528
+ );
529
+ };
530
+ const depth = getArrayDepth(coordinates);
531
+ try {
532
+ if (depth < 2 || !coordinates || coordinates.length === 0) {
533
+ return "Invalid" /* Invalid */;
534
+ } else if (depth === 2 && isValidLineString(coordinates)) {
535
+ return isClosedRing(coordinates) && coordinates.length >= 4 ? "Polygon" /* Polygon */ : "LineString" /* LineString */;
536
+ } else if (depth === 3 && Array.isArray(coordinates) && coordinates.every(isValidLineString)) {
537
+ if (isValidPolygon(coordinates)) {
538
+ return "Polygon" /* Polygon */;
539
+ } else if (coordinates.every((arr) => !isClosedRing(arr))) {
540
+ return "MultiLineString" /* MultiLineString */;
541
+ } else {
542
+ return "Invalid" /* Invalid */;
543
+ }
544
+ } else if (depth === 4 && Array.isArray(coordinates) && coordinates.every((rings) => isValidPolygon(rings))) {
545
+ return "MultiPolygon" /* MultiPolygon */;
546
+ } else {
547
+ return "Invalid" /* Invalid */;
548
+ }
549
+ } catch (error) {
550
+ console.error("Error analyzing coordinates:", error);
551
+ return "Invalid" /* Invalid */;
552
+ }
553
+ };
554
+
555
+ // src/ogc-utils.ts
556
+ var import_source2 = require("ol/source");
557
+ var import_Tile = __toESM(require("ol/layer/Tile"), 1);
558
+ var import_format = require("ol/format");
559
+ var import_WMTS2 = require("ol/source/WMTS");
560
+ var parser = new import_format.WMTSCapabilities();
561
+ var capabilitiesMap = /* @__PURE__ */ new Map();
562
+ var getCapabilities = (url) => {
563
+ return new Promise((resolve) => {
564
+ const capabilities = capabilitiesMap.get(url);
565
+ if (capabilities) {
566
+ resolve(capabilities);
567
+ } else {
568
+ fetch(url).then((data) => data.text()).then((text) => {
569
+ const capabilities2 = parser.read(text);
570
+ capabilitiesMap.set(url, capabilities2);
571
+ resolve(capabilities2);
572
+ });
573
+ }
574
+ });
575
+ };
576
+ var createWmtsLayer = (serverUrl) => (config) => __async(null, null, function* () {
577
+ const { style, format, version, layerName, matrixSet } = config;
578
+ const [workspace, datastore] = layerName.split(":");
579
+ const capabilitiesUrl = `${serverUrl}/${workspace}/${datastore}/gwc/service/wmts?request=GetCapabilities`;
580
+ return new Promise((resolve, reject) => {
581
+ getCapabilities(capabilitiesUrl).then((data) => {
582
+ const options = (0, import_WMTS2.optionsFromCapabilities)(data, {
583
+ Style: style || "",
584
+ layer: datastore,
585
+ version: version || "1.1.0",
586
+ format: format || "image/png",
587
+ matrixSet: matrixSet || "EPSG:4326"
588
+ });
589
+ if (options) {
590
+ resolve(
591
+ new import_Tile.default({
592
+ zIndex: 3,
593
+ className: layerName,
594
+ source: new import_source2.WMTS(options)
595
+ })
596
+ );
597
+ } else {
598
+ reject(new Error("Unable to create TileLayer"));
599
+ }
600
+ });
601
+ });
602
+ });
603
+
604
+ // src/view-fit.ts
605
+ var import_extent = require("ol/extent");
606
+ var DEFAULT_FIT_OPTIONS = {
607
+ padding: [50, 50, 50, 50],
608
+ duration: 1e3
609
+ };
610
+ var setFitViewByCoords = (coords, mapInstance = instance, fitOptions) => {
611
+ const view = mapInstance.getView();
612
+ if (coords.length === 1) {
613
+ view.animate(__spreadValues({
614
+ zoom: 14,
615
+ duration: 1e3,
616
+ center: coords[0]
617
+ }, fitOptions || {}));
618
+ } else {
619
+ const extent = (0, import_extent.boundingExtent)(coords);
620
+ view.fit(extent, __spreadValues(__spreadValues({}, DEFAULT_FIT_OPTIONS), fitOptions || {}));
621
+ }
622
+ };
623
+ var setFitViewByGeom = (geom, mapInstance = instance, fitOptions) => {
624
+ mapInstance.getView().fit(geom, __spreadValues(__spreadValues({}, DEFAULT_FIT_OPTIONS), fitOptions || {}));
625
+ };
626
+ var setFitViewByLayer = (layer, mapInstance = instance, fitOptions) => {
627
+ var _a;
628
+ const extent = ((_a = layer.getSource()) == null ? void 0 : _a.getExtent()) || [];
629
+ mapInstance.getView().fit(extent, __spreadValues(__spreadValues({}, DEFAULT_FIT_OPTIONS), fitOptions || {}));
630
+ };
631
+
632
+ // src/select.ts
633
+ var import_extent2 = require("ol/extent");
634
+ var import_interaction2 = require("ol/interaction");
635
+ var import_condition = require("ol/events/condition");
636
+ var selectEventHandle = (vectorLayer, feature) => {
637
+ const data = feature.getProperties();
638
+ const { activeStyle } = data;
639
+ feature.setStyle(activeStyle);
640
+ emitter_default.emit("selected-feature", data);
641
+ vectorLayer.set("_hasActive", true);
642
+ if (vectorLayer.get("_isDynamic")) {
643
+ const activeImage = activeStyle.getImage();
644
+ setTimeout(() => {
645
+ emitter_default.emit(
646
+ "dynamic-marker",
647
+ Object.assign({}, data.rawData || {}, {
648
+ lnglat: data.lnglat,
649
+ style: data.style,
449
650
  crsForm: data.crsForm,
450
651
  width: activeImage.getWidth(),
451
652
  height: activeImage.getHeight()
@@ -459,12 +660,12 @@ var selectEventHandle = (vectorLayer, feature) => {
459
660
  view.animate({
460
661
  duration: 1e3,
461
662
  zoom: view.getZoom(),
462
- center: (0, import_extent.getCenter)(feature.getGeometry().getExtent())
663
+ center: (0, import_extent2.getCenter)(feature.getGeometry().getExtent())
463
664
  });
464
665
  }
465
666
  };
466
667
  var createSelectByLayer = (vectorLayer) => {
467
- const interaction = new import_interaction.Select({
668
+ const interaction = new import_interaction2.Select({
468
669
  style: null,
469
670
  multi: false,
470
671
  hitTolerance: 10,
@@ -477,626 +678,457 @@ var createSelectByLayer = (vectorLayer) => {
477
678
  hasFeature = true;
478
679
  },
479
680
  {
480
- layerFilter: (layer) => layer === vectorLayer
481
- }
482
- );
483
- return (0, import_condition.singleClick)(evt) && hasFeature;
484
- }
485
- });
486
- interaction.on("select", (evt) => {
487
- const { selected, deselected } = evt;
488
- if (selected.length) {
489
- const feature = selected[0];
490
- const isClusterLayer = vectorLayer.get("_isClusterLayer");
491
- if (isClusterLayer) {
492
- const features = feature.get("features");
493
- if (features.length === 1) {
494
- selectEventHandle(vectorLayer, features[0]);
495
- }
496
- } else {
497
- selectEventHandle(vectorLayer, feature);
498
- }
499
- }
500
- if (deselected.length) {
501
- const feature = deselected[0];
502
- const data = feature.getProperties();
503
- feature.setStyle(data.unActiveStyle);
504
- vectorLayer.set("_hasActive", false);
505
- }
506
- });
507
- instance.addInteraction(interaction);
508
- vectorLayer.set("_selectInteraction", interaction);
509
- return interaction;
510
- };
511
- var createMassMarksLayer = (dataList, styleList = []) => {
512
- const features = dataList.map((item) => {
513
- const { crsForm } = item;
514
- const coord = import_gcoord.default.transform(
515
- [+item.lnglat[0], +item.lnglat[1]],
516
- crsForm || import_gcoord.default.WGS84,
517
- import_gcoord.default.WGS84
518
- );
519
- const feature = new import_ol.Feature({
520
- geometry: new import_geom.Point(coord)
521
- });
522
- feature.setProperties(__spreadProps(__spreadValues({}, item), {
523
- unActiveStyle: styleList[item.style],
524
- activeStyle: styleList[item.style + styleList.length / 2]
525
- }));
526
- feature.setStyle(styleList[item.style]);
527
- return feature;
528
- });
529
- const vectorLayer = new import_Vector.default({
530
- zIndex: 2e3,
531
- source: new import_Vector2.default({
532
- features
533
- })
534
- });
535
- vectorLayer.setProperties({
536
- _isCustom: true,
537
- _isVectorLayer: true,
538
- _isMassMarksLayer: true,
539
- _statusNum: styleList.length / 2,
540
- _dataList: [...dataList],
541
- _uuidSet: new Set(dataList.map((item) => item._uuid) || [])
542
- });
543
- return vectorLayer;
544
- };
545
- var addMassMarksLayer = (getImgUrlFn) => {
546
- return (dataList = [], iconConfig, openClick = true) => {
547
- const {
548
- offset = [0, 0],
549
- baseUrl,
550
- hasLine,
551
- hasFace,
552
- layerName,
553
- isDynamic,
554
- isAutoFit,
555
- statusNum,
556
- markerIcon,
557
- marksStyles,
558
- markerSize,
559
- activeScale,
560
- vectorConfig
561
- } = iconConfig;
562
- const massMarksStyles = marksStyles ? marksStyles : buildMassMarksStyles(getImgUrlFn)({
563
- baseUrl,
564
- markerIcon,
565
- markerSize,
566
- statusNum: statusNum || 5,
567
- activeScale: activeScale || 1.3
568
- });
569
- const massMarksLayer = createMassMarksLayer(dataList, massMarksStyles);
570
- if (openClick) {
571
- massMarksLayer.setProperties({
572
- _offset: offset,
573
- _isAutoFit: isAutoFit
574
- });
575
- createSelectByLayer(massMarksLayer);
576
- }
577
- if (hasLine) {
578
- const vectorLayer = createBusinessLayer(
579
- dataList,
580
- Object.assign(
581
- {},
582
- {
583
- key: "line",
584
- isLine: true,
585
- openClick: false,
586
- strokeWeight: 4,
587
- strokeColor: "rgba(29, 235, 255, 0.8)"
588
- },
589
- vectorConfig || {}
590
- )
591
- );
592
- instance.addLayer(vectorLayer);
593
- }
594
- if (hasFace) {
595
- const vectorLayer = createBusinessLayer(
596
- dataList,
597
- Object.assign(
598
- {},
599
- {
600
- isLine: false,
601
- key: "faceList",
602
- strokeWeight: 1,
603
- openClick: false,
604
- fillColor: "#4247DF",
605
- strokeStyle: "dashed",
606
- strokeColor: "#4247DF"
607
- },
608
- vectorConfig || {}
609
- )
681
+ layerFilter: (layer) => layer === vectorLayer
682
+ }
610
683
  );
611
- instance.addLayer(vectorLayer);
684
+ return (0, import_condition.singleClick)(evt) && hasFeature;
612
685
  }
613
- massMarksLayer.setProperties({
614
- _isCustom: true,
615
- _offset: offset,
616
- _hasLine: hasLine,
617
- _hasFace: hasFace,
618
- className: layerName,
619
- _layerName: layerName,
620
- _isVectorLayer: true,
621
- _isDynamic: isDynamic
622
- });
623
- instance.addLayer(massMarksLayer);
624
- return massMarksLayer;
625
- };
626
- };
627
- var updateMarksLayersByStatus = (checkedStatusList = []) => {
628
- const hideStyle = new import_style.Style({});
629
- const tempList = [];
630
- const targetLayers = instance.getAllLayers().filter((layer) => layer.get("_isMassMarksLayer"));
631
- targetLayers.forEach((layer) => {
632
- const features = layer.getSource().getFeatures();
633
- features.forEach((feature) => {
634
- const data = feature.getProperties();
635
- if (!checkedStatusList.includes(data.status)) {
636
- feature.setStyle(hideStyle);
686
+ });
687
+ interaction.on("select", (evt) => {
688
+ const { selected, deselected } = evt;
689
+ if (selected.length) {
690
+ const feature = selected[0];
691
+ const isClusterLayer = vectorLayer.get("_isClusterLayer");
692
+ if (isClusterLayer) {
693
+ const features = feature.get("features");
694
+ if (features.length === 1) {
695
+ selectEventHandle(vectorLayer, features[0]);
696
+ }
637
697
  } else {
638
- tempList.push(data);
639
- feature.setStyle(data.unActiveStyle);
698
+ selectEventHandle(vectorLayer, feature);
640
699
  }
641
- });
642
- });
643
- return tempList;
644
- };
645
- var createOverlay = (config = { id: "popup-container", positioning: "top-center" }) => {
646
- return new import_ol.Overlay(
647
- Object.assign(
648
- {
649
- element: document.getElementById(config.id) || void 0
650
- },
651
- config
652
- )
653
- );
654
- };
655
- var createClusterLayer = (dataList, config) => {
656
- const count = dataList.length;
657
- const styleCache = {};
658
- const {
659
- distance,
660
- minDistance,
661
- openClick,
662
- buildStyle,
663
- singleStyles,
664
- computedRadius,
665
- layerName = "cluster-layer"
666
- } = config;
667
- const innerComputedRadius = (size) => Math.pow(size / count, 1 / 18);
668
- styleCache[1] = singleStyles;
669
- const innerBuildStyle = (feature) => {
670
- const size = feature.get("features").length;
671
- let style = styleCache[size];
672
- const tempRadius = computedRadius ? computedRadius(size) : innerComputedRadius(size);
673
- if (!style) {
674
- style = new import_style.Style({
675
- image: new import_Circle.default({
676
- radius: tempRadius * 20,
677
- stroke: new import_style.Stroke({
678
- width: 2,
679
- color: `hsla(${180 - tempRadius * 180}, 100%, 40%, 1)`
680
- }),
681
- fill: new import_style.Fill({
682
- color: `hsla(${180 - tempRadius * 180}, 100%, 50%, 1)`
683
- })
684
- }),
685
- text: new import_style.Text({
686
- text: size.toString(),
687
- fill: new import_style.Fill({
688
- color: `hsla(${180 - tempRadius * 180}, 100%, 10%, 1)`
689
- }),
690
- textBaseline: "middle"
691
- })
692
- });
693
- styleCache[size] = style;
694
700
  }
695
- if (Array.isArray(style)) {
696
- const tempFeature = feature.get("features")[0];
697
- const index = tempFeature.get("styleIndex") || 0;
698
- tempFeature.setProperties({
699
- unActiveStyle: style[index],
700
- activeStyle: style[index + style.length / 2]
701
- });
702
- return style[index];
701
+ if (deselected.length) {
702
+ const feature = deselected[0];
703
+ const data = feature.getProperties();
704
+ feature.setStyle(data.unActiveStyle);
705
+ vectorLayer.set("_hasActive", false);
703
706
  }
704
- return style;
705
- };
706
- const vectorLayer = new import_Vector.default({
707
- zIndex: 200,
708
- className: layerName,
709
- source: new import_Cluster.default({
710
- distance: distance || 80,
711
- minDistance: minDistance || 0,
712
- source: new import_Vector2.default({
713
- features: dataList.map((item) => {
714
- const feature = new import_ol.Feature(new import_geom.Point(item.lnglat));
715
- feature.setProperties(item);
716
- return feature;
717
- })
718
- })
719
- }),
720
- style: (feature) => buildStyle ? buildStyle(feature) : innerBuildStyle(feature)
721
- });
722
- vectorLayer.setProperties({
723
- _isCustom: true,
724
- _isVectorLayer: true,
725
- _isClusterLayer: true
726
707
  });
727
- if (openClick) {
728
- createSelectByLayer(vectorLayer);
729
- }
730
- return vectorLayer;
708
+ instance.addInteraction(interaction);
709
+ vectorLayer.set("_selectInteraction", interaction);
710
+ return interaction;
731
711
  };
732
712
 
733
- // src/create-map.ts
734
- var import_interaction2 = require("ol/interaction");
735
-
736
- // src/base-layer.ts
737
- var import_source = require("ol/source");
738
- var import_source2 = require("ol/source");
739
- var import_tilegrid = require("ol/tilegrid");
740
- var import_layer = require("ol/layer");
741
- var import_WMTS = __toESM(require("ol/tilegrid/WMTS"), 1);
742
- var createBaseLayer = (layerName = "hzsyvector_dark") => {
743
- const config = {
744
- zIndex: -5,
745
- preload: 1,
746
- minZoom: 8,
747
- maxZoom: 21,
748
- source: new import_source.XYZ({
749
- tileGrid: new import_tilegrid.TileGrid({
750
- tileSize: 256,
751
- resolutions: [
752
- 0.00549933137253187,
753
- 0.00274966568626595,
754
- 0.00137483284313297,
755
- 687416421566485e-18,
756
- 343708210783242e-18,
757
- 171854105391621e-18,
758
- 859270526958104e-19,
759
- 429635263479052e-19,
760
- 214817631739526e-19,
761
- 107408815869763e-19,
762
- 537044079348816e-20,
763
- 268522039674407e-20,
764
- 134261019837204e-20
765
- ],
766
- origin: [118.122911693886, 31.2869311022836],
767
- extent: [
768
- 116.43263049006,
769
- 28.6201742126026,
770
- 123.705594256347,
771
- 31.9765041681924
772
- ]
773
- }),
774
- projection: "EPSG:4326",
775
- urls: [
776
- `https://ywtg.citybrain.hangzhou.gov.cn/${layerName}/{z}/{y}/{x}`,
777
- `https://ywtg.citybrain.hangzhou.gov.cn:9456/${layerName}/{z}/{y}/{x}`,
778
- `https://ywtg.citybrain.hangzhou.gov.cn:9457/${layerName}/{z}/{y}/{x}`,
779
- `https://ywtg.citybrain.hangzhou.gov.cn:9458/${layerName}/{z}/{y}/{x}`,
780
- `https://ywtg.citybrain.hangzhou.gov.cn:9459/${layerName}/{z}/{y}/{x}`
781
- ]
782
- }),
783
- properties: {
784
- _isBaseLayer: true,
785
- _layerName: layerName
786
- }
787
- };
788
- return new import_layer.Tile(config);
789
- };
790
- var createMapWorldLayer = (layerName, tk = "c77eddc667c5bed016fded560baf93e7") => {
791
- const [name, matrixSet] = layerName.split("_");
792
- const config = {
793
- preload: 1,
794
- zIndex: -10,
795
- cacheSize: 20240,
796
- properties: {
797
- _isBaseLayer: true,
798
- _layerName: layerName
799
- },
800
- source: new import_source2.WMTS({
801
- crossOrigin: "anonymous",
802
- projection: "EPSG:4326",
803
- wrapX: true,
804
- layer: name,
805
- style: "default",
806
- version: "1.0.0",
807
- format: "image/png",
808
- matrixSet,
809
- tileGrid: new import_WMTS.default({
810
- tileSize: 256,
811
- origin: [-180, 90],
812
- matrixIds: [
813
- "1",
814
- "2",
815
- "3",
816
- "4",
817
- "5",
818
- "6",
819
- "7",
820
- "8",
821
- "9",
822
- "10",
823
- "11",
824
- "12",
825
- "13",
826
- "14",
827
- "15",
828
- "16",
829
- "17",
830
- "18",
831
- "19"
832
- ],
833
- resolutions: [
834
- 0.703125,
835
- 0.3515625,
836
- 0.17578125,
837
- 0.087890625,
838
- 0.0439453125,
839
- 0.02197265625,
840
- 0.010986328125,
841
- 0.0054931640625,
842
- 0.00274658203125,
843
- 0.001373291015625,
844
- 6866455078125e-16,
845
- 34332275390625e-17,
846
- 171661376953125e-18,
847
- 858306884765625e-19,
848
- 4291534423828125e-20,
849
- 21457672119140625e-21,
850
- 10728836059570312e-21,
851
- 5364418029785156e-21,
852
- 2682209014892578e-21
853
- ]
854
- }),
855
- url: `https://t{0-7}.tianditu.gov.cn/${layerName}/wmts?tk=${tk}`
856
- })
857
- };
858
- return new import_layer.Tile(config);
713
+ // src/vector-layer.ts
714
+ var import_format2 = require("ol/format");
715
+ var import_gcoord2 = __toESM(require("gcoord"), 1);
716
+ var import_Vector = __toESM(require("ol/layer/Vector"), 1);
717
+ var import_Vector2 = __toESM(require("ol/source/Vector"), 1);
718
+ var import_style = require("ol/style");
719
+ var resolveColor = (data, colorKey, colorMap, fallback) => colorKey ? (colorMap == null ? void 0 : colorMap.get(data[colorKey])) || fallback : fallback;
720
+ var assembleGeoJson = (dataList, config) => {
721
+ const { key, crsForm } = config;
722
+ const tempList = [];
723
+ dataList.forEach((item) => {
724
+ try {
725
+ const raw = item[key];
726
+ const pathArray = Array.isArray(raw) ? raw : JSON.parse(raw || "[]");
727
+ if (pathArray.length) {
728
+ const type = item["geoType"] || determineGeometryType(pathArray);
729
+ if (type !== "Invalid" /* Invalid */) {
730
+ tempList.push({
731
+ type: "Feature",
732
+ properties: __spreadValues({}, item),
733
+ geometry: {
734
+ type,
735
+ coordinates: pathArray
736
+ }
737
+ });
738
+ }
739
+ }
740
+ } catch (e) {
741
+ console.error(`\u521B\u5EFA\u7EBF\u72B6\u6570\u636E\u5931\u8D25\uFF1A${e}`);
742
+ }
743
+ });
744
+ return import_gcoord2.default.transform(
745
+ { type: "FeatureCollection", features: tempList },
746
+ crsForm || import_gcoord2.default.WGS84,
747
+ import_gcoord2.default.WGS84
748
+ );
859
749
  };
860
- var createZheJiangLayer = (layerName = "emap", tk = "3b0cdd02-c366-4363-b6de-081a9f12b364") => {
861
- return new import_layer.Tile({
862
- preload: 1,
863
- minZoom: 4,
864
- maxZoom: 20,
865
- zIndex: -10,
866
- cacheSize: 20240,
867
- source: new import_source.XYZ({
868
- wrapX: true,
869
- projection: "EPSG:4326",
870
- crossOrigin: "anonymous",
871
- url: `https://ditu{0-6}.zjzwfw.gov.cn/services/wmts/${layerName}/default/oss/getTile/{z}/{y}/{x}?token=${tk}`
750
+ var createVectorStyle = (feature, config) => {
751
+ const {
752
+ isLine,
753
+ colorMap,
754
+ fillColor,
755
+ colorKey,
756
+ strokeColor,
757
+ fillOpacity,
758
+ strokeWeight,
759
+ activeFillColor,
760
+ activeFillOpacity,
761
+ activeStrokeColor,
762
+ activeStrokeWeight
763
+ } = config || {};
764
+ const data = feature.getProperties();
765
+ const activeStyle = new import_style.Style({
766
+ stroke: new import_style.Stroke({
767
+ width: activeStrokeWeight || strokeWeight || 4,
768
+ color: activeStrokeColor || resolveColor(data, colorKey, colorMap, strokeColor)
872
769
  })
873
770
  });
874
- };
875
- var getLayerByName = (name) => instance.getAllLayers().find((item) => (item.get("_layerName") || item.getClassName()) === name);
876
- var removeLayerByName = (name) => {
877
- const layer = instance.getAllLayers().find((item) => (item.get("_layerName") || item.getClassName()) === name);
878
- if (layer) {
879
- const source = layer.getSource();
880
- if (source && source.dispose) {
881
- source.dispose();
882
- }
883
- instance.removeLayer(layer);
884
- layer.dispose();
771
+ const unActiveStyle = new import_style.Style({
772
+ stroke: new import_style.Stroke({
773
+ width: strokeWeight || 2,
774
+ color: resolveColor(data, colorKey, colorMap, strokeColor)
775
+ })
776
+ });
777
+ if (!isLine) {
778
+ activeStyle.setFill(
779
+ new import_style.Fill({
780
+ color: hexToRgba(
781
+ activeFillColor || fillColor || "",
782
+ activeFillOpacity || 1
783
+ ) || hexToRgba(
784
+ resolveColor(data, colorKey, colorMap, fillColor) || "",
785
+ fillOpacity || 1
786
+ )
787
+ })
788
+ );
789
+ unActiveStyle.setFill(
790
+ new import_style.Fill({
791
+ color: hexToRgba(
792
+ resolveColor(data, colorKey, colorMap, fillColor) || "",
793
+ fillOpacity || 1
794
+ )
795
+ })
796
+ );
885
797
  }
886
- };
887
- var changeLayersByNames = (activeNames, allLayerNames) => {
888
- const changeLayers = instance.getAllLayers().filter((item) => allLayerNames.includes(item.getClassName()));
889
- changeLayers.forEach((layer) => {
890
- layer.setVisible(activeNames == null ? void 0 : activeNames.includes(layer.getClassName()));
798
+ feature.setProperties({
799
+ activeStyle,
800
+ unActiveStyle
891
801
  });
802
+ return unActiveStyle;
892
803
  };
893
-
894
- // src/create-map.ts
895
- var instance;
896
- var mapCenter = [119.71512016971076, 30.122490541963536];
897
- var createMapInstance = (config = {}) => {
898
- if (instance) {
899
- return instance;
804
+ var createBusinessLayer = (dataList, config) => {
805
+ const { isAutoFit, layerName, openClick } = config;
806
+ const geoJson = assembleGeoJson(dataList, config);
807
+ const vectorLayer = new import_Vector.default({
808
+ zIndex: 5,
809
+ className: layerName ? layerName : "ol-layer",
810
+ source: new import_Vector2.default({
811
+ features: new import_format2.GeoJSON().readFeatures(geoJson).map((feature) => {
812
+ feature.setStyle(createVectorStyle(feature, config));
813
+ return feature;
814
+ })
815
+ })
816
+ });
817
+ if (openClick) {
818
+ createSelectByLayer(vectorLayer);
900
819
  }
901
- instance = createMap(config);
902
- return instance;
820
+ vectorLayer.setProperties({
821
+ _isCustom: true,
822
+ _isAutoFit: isAutoFit,
823
+ _isVectorLayer: true,
824
+ _vectorConfig: config,
825
+ _layerName: layerName,
826
+ _dataList: [...dataList],
827
+ _uuidSet: new Set(dataList.map((item) => item._uuid) || [])
828
+ });
829
+ return vectorLayer;
903
830
  };
904
- var createMap = (config = {}) => {
905
- const innerConfig = Object.assign(
906
- {
907
- zoom: 9.4,
908
- maxZoom: 18,
909
- minZoom: 9.4,
910
- center: mapCenter,
911
- baseLayer: "vec-layer",
912
- projection: "EPSG:4326",
913
- layers: [createBaseLayer()],
914
- constrainResolution: false,
915
- smoothExtentConstraint: false,
916
- tk: "c77eddc667c5bed016fded560baf93e7"
917
- },
918
- config || {}
831
+ var appendFeaturesByLayer = (targetLayer, dataList, crsForm) => {
832
+ const vectorSource = targetLayer.getSource();
833
+ const tempSet = targetLayer.get("_uuidSet") || /* @__PURE__ */ new Set();
834
+ dataList.forEach((item) => tempSet.add(item._uuid));
835
+ targetLayer.set("_uuidSet", tempSet);
836
+ const { _vectorConfig: config } = targetLayer.getProperties() || {};
837
+ const geoJson = assembleGeoJson(
838
+ dataList,
839
+ Object.assign({}, config, { crsForm })
919
840
  );
920
- const instance2 = new import_Map.default({
921
- view: new import_View.default(innerConfig),
922
- controls: (0, import_control.defaults)({
923
- zoom: false,
924
- rotate: false,
925
- attribution: false
926
- }),
927
- interactions: (0, import_interaction2.defaults)({
928
- pinchRotate: false,
929
- doubleClickZoom: false,
930
- altShiftDragRotate: false
931
- }),
932
- layers: innerConfig.layers || [createBaseLayer()]
933
- });
934
- mapCenter = innerConfig.center || mapCenter;
935
- instance2.activeBaseLayer = innerConfig.baseLayer;
936
- instance2.getLayerByName = getLayerByName;
937
- instance2.removeLayerByName = removeLayerByName;
938
- instance2.changeLayersByNames = changeLayersByNames;
939
- instance2.on("pointermove", (evt) => {
940
- instance2.getTargetElement().style.cursor = instance2.hasFeatureAtPixel(
941
- evt.pixel
942
- ) ? "pointer" : "";
841
+ vectorSource.addFeatures(
842
+ new import_format2.GeoJSON().readFeatures(geoJson).map((feature) => {
843
+ feature.setStyle(createVectorStyle(feature, config));
844
+ return feature;
845
+ })
846
+ );
847
+ };
848
+ var createVectorFaceLayer = (dataList = [], config) => createBusinessLayer(dataList, Object.assign({}, config, { isLine: false }));
849
+ var createVectorLineLayer = (dataList = [], config) => createBusinessLayer(dataList, Object.assign({}, config, { isLine: true }));
850
+
851
+ // src/mass-marks.ts
852
+ var import_ol2 = require("ol");
853
+ var import_geom = require("ol/geom");
854
+ var import_gcoord3 = __toESM(require("gcoord"), 1);
855
+ var import_style2 = require("ol/style");
856
+ var import_Vector3 = __toESM(require("ol/layer/Vector"), 1);
857
+ var import_Vector4 = __toESM(require("ol/source/Vector"), 1);
858
+ var buildMassMarksStyles = (getImgUrlFn) => {
859
+ return (iconConfig) => {
860
+ const {
861
+ baseUrl,
862
+ markerIcon,
863
+ statusNum = 5,
864
+ activeScale = 1.3,
865
+ markerSize = [32, 32]
866
+ } = iconConfig;
867
+ const getMarkerUrl = getImgUrlFn(baseUrl);
868
+ const [x, y] = markerSize;
869
+ const massMarksStyles = new Array(statusNum * 2);
870
+ for (let i = 0; i < statusNum; i++) {
871
+ const imageUrl = getMarkerUrl(`${markerIcon}-${i}`, ".webp");
872
+ massMarksStyles[i] = new import_style2.Style({
873
+ zIndex: 88 + i,
874
+ image: new import_style2.Icon({
875
+ width: x,
876
+ height: y,
877
+ src: imageUrl,
878
+ anchor: [0.5, 1]
879
+ })
880
+ });
881
+ const activeImage = getMarkerUrl(`${markerIcon}-${i}-active`, ".webp");
882
+ massMarksStyles[i + statusNum] = new import_style2.Style({
883
+ zIndex: 120,
884
+ image: new import_style2.Icon({
885
+ width: x * activeScale,
886
+ height: y * activeScale,
887
+ anchor: [0.5, 1],
888
+ src: activeImage ? activeImage : imageUrl
889
+ })
890
+ });
891
+ }
892
+ return massMarksStyles;
893
+ };
894
+ };
895
+ var createFeatures = (dataList, styleList = []) => {
896
+ return dataList.map((item) => {
897
+ const { crsForm } = item;
898
+ const coord = import_gcoord3.default.transform(
899
+ [+item.lnglat[0], +item.lnglat[1]],
900
+ crsForm || import_gcoord3.default.WGS84,
901
+ import_gcoord3.default.WGS84
902
+ );
903
+ const feature = new import_ol2.Feature({
904
+ geometry: new import_geom.Point(coord)
905
+ });
906
+ feature.setProperties(__spreadProps(__spreadValues({}, item), {
907
+ unActiveStyle: styleList[item.style],
908
+ activeStyle: styleList[item.style + styleList.length / 2]
909
+ }));
910
+ feature.setStyle(styleList[item.style]);
911
+ return feature;
943
912
  });
944
- return instance2;
945
913
  };
946
- var disposeMap = () => {
947
- instance.getOverlays().forEach((overlay) => {
948
- instance.removeOverlay(overlay);
914
+ var addFeaturesByLayer = (targetLayer, dataList, config) => {
915
+ const massMarksStyles = targetLayer.get("_massMarksStyles");
916
+ const targetSource = targetLayer == null ? void 0 : targetLayer.getSource();
917
+ const { clear } = config;
918
+ if (clear) {
919
+ targetSource == null ? void 0 : targetSource.clear();
920
+ }
921
+ targetSource == null ? void 0 : targetSource.addFeatures(createFeatures(dataList, massMarksStyles));
922
+ };
923
+ var createMassMarksLayer = (dataList, styleList = []) => {
924
+ const vectorLayer = new import_Vector3.default({
925
+ zIndex: 2e3,
926
+ source: new import_Vector4.default({
927
+ features: createFeatures(dataList, styleList)
928
+ })
949
929
  });
950
- instance.getInteractions().clear();
951
- const layers = instance.getAllLayers();
952
- layers.forEach((layer) => {
953
- const source = layer.getSource();
954
- if (source && source.dispose) {
955
- source.dispose();
956
- }
957
- instance.removeLayer(layer);
958
- layer.dispose();
930
+ vectorLayer.setProperties({
931
+ _isCustom: true,
932
+ _isVectorLayer: true,
933
+ _isMassMarksLayer: true,
934
+ _statusNum: styleList.length / 2,
935
+ _dataList: [...dataList],
936
+ _uuidSet: new Set(dataList.map((item) => item._uuid) || [])
959
937
  });
960
- instance.setTarget("");
961
- instance.dispose();
962
- instance = void 0;
938
+ return vectorLayer;
963
939
  };
964
- var getMapInstance = () => instance;
965
- var resetZoomAndCenter = (center = mapCenter) => {
966
- if (instance) {
967
- const view = instance.getView();
968
- view.animate({
969
- zoom: 9.4,
970
- center,
971
- duration: 1e3
940
+ var addMassMarksLayer = (getImgUrlFn) => {
941
+ return (dataList = [], iconConfig, openClick = true) => {
942
+ const {
943
+ offset = [0, 0],
944
+ baseUrl,
945
+ hasLine,
946
+ hasFace,
947
+ layerName,
948
+ isDynamic,
949
+ isAutoFit,
950
+ statusNum,
951
+ markerIcon,
952
+ marksStyles,
953
+ markerSize,
954
+ activeScale,
955
+ vectorConfig
956
+ } = iconConfig;
957
+ const massMarksStyles = marksStyles ? marksStyles : buildMassMarksStyles(getImgUrlFn)({
958
+ baseUrl,
959
+ markerIcon,
960
+ markerSize,
961
+ statusNum: statusNum || 5,
962
+ activeScale: activeScale || 1.3
972
963
  });
973
- }
974
- };
975
- var resetMap = (config = { center: mapCenter, isClearAll: true }) => {
976
- removeAllLayers();
977
- resetZoomAndCenter(config.center || mapCenter);
978
- };
979
-
980
- // src/helper.ts
981
- var hexToRgba = (hex, alpha) => {
982
- if (hex.startsWith("#")) {
983
- let tempHex = hex.replace("#", "");
984
- if (tempHex.length === 3) {
985
- tempHex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];
964
+ const massMarksLayer = createMassMarksLayer(dataList, massMarksStyles);
965
+ if (openClick) {
966
+ massMarksLayer.setProperties({
967
+ _offset: offset,
968
+ _isAutoFit: isAutoFit
969
+ });
970
+ createSelectByLayer(massMarksLayer);
986
971
  }
987
- const r = parseInt(tempHex.substring(0, 2), 16);
988
- const g = parseInt(tempHex.substring(2, 4), 16);
989
- const b = parseInt(tempHex.substring(4, 6), 16);
990
- return `rgba(${r}, ${g}, ${b}, ${alpha})`;
991
- } else {
992
- return hex;
993
- }
994
- };
995
- var getLayersDataList = () => {
996
- var _a;
997
- return ((_a = instance) == null ? void 0 : _a.getAllLayers().map((layer) => layer.get("_dataList") || []).flat(2)) || [];
998
- };
999
- var determineGeometryType = (coordinates) => {
1000
- const getArrayDepth = (arr) => {
1001
- if (!Array.isArray(arr)) return 0;
1002
- return 1 + Math.max(...arr.map((item) => getArrayDepth(item)), 0);
1003
- };
1004
- const isClosedRing = (coords) => {
1005
- if (!Array.isArray(coords) || coords.length < 3) return false;
1006
- const first = coords[0];
1007
- const last = coords[coords.length - 1];
1008
- return first[0] === last[0] && first[1] === last[1];
1009
- };
1010
- const isValidCoordinate = (coord) => {
1011
- return Array.isArray(coord) && coord.length >= 2 && typeof coord[0] === "number" && typeof coord[1] === "number";
1012
- };
1013
- const isValidLineString = (coords) => {
1014
- return Array.isArray(coords) && coords.length >= 2 && coords.every(isValidCoordinate);
1015
- };
1016
- const isValidPolygon = (coords) => {
1017
- if (!Array.isArray(coords)) return false;
1018
- const rings = getArrayDepth(coords) === 2 ? [coords] : coords;
1019
- return rings.every(
1020
- (ring) => Array.isArray(ring) && ring.length >= 4 && isClosedRing(ring) && ring.every(isValidCoordinate)
1021
- );
972
+ if (hasLine) {
973
+ const vectorLayer = createBusinessLayer(
974
+ dataList,
975
+ Object.assign(
976
+ {},
977
+ {
978
+ key: "line",
979
+ isLine: true,
980
+ openClick: false,
981
+ strokeWeight: 4,
982
+ strokeColor: "rgba(29, 235, 255, 0.8)"
983
+ },
984
+ vectorConfig || {}
985
+ )
986
+ );
987
+ instance.addLayer(vectorLayer);
988
+ }
989
+ if (hasFace) {
990
+ const vectorLayer = createBusinessLayer(
991
+ dataList,
992
+ Object.assign(
993
+ {},
994
+ {
995
+ isLine: false,
996
+ key: "faceList",
997
+ strokeWeight: 1,
998
+ openClick: false,
999
+ fillColor: "#4247DF",
1000
+ strokeStyle: "dashed",
1001
+ strokeColor: "#4247DF"
1002
+ },
1003
+ vectorConfig || {}
1004
+ )
1005
+ );
1006
+ instance.addLayer(vectorLayer);
1007
+ }
1008
+ massMarksLayer.setProperties({
1009
+ _isCustom: true,
1010
+ _offset: offset,
1011
+ _hasLine: hasLine,
1012
+ _hasFace: hasFace,
1013
+ className: layerName,
1014
+ _layerName: layerName,
1015
+ _isVectorLayer: true,
1016
+ _isDynamic: isDynamic,
1017
+ _massMarksStyles: massMarksStyles
1018
+ });
1019
+ instance.addLayer(massMarksLayer);
1020
+ return massMarksLayer;
1022
1021
  };
1023
- const depth = getArrayDepth(coordinates);
1024
- try {
1025
- if (depth < 2 || !coordinates || coordinates.length === 0) {
1026
- return "Invalid" /* Invalid */;
1027
- } else if (depth === 2 && isValidLineString(coordinates)) {
1028
- return isClosedRing(coordinates) && coordinates.length >= 4 ? "Polygon" /* Polygon */ : "LineString" /* LineString */;
1029
- } else if (depth === 3 && Array.isArray(coordinates) && coordinates.every(isValidLineString)) {
1030
- if (isValidPolygon(coordinates)) {
1031
- return "Polygon" /* Polygon */;
1032
- } else if (coordinates.every((arr) => !isClosedRing(arr))) {
1033
- return "MultiLineString" /* MultiLineString */;
1022
+ };
1023
+ var updateMarksLayersByStatus = (checkedStatusList = []) => {
1024
+ const hideStyle = new import_style2.Style({});
1025
+ const tempList = [];
1026
+ const targetLayers = instance.getAllLayers().filter((layer) => layer.get("_isMassMarksLayer"));
1027
+ targetLayers.forEach((layer) => {
1028
+ const features = layer.getSource().getFeatures();
1029
+ features.forEach((feature) => {
1030
+ const data = feature.getProperties();
1031
+ if (!checkedStatusList.includes(data.status)) {
1032
+ feature.setStyle(hideStyle);
1034
1033
  } else {
1035
- return "Invalid" /* Invalid */;
1034
+ tempList.push(data);
1035
+ feature.setStyle(data.unActiveStyle);
1036
1036
  }
1037
- } else if (depth === 4 && Array.isArray(coordinates) && coordinates.every((rings) => isValidPolygon(rings))) {
1038
- return "MultiPolygon" /* MultiPolygon */;
1039
- } else {
1040
- return "Invalid" /* Invalid */;
1041
- }
1042
- } catch (error) {
1043
- console.error("Error analyzing coordinates:", error);
1044
- return "Invalid" /* Invalid */;
1045
- }
1037
+ });
1038
+ });
1039
+ return tempList;
1046
1040
  };
1047
1041
 
1048
- // src/ogc-utils.ts
1049
- var import_source3 = require("ol/source");
1050
- var import_Tile = __toESM(require("ol/layer/Tile"), 1);
1051
- var import_format2 = require("ol/format");
1052
- var import_WMTS2 = require("ol/source/WMTS");
1053
- var parser = new import_format2.WMTSCapabilities();
1054
- var capabilitiesMap = /* @__PURE__ */ new Map();
1055
- var getCapabilities = (url) => {
1056
- return new Promise((resolve) => {
1057
- const capabilities = capabilitiesMap.get(url);
1058
- if (capabilities) {
1059
- resolve(capabilities);
1060
- } else {
1061
- fetch(url).then((data) => data.text()).then((text) => {
1062
- const capabilities2 = parser.read(text);
1063
- capabilitiesMap.set(url, capabilities2);
1064
- resolve(capabilities2);
1042
+ // src/cluster.ts
1043
+ var import_ol3 = require("ol");
1044
+ var import_geom2 = require("ol/geom");
1045
+ var import_Cluster = __toESM(require("ol/source/Cluster"), 1);
1046
+ var import_Circle = __toESM(require("ol/style/Circle"), 1);
1047
+ var import_Vector5 = __toESM(require("ol/layer/Vector"), 1);
1048
+ var import_Vector6 = __toESM(require("ol/source/Vector"), 1);
1049
+ var import_style3 = require("ol/style");
1050
+ var createClusterLayer = (dataList, config) => {
1051
+ const count = dataList.length;
1052
+ const styleCache = {};
1053
+ const {
1054
+ distance,
1055
+ minDistance,
1056
+ openClick,
1057
+ buildStyle,
1058
+ singleStyles,
1059
+ computedRadius,
1060
+ layerName = "cluster-layer"
1061
+ } = config;
1062
+ const innerComputedRadius = (size) => Math.pow(size / count, 1 / 18);
1063
+ styleCache[1] = singleStyles;
1064
+ const innerBuildStyle = (feature) => {
1065
+ const size = feature.get("features").length;
1066
+ let style = styleCache[size];
1067
+ const tempRadius = computedRadius ? computedRadius(size) : innerComputedRadius(size);
1068
+ if (!style) {
1069
+ style = new import_style3.Style({
1070
+ image: new import_Circle.default({
1071
+ radius: tempRadius * 20,
1072
+ stroke: new import_style3.Stroke({
1073
+ width: 2,
1074
+ color: `hsla(${180 - tempRadius * 180}, 100%, 40%, 1)`
1075
+ }),
1076
+ fill: new import_style3.Fill({
1077
+ color: `hsla(${180 - tempRadius * 180}, 100%, 50%, 1)`
1078
+ })
1079
+ }),
1080
+ text: new import_style3.Text({
1081
+ text: size.toString(),
1082
+ fill: new import_style3.Fill({
1083
+ color: `hsla(${180 - tempRadius * 180}, 100%, 10%, 1)`
1084
+ }),
1085
+ textBaseline: "middle"
1086
+ })
1065
1087
  });
1088
+ styleCache[size] = style;
1066
1089
  }
1067
- });
1068
- };
1069
- var createWmtsLayer = (serverUrl) => (config) => __async(null, null, function* () {
1070
- const { style, format, version, layerName, matrixSet } = config;
1071
- const [workspace, datastore] = layerName.split(":");
1072
- const capabilitiesUrl = `${serverUrl}/${workspace}/${datastore}/gwc/service/wmts?request=GetCapabilities`;
1073
- return new Promise((resolve, reject) => {
1074
- getCapabilities(capabilitiesUrl).then((data) => {
1075
- const options = (0, import_WMTS2.optionsFromCapabilities)(data, {
1076
- Style: style || "",
1077
- layer: datastore,
1078
- version: version || "1.1.0",
1079
- format: format || "image/png",
1080
- matrixSet: matrixSet || "EPSG:4326"
1090
+ if (Array.isArray(style)) {
1091
+ const tempFeature = feature.get("features")[0];
1092
+ const index = tempFeature.get("styleIndex") || 0;
1093
+ tempFeature.setProperties({
1094
+ unActiveStyle: style[index],
1095
+ activeStyle: style[index + style.length / 2]
1081
1096
  });
1082
- if (options) {
1083
- resolve(
1084
- new import_Tile.default({
1085
- zIndex: 3,
1086
- className: layerName,
1087
- source: new import_source3.WMTS(options)
1088
- })
1089
- );
1090
- } else {
1091
- reject(new Error("Unable to create TileLayer"));
1092
- }
1093
- });
1097
+ return style[index];
1098
+ }
1099
+ return style;
1100
+ };
1101
+ const vectorLayer = new import_Vector5.default({
1102
+ zIndex: 200,
1103
+ className: layerName,
1104
+ source: new import_Cluster.default({
1105
+ distance: distance || 80,
1106
+ minDistance: minDistance || 0,
1107
+ source: new import_Vector6.default({
1108
+ features: dataList.map((item) => {
1109
+ const feature = new import_ol3.Feature(new import_geom2.Point(item.lnglat));
1110
+ feature.setProperties(item);
1111
+ return feature;
1112
+ })
1113
+ })
1114
+ }),
1115
+ style: (feature) => buildStyle ? buildStyle(feature) : innerBuildStyle(feature)
1094
1116
  });
1095
- });
1117
+ vectorLayer.setProperties({
1118
+ _isCustom: true,
1119
+ _isVectorLayer: true,
1120
+ _isClusterLayer: true
1121
+ });
1122
+ if (openClick) {
1123
+ createSelectByLayer(vectorLayer);
1124
+ }
1125
+ return vectorLayer;
1126
+ };
1096
1127
  // Annotate the CommonJS export names for ESM import in node:
1097
1128
  0 && (module.exports = {
1098
1129
  GeometryType,
1099
1130
  activeFeatureByUid,
1131
+ addFeaturesByLayer,
1100
1132
  addMassMarksLayer,
1101
1133
  appendFeaturesByLayer,
1102
1134
  buildMassMarksStyles,