vue-openlayers-plugin 1.0.74 → 1.0.76

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.
Files changed (21) hide show
  1. package/lib/{index-e0d64ecc.mjs → index-5997484a.mjs} +385 -313
  2. package/lib/{index.es-4f33fe12.mjs → index.es-5569f6dd.mjs} +1 -1
  3. package/lib/index.esm.js +1 -1
  4. package/lib/index.umd.js +384 -312
  5. package/package.json +1 -1
  6. package/types/src/components/CustomOpenlayer/components/dialogs/LayerPanel.vue.d.ts +36 -0
  7. package/types/src/components/CustomOpenlayer/components/dialogs/LayerPanel.vue.d.ts.map +1 -1
  8. package/types/src/components/CustomOpenlayer/types/index.d.ts +10 -0
  9. package/types/src/components/CustomOpenlayer/types/index.d.ts.map +1 -1
  10. package/types/src/components/CustomOpenlayer/utils/featureHighlightManager.d.ts.map +1 -1
  11. package/types/src/components/CustomOpenlayer/utils/geoJsonLocationTool.d.ts +13 -1
  12. package/types/src/components/CustomOpenlayer/utils/geoJsonLocationTool.d.ts.map +1 -1
  13. package/types/src/components/CustomOpenlayer/utils/layers/GeoJSONLayerHandler.d.ts.map +1 -1
  14. package/types/src/components/CustomOpenlayer/utils/layers/ImageVectorLayerHandler.d.ts.map +1 -1
  15. package/types/src/components/CustomOpenlayer/utils/layers/VectorTileLayerHandler.d.ts.map +1 -1
  16. package/types/src/components/CustomOpenlayer/utils/mapManager.d.ts +5 -1
  17. package/types/src/components/CustomOpenlayer/utils/mapManager.d.ts.map +1 -1
  18. package/types/src/components/CustomOpenlayer/utils/styles/StyleFactory.d.ts.map +1 -1
  19. package/types/src/components/CustomOpenlayer/utils/styles/StyleManager.d.ts.map +1 -1
  20. package/types/src/components/CustomOpenlayer/utils/styles/interfaces.d.ts +2 -0
  21. package/types/src/components/CustomOpenlayer/utils/styles/interfaces.d.ts.map +1 -1
package/lib/index.umd.js CHANGED
@@ -81630,12 +81630,308 @@ ${this.attributes_.map(
81630
81630
  this.locateToGeoJSON(featureCollection2, options);
81631
81631
  }
81632
81632
  }
81633
+ const DEFAULT_HIGHLIGHT_STYLE = {
81634
+ fill: {
81635
+ color: "rgba(255, 255, 0, 0.3)",
81636
+ // 黄色半透明填充
81637
+ opacity: 0.3
81638
+ },
81639
+ stroke: {
81640
+ color: "#ffff00",
81641
+ // 黄色描边
81642
+ width: 3,
81643
+ lineDash: [5, 5]
81644
+ // 虚线
81645
+ },
81646
+ circle: {
81647
+ radius: 8,
81648
+ fill: {
81649
+ color: "rgba(255, 255, 0, 0.6)",
81650
+ opacity: 0.6
81651
+ },
81652
+ stroke: {
81653
+ color: "#ffff00",
81654
+ width: 3
81655
+ }
81656
+ },
81657
+ text: {
81658
+ font: "12px Arial",
81659
+ fill: {
81660
+ color: "#000000"
81661
+ },
81662
+ stroke: {
81663
+ color: "#ffffff",
81664
+ width: 2
81665
+ },
81666
+ offsetY: -15,
81667
+ scale: 1.2
81668
+ }
81669
+ };
81670
+ class FeatureHighlightManager {
81671
+ constructor(map2, styleConfig) {
81672
+ __publicField(this, "map");
81673
+ __publicField(this, "highlightLayer");
81674
+ __publicField(this, "highlightedFeatures", /* @__PURE__ */ new Map());
81675
+ __publicField(this, "styleConfig");
81676
+ __publicField(this, "featureIdCounter", 0);
81677
+ this.map = map2;
81678
+ this.styleConfig = { ...DEFAULT_HIGHLIGHT_STYLE, ...styleConfig };
81679
+ this.highlightedFeatures = /* @__PURE__ */ new Map();
81680
+ this.highlightLayer = new VectorLayer$3({
81681
+ source: new VectorSource$2(),
81682
+ style: this.createHighlightStyle.bind(this),
81683
+ zIndex: 9999
81684
+ // 确保高亮图层在最上层
81685
+ });
81686
+ this.map.addLayer(this.highlightLayer);
81687
+ }
81688
+ /**
81689
+ * 确保 highlightedFeatures 是有效的 Map 实例
81690
+ */
81691
+ ensureHighlightedFeaturesMap() {
81692
+ if (!this.highlightedFeatures || !(this.highlightedFeatures instanceof Map)) {
81693
+ console.warn("FeatureHighlightManager: highlightedFeatures corrupted, reinitializing...");
81694
+ this.highlightedFeatures = /* @__PURE__ */ new Map();
81695
+ }
81696
+ }
81697
+ /**
81698
+ * 创建高亮样式
81699
+ */
81700
+ createHighlightStyle(feature2) {
81701
+ var _a3, _b3, _c2, _d, _e2, _f;
81702
+ const geometry2 = feature2.getGeometry();
81703
+ const geometryType = geometry2 == null ? void 0 : geometry2.getType();
81704
+ const styleOptions = {};
81705
+ if (geometryType === "Point" || geometryType === "MultiPoint") {
81706
+ if (this.styleConfig.circle) {
81707
+ styleOptions.image = new Circle$8({
81708
+ radius: this.styleConfig.circle.radius || 8,
81709
+ fill: new Fill$2({
81710
+ color: ((_a3 = this.styleConfig.circle.fill) == null ? void 0 : _a3.color) || "rgba(255, 255, 0, 0.6)"
81711
+ }),
81712
+ stroke: new Stroke$2({
81713
+ color: ((_b3 = this.styleConfig.circle.stroke) == null ? void 0 : _b3.color) || "#ffff00",
81714
+ width: ((_c2 = this.styleConfig.circle.stroke) == null ? void 0 : _c2.width) || 3
81715
+ })
81716
+ });
81717
+ }
81718
+ } else {
81719
+ if (this.styleConfig.fill) {
81720
+ styleOptions.fill = new Fill$2({
81721
+ color: this.styleConfig.fill.color || "rgba(255, 255, 0, 0.3)"
81722
+ });
81723
+ }
81724
+ if (this.styleConfig.stroke) {
81725
+ styleOptions.stroke = new Stroke$2({
81726
+ color: this.styleConfig.stroke.color || "#ffff00",
81727
+ width: this.styleConfig.stroke.width || 3,
81728
+ lineDash: this.styleConfig.stroke.lineDash || [5, 5]
81729
+ });
81730
+ }
81731
+ }
81732
+ if (this.styleConfig.text) {
81733
+ const properties = feature2.getProperties();
81734
+ const labelText = properties.name || properties.label || "高亮要素";
81735
+ styleOptions.text = new Text$5({
81736
+ text: labelText,
81737
+ font: this.styleConfig.text.font || "12px Arial",
81738
+ fill: new Fill$2({
81739
+ color: ((_d = this.styleConfig.text.fill) == null ? void 0 : _d.color) || "#000000"
81740
+ }),
81741
+ stroke: new Stroke$2({
81742
+ color: ((_e2 = this.styleConfig.text.stroke) == null ? void 0 : _e2.color) || "#ffffff",
81743
+ width: ((_f = this.styleConfig.text.stroke) == null ? void 0 : _f.width) || 2
81744
+ }),
81745
+ offsetY: this.styleConfig.text.offsetY || -15,
81746
+ scale: this.styleConfig.text.scale || 1.2
81747
+ });
81748
+ }
81749
+ return new Style$3(styleOptions);
81750
+ }
81751
+ /**
81752
+ * 根据图层配置创建自定义高亮样式
81753
+ */
81754
+ createCustomHighlightStyle(feature2, customStyleConfig) {
81755
+ var _a3, _b3, _c2, _d, _e2, _f, _g, _h, _i2, _j;
81756
+ const geometry2 = feature2.getGeometry();
81757
+ const geometryType = geometry2 == null ? void 0 : geometry2.getType();
81758
+ const styleOptions = {};
81759
+ if (geometryType === "Point" || geometryType === "MultiPoint") {
81760
+ if (customStyleConfig == null ? void 0 : customStyleConfig.circle) {
81761
+ styleOptions.image = new Circle$8({
81762
+ radius: customStyleConfig.circle.radius || 8,
81763
+ fill: new Fill$2({
81764
+ color: ((_a3 = customStyleConfig.circle.fill) == null ? void 0 : _a3.color) || "rgba(255, 255, 0, 0.6)"
81765
+ }),
81766
+ stroke: new Stroke$2({
81767
+ color: ((_b3 = customStyleConfig.circle.stroke) == null ? void 0 : _b3.color) || "#ffff00",
81768
+ width: ((_c2 = customStyleConfig.circle.stroke) == null ? void 0 : _c2.width) || 3
81769
+ })
81770
+ });
81771
+ }
81772
+ } else {
81773
+ if ((customStyleConfig == null ? void 0 : customStyleConfig.fill) || (customStyleConfig == null ? void 0 : customStyleConfig.fillColor)) {
81774
+ const color2 = ((_d = customStyleConfig == null ? void 0 : customStyleConfig.fill) == null ? void 0 : _d.color) || (customStyleConfig == null ? void 0 : customStyleConfig.fillColor) || "rgba(255, 255, 0, 0.3)";
81775
+ styleOptions.fill = new Fill$2({
81776
+ color: color2
81777
+ });
81778
+ }
81779
+ if ((customStyleConfig == null ? void 0 : customStyleConfig.stroke) || (customStyleConfig == null ? void 0 : customStyleConfig.strokeColor)) {
81780
+ const color2 = ((_e2 = customStyleConfig == null ? void 0 : customStyleConfig.stroke) == null ? void 0 : _e2.color) || (customStyleConfig == null ? void 0 : customStyleConfig.strokeColor) || "#ffff00";
81781
+ const width = ((_f = customStyleConfig == null ? void 0 : customStyleConfig.stroke) == null ? void 0 : _f.width) || (customStyleConfig == null ? void 0 : customStyleConfig.strokeWidth) || 3;
81782
+ const lineDash = ((_g = customStyleConfig == null ? void 0 : customStyleConfig.stroke) == null ? void 0 : _g.lineDash) || (customStyleConfig == null ? void 0 : customStyleConfig.lineDash) || [5, 5];
81783
+ styleOptions.stroke = new Stroke$2({
81784
+ color: color2,
81785
+ width,
81786
+ lineDash
81787
+ });
81788
+ }
81789
+ }
81790
+ if (customStyleConfig == null ? void 0 : customStyleConfig.text) {
81791
+ const properties = feature2.getProperties();
81792
+ const labelText = properties.name || properties.label || "高亮要素";
81793
+ styleOptions.text = new Text$5({
81794
+ text: labelText,
81795
+ font: customStyleConfig.text.font || "12px Arial",
81796
+ fill: new Fill$2({
81797
+ color: ((_h = customStyleConfig.text.fill) == null ? void 0 : _h.color) || "#000000"
81798
+ }),
81799
+ stroke: new Stroke$2({
81800
+ color: ((_i2 = customStyleConfig.text.stroke) == null ? void 0 : _i2.color) || "#ffffff",
81801
+ width: ((_j = customStyleConfig.text.stroke) == null ? void 0 : _j.width) || 2
81802
+ }),
81803
+ offsetX: customStyleConfig.text.offsetX || 0,
81804
+ offsetY: customStyleConfig.text.offsetY || -15,
81805
+ scale: customStyleConfig.text.scale || 1.2
81806
+ });
81807
+ }
81808
+ return new Style$3(styleOptions);
81809
+ }
81810
+ /**
81811
+ * 高亮要素
81812
+ */
81813
+ highlightFeature(feature2, layerId, layerHighlightConfig) {
81814
+ var _a3;
81815
+ this.ensureHighlightedFeaturesMap();
81816
+ const existingId = this.isFeatureHighlighted(feature2);
81817
+ if (existingId) {
81818
+ return existingId;
81819
+ }
81820
+ if (layerHighlightConfig == null ? void 0 : layerHighlightConfig.clearOthersOnHighlight) {
81821
+ this.clearAllHighlights();
81822
+ }
81823
+ const featureId2 = `highlight_${++this.featureIdCounter}_${Date.now()}`;
81824
+ const highlightFeature = feature2.clone();
81825
+ highlightFeature.setId(featureId2);
81826
+ if (layerHighlightConfig == null ? void 0 : layerHighlightConfig.style) {
81827
+ const customStyle = this.createCustomHighlightStyle(highlightFeature, layerHighlightConfig.style);
81828
+ highlightFeature.setStyle(customStyle);
81829
+ }
81830
+ const originalStyle = feature2.getStyle();
81831
+ const highlightInfo = {
81832
+ originalFeature: feature2,
81833
+ highlightFeature,
81834
+ originalStyle,
81835
+ layerId
81836
+ };
81837
+ (_a3 = this.highlightLayer.getSource()) == null ? void 0 : _a3.addFeature(highlightFeature);
81838
+ this.highlightedFeatures.set(featureId2, highlightInfo);
81839
+ return featureId2;
81840
+ }
81841
+ /**
81842
+ * 取消高亮要素
81843
+ */
81844
+ unhighlightFeature(featureId2) {
81845
+ var _a3;
81846
+ this.ensureHighlightedFeaturesMap();
81847
+ const highlightInfo = this.highlightedFeatures.get(featureId2);
81848
+ if (!highlightInfo) {
81849
+ return false;
81850
+ }
81851
+ (_a3 = this.highlightLayer.getSource()) == null ? void 0 : _a3.removeFeature(highlightInfo.highlightFeature);
81852
+ this.highlightedFeatures.delete(featureId2);
81853
+ return true;
81854
+ }
81855
+ /**
81856
+ * 清除所有高亮
81857
+ */
81858
+ clearAllHighlights() {
81859
+ var _a3;
81860
+ (_a3 = this.highlightLayer.getSource()) == null ? void 0 : _a3.clear();
81861
+ this.ensureHighlightedFeaturesMap();
81862
+ this.highlightedFeatures.clear();
81863
+ }
81864
+ /**
81865
+ * 获取当前高亮的要素数量
81866
+ */
81867
+ getHighlightedCount() {
81868
+ this.ensureHighlightedFeaturesMap();
81869
+ return this.highlightedFeatures.size;
81870
+ }
81871
+ /**
81872
+ * 获取所有高亮要素的ID
81873
+ */
81874
+ getHighlightedFeatureIds() {
81875
+ this.ensureHighlightedFeaturesMap();
81876
+ return Array.from(this.highlightedFeatures.keys());
81877
+ }
81878
+ /**
81879
+ * 检查要素是否已高亮
81880
+ */
81881
+ isFeatureHighlighted(feature2) {
81882
+ this.ensureHighlightedFeaturesMap();
81883
+ if (!this.highlightedFeatures || typeof this.highlightedFeatures[Symbol.iterator] !== "function") {
81884
+ console.warn("FeatureHighlightManager: highlightedFeatures lost iterator, reinitializing...");
81885
+ this.highlightedFeatures = /* @__PURE__ */ new Map();
81886
+ return null;
81887
+ }
81888
+ try {
81889
+ const entries = Array.from(this.highlightedFeatures.entries());
81890
+ for (const [id2, info] of entries) {
81891
+ if (info && info.originalFeature === feature2) {
81892
+ return id2;
81893
+ }
81894
+ }
81895
+ } catch (error2) {
81896
+ console.error("Error iterating highlightedFeatures:", error2);
81897
+ this.highlightedFeatures = /* @__PURE__ */ new Map();
81898
+ return null;
81899
+ }
81900
+ return null;
81901
+ }
81902
+ /**
81903
+ * 更新高亮样式配置
81904
+ */
81905
+ updateStyleConfig(newConfig) {
81906
+ var _a3;
81907
+ this.styleConfig = { ...this.styleConfig, ...newConfig };
81908
+ this.ensureHighlightedFeaturesMap();
81909
+ (_a3 = this.highlightLayer.getSource()) == null ? void 0 : _a3.getFeatures().forEach((feature2) => {
81910
+ feature2.changed();
81911
+ });
81912
+ }
81913
+ /**
81914
+ * 获取当前样式配置
81915
+ */
81916
+ getStyleConfig() {
81917
+ return { ...this.styleConfig };
81918
+ }
81919
+ /**
81920
+ * 销毁管理器
81921
+ */
81922
+ destroy() {
81923
+ this.clearAllHighlights();
81924
+ this.map.removeLayer(this.highlightLayer);
81925
+ }
81926
+ }
81633
81927
  class GeoJSONLocationTool {
81634
- constructor(map2) {
81928
+ constructor(map2, featureHighlightManager) {
81635
81929
  __publicField(this, "map");
81636
81930
  __publicField(this, "format");
81931
+ __publicField(this, "featureHighlightManager");
81637
81932
  this.map = map2;
81638
81933
  this.format = new GeoJSON$4();
81934
+ this.featureHighlightManager = featureHighlightManager;
81639
81935
  }
81640
81936
  /**
81641
81937
  * 定位到 GeoJSON 数据
@@ -81707,6 +82003,18 @@ ${this.attributes_.map(
81707
82003
  duration: fitOptions.duration,
81708
82004
  minZoom: fitOptions.minZoom
81709
82005
  });
82006
+ if ((fitOptions.highlight || fitOptions.style) && this.featureHighlightManager) {
82007
+ if (fitOptions.clearPrevious !== false) {
82008
+ this.featureHighlightManager.clearAllHighlights();
82009
+ }
82010
+ const highlightConfig = {
82011
+ style: fitOptions.style,
82012
+ clearOthersOnHighlight: false
82013
+ };
82014
+ features2.forEach((feature2) => {
82015
+ this.featureHighlightManager.highlightFeature(feature2, "location_highlight", highlightConfig);
82016
+ });
82017
+ }
81710
82018
  if (fitOptions.showMessage) {
81711
82019
  }
81712
82020
  return true;
@@ -81755,6 +82063,16 @@ ${this.attributes_.map(
81755
82063
  zoom: targetZoom,
81756
82064
  duration: (options == null ? void 0 : options.duration) || 1e3
81757
82065
  });
82066
+ if (((options == null ? void 0 : options.highlight) || (options == null ? void 0 : options.style)) && this.featureHighlightManager) {
82067
+ if (options.clearPrevious !== false) {
82068
+ this.featureHighlightManager.clearAllHighlights();
82069
+ }
82070
+ const highlightConfig = {
82071
+ style: options.style,
82072
+ clearOthersOnHighlight: false
82073
+ };
82074
+ this.featureHighlightManager.highlightFeature(feature2, "location_center_highlight", highlightConfig);
82075
+ }
81758
82076
  if ((options == null ? void 0 : options.showMessage) !== false) {
81759
82077
  }
81760
82078
  return true;
@@ -83385,7 +83703,8 @@ ${this.attributes_.map(
83385
83703
  rotation: config.rotation,
83386
83704
  backgroundFill: this.createFill(config.backgroundFill),
83387
83705
  backgroundStroke: this.createStroke(config.backgroundStroke),
83388
- padding: config.padding
83706
+ padding: config.padding,
83707
+ overflow: config.overflow
83389
83708
  });
83390
83709
  return textStyle;
83391
83710
  }
@@ -83693,8 +84012,12 @@ ${this.attributes_.map(
83693
84012
  var _a3;
83694
84013
  const geometryType = StyleFactory.getFeatureGeometryType(feature2);
83695
84014
  const defaultConfig = this.getDefaultStyle(geometryType);
83696
- const customConfig = styleConfig == null ? void 0 : styleConfig[geometryType];
83697
- const finalConfig = this.mergeStyleConfig(defaultConfig, customConfig);
84015
+ const layerConfig = styleConfig == null ? void 0 : styleConfig[geometryType];
84016
+ let finalConfig = this.mergeStyleConfig(defaultConfig, layerConfig);
84017
+ const featureStyle = feature2.get("style");
84018
+ if (featureStyle) {
84019
+ finalConfig = this.mergeStyleConfig(finalConfig, featureStyle);
84020
+ }
83698
84021
  if (finalConfig && finalConfig.text) {
83699
84022
  const textCfg = { ...finalConfig.text };
83700
84023
  let content2 = textCfg.text;
@@ -83847,6 +84170,20 @@ ${this.attributes_.map(
83847
84170
  * 创建样式函数
83848
84171
  */
83849
84172
  createStyleFunction() {
84173
+ if (this.config.styleFunction) {
84174
+ const userFn = this.config.styleFunction;
84175
+ return (feature2, resolution) => {
84176
+ const result = userFn(feature2, resolution || 0);
84177
+ if (result instanceof Style$3 || Array.isArray(result) && result[0] instanceof Style$3) {
84178
+ return result;
84179
+ }
84180
+ if (result && typeof result === "object") {
84181
+ const geometryType = StyleFactory.getFeatureGeometryType(feature2);
84182
+ return StyleFactory.createStyleByGeometryType(geometryType, result);
84183
+ }
84184
+ return [];
84185
+ };
84186
+ }
83850
84187
  this.parseStyleConfig();
83851
84188
  return styleManager.createStyleFunction(this.styleConfig);
83852
84189
  }
@@ -86136,6 +86473,9 @@ ${this.attributes_.map(
86136
86473
  * 创建样式函数
86137
86474
  */
86138
86475
  createStyleFunction() {
86476
+ if (this.config.styleFunction) {
86477
+ return this.config.styleFunction;
86478
+ }
86139
86479
  this.parseStyleConfig();
86140
86480
  return styleManager.createStyleFunction(this.styleConfig);
86141
86481
  }
@@ -466759,6 +467099,9 @@ ${this.attributes_.map(
466759
467099
  * 创建样式函数
466760
467100
  */
466761
467101
  createStyleFunction() {
467102
+ if (this.config.styleFunction) {
467103
+ return this.config.styleFunction;
467104
+ }
466762
467105
  if (this.styleConfig) {
466763
467106
  return styleManager.createStyleFunction(this.styleConfig);
466764
467107
  }
@@ -468350,296 +468693,6 @@ ${this.attributes_.map(
468350
468693
  this.layerConfigs.clear();
468351
468694
  }
468352
468695
  }
468353
- const DEFAULT_HIGHLIGHT_STYLE = {
468354
- fill: {
468355
- color: "rgba(255, 255, 0, 0.3)",
468356
- // 黄色半透明填充
468357
- opacity: 0.3
468358
- },
468359
- stroke: {
468360
- color: "#ffff00",
468361
- // 黄色描边
468362
- width: 3,
468363
- lineDash: [5, 5]
468364
- // 虚线
468365
- },
468366
- circle: {
468367
- radius: 8,
468368
- fill: {
468369
- color: "rgba(255, 255, 0, 0.6)",
468370
- opacity: 0.6
468371
- },
468372
- stroke: {
468373
- color: "#ffff00",
468374
- width: 3
468375
- }
468376
- },
468377
- text: {
468378
- font: "12px Arial",
468379
- fill: {
468380
- color: "#000000"
468381
- },
468382
- stroke: {
468383
- color: "#ffffff",
468384
- width: 2
468385
- },
468386
- offsetY: -15,
468387
- scale: 1.2
468388
- }
468389
- };
468390
- class FeatureHighlightManager {
468391
- constructor(map2, styleConfig) {
468392
- __publicField(this, "map");
468393
- __publicField(this, "highlightLayer");
468394
- __publicField(this, "highlightedFeatures", /* @__PURE__ */ new Map());
468395
- __publicField(this, "styleConfig");
468396
- __publicField(this, "featureIdCounter", 0);
468397
- this.map = map2;
468398
- this.styleConfig = { ...DEFAULT_HIGHLIGHT_STYLE, ...styleConfig };
468399
- this.highlightedFeatures = /* @__PURE__ */ new Map();
468400
- this.highlightLayer = new VectorLayer$3({
468401
- source: new VectorSource$2(),
468402
- style: this.createHighlightStyle.bind(this),
468403
- zIndex: 9999
468404
- // 确保高亮图层在最上层
468405
- });
468406
- this.map.addLayer(this.highlightLayer);
468407
- }
468408
- /**
468409
- * 确保 highlightedFeatures 是有效的 Map 实例
468410
- */
468411
- ensureHighlightedFeaturesMap() {
468412
- if (!this.highlightedFeatures || !(this.highlightedFeatures instanceof Map)) {
468413
- console.warn("FeatureHighlightManager: highlightedFeatures corrupted, reinitializing...");
468414
- this.highlightedFeatures = /* @__PURE__ */ new Map();
468415
- }
468416
- }
468417
- /**
468418
- * 创建高亮样式
468419
- */
468420
- createHighlightStyle(feature2) {
468421
- var _a3, _b3, _c2, _d, _e2, _f;
468422
- const geometry2 = feature2.getGeometry();
468423
- const geometryType = geometry2 == null ? void 0 : geometry2.getType();
468424
- const styleOptions = {};
468425
- if (geometryType === "Point" || geometryType === "MultiPoint") {
468426
- if (this.styleConfig.circle) {
468427
- styleOptions.image = new Circle$8({
468428
- radius: this.styleConfig.circle.radius || 8,
468429
- fill: new Fill$2({
468430
- color: ((_a3 = this.styleConfig.circle.fill) == null ? void 0 : _a3.color) || "rgba(255, 255, 0, 0.6)"
468431
- }),
468432
- stroke: new Stroke$2({
468433
- color: ((_b3 = this.styleConfig.circle.stroke) == null ? void 0 : _b3.color) || "#ffff00",
468434
- width: ((_c2 = this.styleConfig.circle.stroke) == null ? void 0 : _c2.width) || 3
468435
- })
468436
- });
468437
- }
468438
- } else {
468439
- if (this.styleConfig.fill) {
468440
- styleOptions.fill = new Fill$2({
468441
- color: this.styleConfig.fill.color || "rgba(255, 255, 0, 0.3)"
468442
- });
468443
- }
468444
- if (this.styleConfig.stroke) {
468445
- styleOptions.stroke = new Stroke$2({
468446
- color: this.styleConfig.stroke.color || "#ffff00",
468447
- width: this.styleConfig.stroke.width || 3,
468448
- lineDash: this.styleConfig.stroke.lineDash || [5, 5]
468449
- });
468450
- }
468451
- }
468452
- if (this.styleConfig.text) {
468453
- const properties = feature2.getProperties();
468454
- const labelText = properties.name || properties.label || "高亮要素";
468455
- styleOptions.text = new Text$5({
468456
- text: labelText,
468457
- font: this.styleConfig.text.font || "12px Arial",
468458
- fill: new Fill$2({
468459
- color: ((_d = this.styleConfig.text.fill) == null ? void 0 : _d.color) || "#000000"
468460
- }),
468461
- stroke: new Stroke$2({
468462
- color: ((_e2 = this.styleConfig.text.stroke) == null ? void 0 : _e2.color) || "#ffffff",
468463
- width: ((_f = this.styleConfig.text.stroke) == null ? void 0 : _f.width) || 2
468464
- }),
468465
- offsetY: this.styleConfig.text.offsetY || -15,
468466
- scale: this.styleConfig.text.scale || 1.2
468467
- });
468468
- }
468469
- return new Style$3(styleOptions);
468470
- }
468471
- /**
468472
- * 根据图层配置创建自定义高亮样式
468473
- */
468474
- createCustomHighlightStyle(feature2, customStyleConfig) {
468475
- var _a3, _b3, _c2, _d, _e2, _f;
468476
- const geometry2 = feature2.getGeometry();
468477
- const geometryType = geometry2 == null ? void 0 : geometry2.getType();
468478
- const styleOptions = {};
468479
- if (geometryType === "Point" || geometryType === "MultiPoint") {
468480
- if (customStyleConfig == null ? void 0 : customStyleConfig.circle) {
468481
- styleOptions.image = new Circle$8({
468482
- radius: customStyleConfig.circle.radius || 8,
468483
- fill: new Fill$2({
468484
- color: ((_a3 = customStyleConfig.circle.fill) == null ? void 0 : _a3.color) || "rgba(255, 255, 0, 0.6)"
468485
- }),
468486
- stroke: new Stroke$2({
468487
- color: ((_b3 = customStyleConfig.circle.stroke) == null ? void 0 : _b3.color) || "#ffff00",
468488
- width: ((_c2 = customStyleConfig.circle.stroke) == null ? void 0 : _c2.width) || 3
468489
- })
468490
- });
468491
- }
468492
- } else {
468493
- if (customStyleConfig == null ? void 0 : customStyleConfig.fill) {
468494
- styleOptions.fill = new Fill$2({
468495
- color: customStyleConfig.fill.color || "rgba(255, 255, 0, 0.3)"
468496
- });
468497
- }
468498
- if (customStyleConfig == null ? void 0 : customStyleConfig.stroke) {
468499
- styleOptions.stroke = new Stroke$2({
468500
- color: customStyleConfig.stroke.color || "#ffff00",
468501
- width: customStyleConfig.stroke.width || 3,
468502
- lineDash: customStyleConfig.stroke.lineDash || [5, 5]
468503
- });
468504
- }
468505
- }
468506
- if (customStyleConfig == null ? void 0 : customStyleConfig.text) {
468507
- const properties = feature2.getProperties();
468508
- const labelText = properties.name || properties.label || "高亮要素";
468509
- styleOptions.text = new Text$5({
468510
- text: labelText,
468511
- font: customStyleConfig.text.font || "12px Arial",
468512
- fill: new Fill$2({
468513
- color: ((_d = customStyleConfig.text.fill) == null ? void 0 : _d.color) || "#000000"
468514
- }),
468515
- stroke: new Stroke$2({
468516
- color: ((_e2 = customStyleConfig.text.stroke) == null ? void 0 : _e2.color) || "#ffffff",
468517
- width: ((_f = customStyleConfig.text.stroke) == null ? void 0 : _f.width) || 2
468518
- }),
468519
- offsetX: customStyleConfig.text.offsetX || 0,
468520
- offsetY: customStyleConfig.text.offsetY || -15,
468521
- scale: customStyleConfig.text.scale || 1.2
468522
- });
468523
- }
468524
- return new Style$3(styleOptions);
468525
- }
468526
- /**
468527
- * 高亮要素
468528
- */
468529
- highlightFeature(feature2, layerId, layerHighlightConfig) {
468530
- var _a3;
468531
- this.ensureHighlightedFeaturesMap();
468532
- const existingId = this.isFeatureHighlighted(feature2);
468533
- if (existingId) {
468534
- return existingId;
468535
- }
468536
- if (layerHighlightConfig == null ? void 0 : layerHighlightConfig.clearOthersOnHighlight) {
468537
- this.clearAllHighlights();
468538
- }
468539
- const featureId2 = `highlight_${++this.featureIdCounter}_${Date.now()}`;
468540
- const highlightFeature = feature2.clone();
468541
- highlightFeature.setId(featureId2);
468542
- if (layerHighlightConfig == null ? void 0 : layerHighlightConfig.style) {
468543
- const customStyle = this.createCustomHighlightStyle(highlightFeature, layerHighlightConfig.style);
468544
- highlightFeature.setStyle(customStyle);
468545
- }
468546
- const originalStyle = feature2.getStyle();
468547
- const highlightInfo = {
468548
- originalFeature: feature2,
468549
- highlightFeature,
468550
- originalStyle,
468551
- layerId
468552
- };
468553
- (_a3 = this.highlightLayer.getSource()) == null ? void 0 : _a3.addFeature(highlightFeature);
468554
- this.highlightedFeatures.set(featureId2, highlightInfo);
468555
- return featureId2;
468556
- }
468557
- /**
468558
- * 取消高亮要素
468559
- */
468560
- unhighlightFeature(featureId2) {
468561
- var _a3;
468562
- this.ensureHighlightedFeaturesMap();
468563
- const highlightInfo = this.highlightedFeatures.get(featureId2);
468564
- if (!highlightInfo) {
468565
- return false;
468566
- }
468567
- (_a3 = this.highlightLayer.getSource()) == null ? void 0 : _a3.removeFeature(highlightInfo.highlightFeature);
468568
- this.highlightedFeatures.delete(featureId2);
468569
- return true;
468570
- }
468571
- /**
468572
- * 清除所有高亮
468573
- */
468574
- clearAllHighlights() {
468575
- var _a3;
468576
- (_a3 = this.highlightLayer.getSource()) == null ? void 0 : _a3.clear();
468577
- this.ensureHighlightedFeaturesMap();
468578
- this.highlightedFeatures.clear();
468579
- }
468580
- /**
468581
- * 获取当前高亮的要素数量
468582
- */
468583
- getHighlightedCount() {
468584
- this.ensureHighlightedFeaturesMap();
468585
- return this.highlightedFeatures.size;
468586
- }
468587
- /**
468588
- * 获取所有高亮要素的ID
468589
- */
468590
- getHighlightedFeatureIds() {
468591
- this.ensureHighlightedFeaturesMap();
468592
- return Array.from(this.highlightedFeatures.keys());
468593
- }
468594
- /**
468595
- * 检查要素是否已高亮
468596
- */
468597
- isFeatureHighlighted(feature2) {
468598
- this.ensureHighlightedFeaturesMap();
468599
- if (!this.highlightedFeatures || typeof this.highlightedFeatures[Symbol.iterator] !== "function") {
468600
- console.warn("FeatureHighlightManager: highlightedFeatures lost iterator, reinitializing...");
468601
- this.highlightedFeatures = /* @__PURE__ */ new Map();
468602
- return null;
468603
- }
468604
- try {
468605
- const entries = Array.from(this.highlightedFeatures.entries());
468606
- for (const [id2, info] of entries) {
468607
- if (info && info.originalFeature === feature2) {
468608
- return id2;
468609
- }
468610
- }
468611
- } catch (error2) {
468612
- console.error("Error iterating highlightedFeatures:", error2);
468613
- this.highlightedFeatures = /* @__PURE__ */ new Map();
468614
- return null;
468615
- }
468616
- return null;
468617
- }
468618
- /**
468619
- * 更新高亮样式配置
468620
- */
468621
- updateStyleConfig(newConfig) {
468622
- var _a3;
468623
- this.styleConfig = { ...this.styleConfig, ...newConfig };
468624
- this.ensureHighlightedFeaturesMap();
468625
- (_a3 = this.highlightLayer.getSource()) == null ? void 0 : _a3.getFeatures().forEach((feature2) => {
468626
- feature2.changed();
468627
- });
468628
- }
468629
- /**
468630
- * 获取当前样式配置
468631
- */
468632
- getStyleConfig() {
468633
- return { ...this.styleConfig };
468634
- }
468635
- /**
468636
- * 销毁管理器
468637
- */
468638
- destroy() {
468639
- this.clearAllHighlights();
468640
- this.map.removeLayer(this.highlightLayer);
468641
- }
468642
- }
468643
468696
  const _hoisted_1$q = ["id"];
468644
468697
  const _sfc_main$r = /* @__PURE__ */ vue.defineComponent({
468645
468698
  __name: "BasePopup",
@@ -470164,28 +470217,47 @@ ${this.attributes_.map(
470164
470217
  }
470165
470218
  }
470166
470219
  /**
470167
- * 查找匹配的图层配置
470220
+ * 查找匹配的图层配置(支持递归查找子图层)
470168
470221
  */
470169
470222
  findMatchingLayer(layer2, allLayers) {
470170
- return allLayers.find((l2) => {
470171
- var _a3;
470172
- if (((_a3 = layer2.values_) == null ? void 0 : _a3.layerId) && l2.id === layer2.values_.layerId) {
470173
- return true;
470174
- }
470175
- if (layer2.layerId && l2.id === layer2.layerId) {
470176
- return true;
470177
- }
470178
- if (layer2.layerName && l2.name === layer2.layerName) {
470179
- return true;
470223
+ for (const config of allLayers) {
470224
+ if (this.isLayerMatch(layer2, config)) {
470225
+ return config;
470180
470226
  }
470181
- if (layer2.get && layer2.get("id") === l2.id) {
470182
- return true;
470227
+ if (config.children && config.children.length > 0) {
470228
+ const match2 = this.findMatchingLayer(layer2, config.children);
470229
+ if (match2)
470230
+ return match2;
470183
470231
  }
470184
- if (layer2.get && layer2.get("name") === l2.name) {
470185
- return true;
470232
+ if (config.layers && config.layers.length > 0) {
470233
+ const match2 = this.findMatchingLayer(layer2, config.layers);
470234
+ if (match2)
470235
+ return match2;
470186
470236
  }
470187
- return false;
470188
- });
470237
+ }
470238
+ return void 0;
470239
+ }
470240
+ /**
470241
+ * 检查图层实例是否匹配配置
470242
+ */
470243
+ isLayerMatch(layer2, config) {
470244
+ var _a3;
470245
+ if (((_a3 = layer2.values_) == null ? void 0 : _a3.layerId) && config.id === layer2.values_.layerId) {
470246
+ return true;
470247
+ }
470248
+ if (layer2.layerId && config.id === layer2.layerId) {
470249
+ return true;
470250
+ }
470251
+ if (layer2.layerName && config.name === layer2.layerName) {
470252
+ return true;
470253
+ }
470254
+ if (layer2.get && layer2.get("id") === config.id) {
470255
+ return true;
470256
+ }
470257
+ if (layer2.get && layer2.get("name") === config.name) {
470258
+ return true;
470259
+ }
470260
+ return false;
470189
470261
  }
470190
470262
  /**
470191
470263
  * 初始化地图
@@ -470304,7 +470376,7 @@ ${this.attributes_.map(
470304
470376
  const initialCenter = this.config.center || [116.404, 39.915];
470305
470377
  const initialZoom = this.config.zoom || 10;
470306
470378
  this.mapOperationTool = new MapOperationTool(this.map, initialCenter, initialZoom);
470307
- this.geoJsonLocationTool = new GeoJSONLocationTool(this.map);
470379
+ this.geoJsonLocationTool = new GeoJSONLocationTool(this.map, this.featureHighlightManager);
470308
470380
  const popupConfig = this.config.popupConfig || {};
470309
470381
  this.popupManager = new PopupManager(this.map, popupConfig);
470310
470382
  this.bindEventManagerEvents();