tg-map-core 4.1.8 → 4.2.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.
@@ -1529,6 +1529,14 @@ class TalksEventTargetDelegate extends AbstractEventTargetDelegate {
1529
1529
  'center-changed': 'movestart moving moveend zoomend',
1530
1530
  'zoom-changed': 'zoomend',
1531
1531
  });
1532
+ eventTypeMap;
1533
+ /**
1534
+ * @param eventTypeMap 额外的事件类型映射
1535
+ */
1536
+ constructor(inner, coordTypeSupplier, eventTypeMap) {
1537
+ super(inner, coordTypeSupplier);
1538
+ this.eventTypeMap = { ...TalksEventTargetDelegate.EVENT_TYPE_MAP, ...eventTypeMap };
1539
+ }
1532
1540
  addEventListener(type, listener) {
1533
1541
  const key = generateEventKey(type, listener);
1534
1542
  if (this.eventMap.has(key)) {
@@ -1546,14 +1554,14 @@ class TalksEventTargetDelegate extends AbstractEventTargetDelegate {
1546
1554
  }
1547
1555
  listener.call(this.target, ev);
1548
1556
  };
1549
- this.inner.on(TalksEventTargetDelegate.EVENT_TYPE_MAP[type] ?? type, actualListener);
1557
+ this.inner.on(this.eventTypeMap[type] ?? type, actualListener);
1550
1558
  this.eventMap.set(key, actualListener);
1551
1559
  }
1552
1560
  removeEventListener(type, listener) {
1553
1561
  const key = generateEventKey(type, listener);
1554
1562
  const actualListener = this.eventMap.get(key);
1555
1563
  if (actualListener) {
1556
- this.inner.off(TalksEventTargetDelegate.EVENT_TYPE_MAP[type] ?? type, actualListener);
1564
+ this.inner.off(this.eventTypeMap[type] ?? type, actualListener);
1557
1565
  this.eventMap.delete(key);
1558
1566
  }
1559
1567
  else {
@@ -7629,6 +7637,12 @@ class BaseMap {
7629
7637
  removeOverlayMapType(mapType) {
7630
7638
  this.removeLayer(mapType);
7631
7639
  }
7640
+ addOverlay(overlay) {
7641
+ overlay.addTo(this);
7642
+ }
7643
+ removeOverlay(overlay) {
7644
+ overlay.remove();
7645
+ }
7632
7646
  addControl(control) {
7633
7647
  control.addTo(this);
7634
7648
  }
@@ -7665,9 +7679,6 @@ class Overlay {
7665
7679
  removeEventListener(type, listener) {
7666
7680
  this.delegate.removeEventListener(type, listener);
7667
7681
  }
7668
- remove() {
7669
- this.map.removeOverlay(this);
7670
- }
7671
7682
  }
7672
7683
  class GoogleOverlay extends Overlay {
7673
7684
  map;
@@ -7678,6 +7689,13 @@ class GoogleOverlay extends Overlay {
7678
7689
  createDelegate() {
7679
7690
  return new GoogleEventTargetDelegate(this.innerOverlay, this.map);
7680
7691
  }
7692
+ addTo(map) {
7693
+ this.map = map;
7694
+ this.innerOverlay.setMap(map.innerMap);
7695
+ }
7696
+ remove() {
7697
+ this.innerOverlay.setMap(null);
7698
+ }
7681
7699
  isVisible() {
7682
7700
  return this.innerOverlay.getVisible();
7683
7701
  }
@@ -7694,6 +7712,13 @@ class BaiduOverlay extends Overlay {
7694
7712
  createDelegate() {
7695
7713
  return new BaiduEventTargetDelegate(this.innerOverlay, this.map);
7696
7714
  }
7715
+ addTo(map) {
7716
+ this.map = map;
7717
+ this.map.innerMap.addOverlay(this.innerOverlay);
7718
+ }
7719
+ remove() {
7720
+ this.map.innerMap.removeOverlay(this.innerOverlay);
7721
+ }
7697
7722
  /** 仅限内部使用; 设为private时, 生成的d.ts文件中, 方法返回值会变成any, 故改成了public */
7698
7723
  get overlay() {
7699
7724
  // 这几个属性被声明成可选的, 这里将其强转成必选
@@ -7803,11 +7828,43 @@ class GoogleShape extends GoogleOverlay {
7803
7828
  }
7804
7829
  }
7805
7830
  class TalksShape extends TalksOverlay {
7831
+ addTo(map) {
7832
+ this.map = map;
7833
+ this.map.overlayLayer.addGeometry(this.innerOverlay);
7834
+ // 添加到地图中之后, startEdit()才有效
7835
+ if (this.isEditable() && !this.innerOverlay.isEditing()) {
7836
+ this.innerOverlay.startEdit();
7837
+ }
7838
+ }
7839
+ remove() {
7840
+ this.map.overlayLayer.removeGeometry(this.innerOverlay);
7841
+ }
7842
+ /**
7843
+ * ## 编辑状态的映射
7844
+ * tg-map的editable, 直接表示是否处于编辑状态
7845
+ * talks的editable, 只是标记overlay是否可以编辑(默认为true), 要进入编辑状态(isEditing), 还需要执行startEdit()
7846
+ * 也就是说我们需要想办法把talks的四个状态, 映射为tg-map的两个状态
7847
+ *
7848
+ * 我们的做法是, 用editable保存isEditing期望的值, 保证editable为true时isEditing也会为true, 为false时isEditing也会为false
7849
+ * 这样就可以和tg-map的editable的语义简单对应上了
7850
+ *
7851
+ * @see addTo
7852
+ * @see setEditable
7853
+ */
7806
7854
  isEditable() {
7807
- return this.innerOverlay.config().editable ?? true;
7855
+ return this.innerOverlay.config().editable ?? false;
7808
7856
  }
7809
7857
  setEditable(editable) {
7858
+ // 同步设置editable和isEditing
7859
+ // TODO: 2026/01/23 ipcjs 切换编辑状态时, 控制台会报重复注册事件警告, 已提PR: https://github.com/maptalks/maptalks.js/pull/2796
7810
7860
  this.innerOverlay.config({ editable: editable });
7861
+ const isEditing = this.innerOverlay.isEditing();
7862
+ if (editable) {
7863
+ !isEditing && this.innerOverlay.startEdit();
7864
+ }
7865
+ else {
7866
+ isEditing && this.innerOverlay.endEdit();
7867
+ }
7811
7868
  }
7812
7869
  setStrokeColor(color) {
7813
7870
  this.innerOverlay.updateSymbol({ lineColor: color });
@@ -7977,6 +8034,41 @@ class TalksCircle extends TalksShape {
7977
8034
  });
7978
8035
  return new TalksCircle(inner, coord, this);
7979
8036
  }
8037
+ prevCenter;
8038
+ prevRadius;
8039
+ eventHubDelegate;
8040
+ createDelegate() {
8041
+ return (this.eventHubDelegate = new EventHubEventTargetDelegate(super.createDelegate(), {
8042
+ types: ['radius-changed', 'center-changed'],
8043
+ onListen: (type) => {
8044
+ if (type === 'radius-changed') {
8045
+ this.prevRadius = this.innerOverlay.getRadius();
8046
+ this.innerOverlay.on('editrecord', this.onRadiusChanged);
8047
+ }
8048
+ else {
8049
+ this.prevCenter = this.innerOverlay.getCoordinates();
8050
+ this.innerOverlay.on('editrecord', this.onCenterChanged);
8051
+ }
8052
+ },
8053
+ onCancel: (type) => {
8054
+ this.innerOverlay.off('editrecord', type === 'radius-changed' ? this.onRadiusChanged : this.onCenterChanged);
8055
+ },
8056
+ }));
8057
+ }
8058
+ onRadiusChanged = () => {
8059
+ const radius = this.innerOverlay.getRadius();
8060
+ if (this.prevRadius !== radius) {
8061
+ this.eventHubDelegate?.notify({ type: 'radius-changed', target: this });
8062
+ this.prevRadius = radius;
8063
+ }
8064
+ };
8065
+ onCenterChanged = () => {
8066
+ const center = this.innerOverlay.getCoordinates();
8067
+ if (this.prevCenter !== center && !this.prevCenter?.equals(center)) {
8068
+ this.eventHubDelegate?.notify({ type: 'center-changed', target: this });
8069
+ this.prevCenter = center;
8070
+ }
8071
+ };
7980
8072
  setCenter(center) {
7981
8073
  this.coordType = this.map.coordType;
7982
8074
  this.innerOverlay.setCoordinates(center.toTalks(this.coordType));
@@ -9121,6 +9213,13 @@ class TalksLabelOverlay extends TalksOverlay {
9121
9213
  });
9122
9214
  return new TalksLabelOverlay(label, coord, this);
9123
9215
  }
9216
+ addTo(map) {
9217
+ this.map = map;
9218
+ this.innerOverlay.addTo(map.innerMap);
9219
+ }
9220
+ remove() {
9221
+ this.innerOverlay.remove();
9222
+ }
9124
9223
  setContent(content) {
9125
9224
  this.innerOverlay.setContent(content);
9126
9225
  }
@@ -9639,6 +9738,13 @@ class TalksMarker extends TalksOverlay {
9639
9738
  super(innerOverlay, coordType, map);
9640
9739
  this.state = state;
9641
9740
  }
9741
+ addTo(map) {
9742
+ this.map = map;
9743
+ this.map.markerLayer.addGeometry(this.innerOverlay);
9744
+ }
9745
+ remove() {
9746
+ this.map.markerLayer.removeGeometry(this.innerOverlay);
9747
+ }
9642
9748
  getPosition() {
9643
9749
  return LatLng.fromTalks(this.innerOverlay.getCoordinates(), this.coordType);
9644
9750
  }
@@ -9907,6 +10013,12 @@ class TalksPolyline extends TalksShape {
9907
10013
  });
9908
10014
  return new TalksPolyline(inner, coordType, this);
9909
10015
  }
10016
+ createDelegate() {
10017
+ return new TalksEventTargetDelegate(this.innerOverlay, this.map, {
10018
+ // https://maptalks.org/maptalks.js/api/1.x/Geometry.html#event:editrecord
10019
+ 'path-edited': 'editrecord',
10020
+ });
10021
+ }
9910
10022
  getPath() {
9911
10023
  return this.innerOverlay.getCoordinates().map(it => LatLng.fromTalks(it, this.coordType));
9912
10024
  }
@@ -10025,6 +10137,12 @@ class TalksPolygon extends TalksShape {
10025
10137
  });
10026
10138
  return new TalksPolygon(inner, coord, this);
10027
10139
  }
10140
+ createDelegate() {
10141
+ return new TalksEventTargetDelegate(this.innerOverlay, this.map, {
10142
+ // https://maptalks.org/maptalks.js/api/1.x/Geometry.html#event:editrecord
10143
+ 'paths-edited': 'editrecord',
10144
+ });
10145
+ }
10028
10146
  getPaths() {
10029
10147
  return this.innerOverlay.getCoordinates()
10030
10148
  .map(path => path.map(it => LatLng.fromTalks(it, this.coordType)));
@@ -10190,6 +10308,12 @@ class TalksRectangle extends TalksShape {
10190
10308
  height: computeDistanceBetween(nw, bounds.sw),
10191
10309
  };
10192
10310
  }
10311
+ createDelegate() {
10312
+ return new TalksEventTargetDelegate(this.innerOverlay, this.map, {
10313
+ // https://maptalks.org/maptalks.js/api/1.x/Geometry.html#event:editrecord
10314
+ 'bounds-changed': 'editrecord',
10315
+ });
10316
+ }
10193
10317
  getBounds() {
10194
10318
  return LatLngBounds.fromTalks(this.innerOverlay.getExtent(), this.coordType);
10195
10319
  }
@@ -10392,12 +10516,6 @@ class BaiduMap extends BaseMap {
10392
10516
  removeElementOverlay(overlay) {
10393
10517
  this.map.removeOverlay(overlay.asBaidu());
10394
10518
  }
10395
- addOverlay(overlay) {
10396
- this.map.addOverlay(overlay.innerOverlay);
10397
- }
10398
- removeOverlay(overlay) {
10399
- this.map.removeOverlay(overlay.innerOverlay);
10400
- }
10401
10519
  addCustomControl(control) {
10402
10520
  if (!control.inner) {
10403
10521
  const BaiduControl = class extends BMap.Control {
@@ -10618,12 +10736,6 @@ class GoogleMap extends BaseMap {
10618
10736
  removeElementOverlay(overlay) {
10619
10737
  overlay.asGoogle().setMap(null);
10620
10738
  }
10621
- addOverlay(overlay) {
10622
- overlay.innerOverlay.setMap(this.map);
10623
- }
10624
- removeOverlay(overlay) {
10625
- overlay.innerOverlay.setMap(null);
10626
- }
10627
10739
  addCustomControl(control) {
10628
10740
  if (!control.inner) {
10629
10741
  control.inner = control.onCreateElement();
@@ -10772,12 +10884,6 @@ class HereMap extends BaseMap {
10772
10884
  removeElementOverlay(overlay) {
10773
10885
  throw new Error('Method not implemented.');
10774
10886
  }
10775
- addOverlay(overlay) {
10776
- throw new Error('Method not implemented.');
10777
- }
10778
- removeOverlay(overlay) {
10779
- throw new Error('Method not implemented.');
10780
- }
10781
10887
  createMarker(options) {
10782
10888
  throw new Error('Method not implemented.');
10783
10889
  }
@@ -10859,7 +10965,8 @@ const quadKey = (z, x, y) => {
10859
10965
  };
10860
10966
  const talksBaseLayerIds = [
10861
10967
  'osm',
10862
- 'osm-simple',
10968
+ 'osm-light',
10969
+ 'osm-dark',
10863
10970
  'google',
10864
10971
  'baidu',
10865
10972
  'baidu-detail',
@@ -10875,7 +10982,8 @@ function talksBaseLayerIdToCoordType(layerId) {
10875
10982
  case 'baidu':
10876
10983
  case 'baidu-detail':
10877
10984
  return CoordType.bd09;
10878
- case 'osm-simple':
10985
+ case 'osm-light':
10986
+ case 'osm-dark':
10879
10987
  case 'osm':
10880
10988
  case 'yandex':
10881
10989
  return CoordType.wgs84;
@@ -10992,13 +11100,20 @@ function createTalksBaseLayer(layerId, { id = layerId, visible = true, } = {}) {
10992
11100
  subdomains: ['a', 'b', 'c'],
10993
11101
  attribution: '&copy; <a target="_blank" href="http://www.osm.org/copyright">OSM</a>',
10994
11102
  });
10995
- case 'osm-simple':
11103
+ case 'osm-light':
10996
11104
  return new maptalks.TileLayer(id, {
10997
11105
  visible,
10998
11106
  urlTemplate: 'http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png',
10999
11107
  subdomains: ['a', 'b', 'c', 'd'],
11000
11108
  attribution: '&copy; <a target="_blank" href="http://www.osm.org/copyright">OSM</a> contributors, &copy; <a target="_blank" href="https://carto.com/attributions">CARTO</a>',
11001
11109
  });
11110
+ case 'osm-dark':
11111
+ return new maptalks.TileLayer(id, {
11112
+ visible,
11113
+ urlTemplate: 'http://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png',
11114
+ subdomains: ['a', 'b', 'c', 'd'],
11115
+ attribution: '&copy; <a target="_blank" href="http://www.osm.org/copyright">OSM</a> contributors, &copy; <a target="_blank" href="https://carto.com/attributions">CARTO</a>',
11116
+ });
11002
11117
  }
11003
11118
  }
11004
11119
 
@@ -11008,7 +11123,9 @@ class TalksMap extends BaseMap {
11008
11123
  map;
11009
11124
  /** @internal */
11010
11125
  currentBaseLayerId;
11126
+ /** @internal */
11011
11127
  markerLayer;
11128
+ /** @internal */
11012
11129
  overlayLayer;
11013
11130
  constructor(element, mapOptions, baseLayoutIds) {
11014
11131
  super(element);
@@ -11154,22 +11271,6 @@ class TalksMap extends BaseMap {
11154
11271
  removeElementOverlay(overlay) {
11155
11272
  // TODO: 2026/01/05 ipcjs 下一版再实现该功能
11156
11273
  }
11157
- addOverlay(overlay) {
11158
- if (overlay.innerOverlay instanceof maptalks.ui.UIComponent) {
11159
- overlay.innerOverlay.addTo(this.map);
11160
- return;
11161
- }
11162
- const layer = overlay instanceof TalksMarker ? this.markerLayer : this.overlayLayer;
11163
- layer.addGeometry(overlay.innerOverlay);
11164
- }
11165
- removeOverlay(overlay) {
11166
- if (overlay.innerOverlay instanceof maptalks.ui.UIComponent) {
11167
- overlay.innerOverlay.remove();
11168
- return;
11169
- }
11170
- const layer = overlay instanceof TalksMarker ? this.markerLayer : this.overlayLayer;
11171
- layer.removeGeometry(overlay.innerOverlay);
11172
- }
11173
11274
  createMarker = TalksMarker.create;
11174
11275
  createMarkerClusterer(options) {
11175
11276
  return new TalksMarkerClusterer(this, options);