tg-map-core 4.2.2 → 4.2.3

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/README.md CHANGED
@@ -1,3 +1,3 @@
1
- # tg-map-core
2
-
3
- 封装 百度地图, Google地图, Here地图(未完成), Maptalks 的地图库
1
+ # tg-map-core
2
+
3
+ 封装 百度地图, Google地图, Here地图(未完成), Maptalks 的地图库
@@ -18,7 +18,7 @@ export interface MapTypeControlOptions {
18
18
  mapTypes?: MapType[];
19
19
  }
20
20
  export declare class BaiduMapTypeControl extends BaiduControl<BMap.MapTypeControl> implements MapTypeControl {
21
- static create(this: BaiduMap, options: MapTypeControlOptions): EmptyControl | BaiduMapTypeControl;
21
+ static create(this: BaiduMap, options: MapTypeControlOptions): BaiduMapTypeControl | EmptyControl;
22
22
  }
23
23
  export declare class GoogleMapTypeControl extends GoogleControl implements MapTypeControl {
24
24
  type: MapTypeControlType;
@@ -134,6 +134,10 @@ export declare class TalksMarkerClusterer implements MarkerClusterer {
134
134
  private map;
135
135
  inner: ClusterLayer;
136
136
  constructor(map: TalksMap, options: MarkerClustererOptions);
137
+ private checkMarkersVisibility;
138
+ private timeoutId;
139
+ private isRenderStarted;
140
+ private postCheckMarkersVisibility;
137
141
  clearMarkers(removeFromMap?: boolean): void;
138
142
  addMarker(marker: TalksMarker): void;
139
143
  removeMarker(marker: TalksMarker): boolean;
@@ -35,7 +35,7 @@ export declare class BaiduCircle extends BaiduShape<BMap.Circle> implements Circ
35
35
  private isDoingSetCenter;
36
36
  private isDoingSetRadius;
37
37
  private eventHubDelegate;
38
- protected createDelegate(): EventHubEventTargetDelegate<"center-changed" | "radius-changed">;
38
+ protected createDelegate(): EventHubEventTargetDelegate<"radius-changed" | "center-changed">;
39
39
  private onRadiusChanged;
40
40
  private onCenterChanged;
41
41
  private resetEditableTimeoutId;
@@ -60,6 +60,7 @@ export declare class TalksMap extends BaseMap {
60
60
  setDoubleClickZoom(enable: boolean): void;
61
61
  getCenter(): LatLng;
62
62
  setCenter(latlng: LatLng): void;
63
+ setZoom(zoom: number): void;
63
64
  setMinZoom(zoom: number): void;
64
65
  setMaxZoom(zoom: number): void;
65
66
  setMapStyle(mapStyle?: MapStyle): void;
@@ -6,7 +6,7 @@ export declare function talksBaseLayerIdToCoordType(layerId: TalksBaseLayerId |
6
6
  readonly __flavor__?: 'layerId';
7
7
  })): CoordType;
8
8
  declare function createTalksBaseLayerImpl(layerId: TalksBaseLayerId, { id, visible, }?: {
9
- id?: "osm" | "osm-light" | "osm-dark" | "osm-terrain" | "google" | "baidu" | "baidu-detail" | "amap" | "amap-terrain" | "tencent" | "geoq" | "tianditu" | "yandex" | "bing" | undefined;
9
+ id?: "google" | "osm" | "osm-light" | "osm-dark" | "osm-terrain" | "baidu" | "baidu-detail" | "amap" | "amap-terrain" | "tencent" | "geoq" | "tianditu" | "yandex" | "bing" | undefined;
10
10
  visible?: boolean | undefined;
11
11
  }): maptalks.TileLayer;
12
12
  export declare const createTalksBaseLayer: typeof createTalksBaseLayerImpl;
@@ -7120,7 +7120,7 @@ function includesMethod(keys) {
7120
7120
  /** 用于替代Vue2中的filter, 直接交给模板使用 */
7121
7121
  exports.Objects.toJsonSafely;
7122
7122
 
7123
- // cspell: ignore bmaplib, markerclusterer, texticonoverlay
7123
+ // cspell: ignore bmaplib, markerclusterer, texticonoverlay, renderend, renderstart
7124
7124
  const createDefaultStylesIndexCalculator = (_styles) => {
7125
7125
  if (_styles?.[0]?.minMarkersLength == null) {
7126
7126
  return undefined;
@@ -7373,30 +7373,57 @@ class TalksMarkerClusterer {
7373
7373
  }
7374
7374
  });
7375
7375
  map.innerMap.addLayer(this.inner);
7376
- const checkMarkersVisibility = debounce(() => {
7377
- // 检测marker在点聚合中的可见性改变, 然后发送事件通知marker点
7378
- const visibleMarkerSet = new Set(this.inner.getRenderer()?.getCurrentNeedRenderGeos() ?? []);
7379
- const markers = this.inner.getGeometries();
7380
- for (const marker of markers) {
7381
- const prev = marker.__visible_in_cluster ?? marker.isVisible();
7382
- const curr = visibleMarkerSet.has(marker);
7383
- if (prev !== curr) {
7384
- marker.__visible_in_cluster = curr;
7385
- marker.fire('visible-change-in-cluster', { visible: curr });
7386
- }
7376
+ this.inner.on('renderstart', () => {
7377
+ // renderstart在每次渲染时都会触发, renderend在动画时, 不会每次都触发
7378
+ // 渲染过程中, 才会重新计算getCurrentNeedRenderGeos(), 故需要等待渲染执行过之后, 再去执行checkMarkersVisibility
7379
+ this.isRenderStarted = true;
7380
+ });
7381
+ map.innerMap.on('zoomend', this.postCheckMarkersVisibility);
7382
+ this.postCheckMarkersVisibility();
7383
+ }
7384
+ checkMarkersVisibility = () => {
7385
+ // 检测marker在点聚合中的可见性改变, 然后发送事件通知marker点
7386
+ const visibleMarkerSet = new Set(this.inner.getRenderer()?.getCurrentNeedRenderGeos() ?? []);
7387
+ const markers = this.inner.getGeometries();
7388
+ for (const marker of markers) {
7389
+ const prev = marker.__visible_in_cluster ?? marker.isVisible();
7390
+ const curr = visibleMarkerSet.has(marker);
7391
+ if (prev !== curr) {
7392
+ marker.__visible_in_cluster = curr;
7393
+ marker.fire('visible-change-in-cluster', { visible: curr });
7387
7394
  }
7388
- }, 100);
7389
- map.innerMap.on('zoomend', checkMarkersVisibility);
7390
- checkMarkersVisibility();
7391
- }
7395
+ }
7396
+ };
7397
+ timeoutId;
7398
+ isRenderStarted = false;
7399
+ postCheckMarkersVisibility = () => {
7400
+ clearTimeout(this.timeoutId);
7401
+ if (!this.inner.getCount()) {
7402
+ // 没有marker点, 不需要检测
7403
+ return;
7404
+ }
7405
+ this.isRenderStarted = false;
7406
+ const waitRenderStarted = (times = 0) => {
7407
+ // 为了防止无限等待, 最多等3次
7408
+ if (this.isRenderStarted || times > 3) {
7409
+ this.checkMarkersVisibility();
7410
+ }
7411
+ else {
7412
+ this.timeoutId = setTimeout(() => waitRenderStarted(times + 1), 50);
7413
+ }
7414
+ };
7415
+ this.timeoutId = setTimeout(waitRenderStarted, 100);
7416
+ };
7392
7417
  clearMarkers(removeFromMap = true) {
7393
7418
  this.inner.clear();
7394
7419
  if (removeFromMap) {
7395
7420
  this.inner.remove();
7421
+ clearTimeout(this.timeoutId);
7396
7422
  }
7397
7423
  }
7398
7424
  addMarker(marker) {
7399
7425
  this.inner.addMarker(marker.innerOverlay);
7426
+ this.postCheckMarkersVisibility();
7400
7427
  }
7401
7428
  removeMarker(marker) {
7402
7429
  this.inner.removeGeometry(marker.innerOverlay);
@@ -7404,6 +7431,7 @@ class TalksMarkerClusterer {
7404
7431
  }
7405
7432
  addMarkers(markers) {
7406
7433
  this.inner.addMarker(markers.map(it => it.innerOverlay));
7434
+ this.postCheckMarkersVisibility();
7407
7435
  }
7408
7436
  removeMarkers(markers) {
7409
7437
  this.inner.removeGeometry(markers.map(it => it.innerOverlay));
@@ -9189,9 +9217,9 @@ class BaiduLabelOverlay extends BaiduOverlay {
9189
9217
  icon.__icon__.scale,
9190
9218
  icon.__icon__.strokeWeight,
9191
9219
  ].map(it => it ?? '').join(',');
9192
- console.warn('BaiduLabelOverlay.attachIcon', icon.__icon__, exports.Strings.trimIndent(`
9193
- 为了保证Label的位置正确, 请将SymbolIcon(${iconInfo})中baiduLabelOffset的值改写成:
9194
- ${JSON.stringify({ x, y })}
9220
+ console.warn('BaiduLabelOverlay.attachIcon', icon.__icon__, exports.Strings.trimIndent(`
9221
+ 为了保证Label的位置正确, 请将SymbolIcon(${iconInfo})中baiduLabelOffset的值改写成:
9222
+ ${JSON.stringify({ x, y })}
9195
9223
  `));
9196
9224
  }
9197
9225
  }, 1);
@@ -9295,7 +9323,7 @@ class TalksLabelOverlay extends TalksOverlay {
9295
9323
  });
9296
9324
  }
9297
9325
  setZIndex(zIndex) {
9298
- this.setZIndex(zIndex);
9326
+ this.innerOverlay.setZIndex(zIndex);
9299
9327
  }
9300
9328
  }
9301
9329
 
@@ -9874,6 +9902,7 @@ class TalksMarker extends TalksOverlay {
9874
9902
  };
9875
9903
  const mapChanged = this.labelMapChangedListener = () => {
9876
9904
  // 存在layer说明marker已经被添加到地图上, label也要添加进去
9905
+ // TODO: 2026/02/05 ipcjs 向talks地图中添加label非常耗时, 并且如果在点聚合中, 大部分label其实会被隐藏, 这里是一个可以优化的点
9877
9906
  if (this.innerOverlay.getLayer()) {
9878
9907
  this.map.addOverlay(label);
9879
9908
  }
@@ -11385,6 +11414,10 @@ class TalksMap extends BaseMap {
11385
11414
  setCenter(latlng) {
11386
11415
  this.map.setCenter(latlng.toTalks(this.coordType));
11387
11416
  }
11417
+ setZoom(zoom) {
11418
+ // tg-map中, setZoom的语义是直接改变zoom, 不播放动画
11419
+ this.map.setZoom(zoom, { animation: false });
11420
+ }
11388
11421
  setMinZoom(zoom) {
11389
11422
  this.map.setMinZoom(zoom);
11390
11423
  }
@@ -7093,7 +7093,7 @@ function includesMethod(keys) {
7093
7093
  /** 用于替代Vue2中的filter, 直接交给模板使用 */
7094
7094
  Objects.toJsonSafely;
7095
7095
 
7096
- // cspell: ignore bmaplib, markerclusterer, texticonoverlay
7096
+ // cspell: ignore bmaplib, markerclusterer, texticonoverlay, renderend, renderstart
7097
7097
  const createDefaultStylesIndexCalculator = (_styles) => {
7098
7098
  if (_styles?.[0]?.minMarkersLength == null) {
7099
7099
  return undefined;
@@ -7346,30 +7346,57 @@ class TalksMarkerClusterer {
7346
7346
  }
7347
7347
  });
7348
7348
  map.innerMap.addLayer(this.inner);
7349
- const checkMarkersVisibility = debounce(() => {
7350
- // 检测marker在点聚合中的可见性改变, 然后发送事件通知marker点
7351
- const visibleMarkerSet = new Set(this.inner.getRenderer()?.getCurrentNeedRenderGeos() ?? []);
7352
- const markers = this.inner.getGeometries();
7353
- for (const marker of markers) {
7354
- const prev = marker.__visible_in_cluster ?? marker.isVisible();
7355
- const curr = visibleMarkerSet.has(marker);
7356
- if (prev !== curr) {
7357
- marker.__visible_in_cluster = curr;
7358
- marker.fire('visible-change-in-cluster', { visible: curr });
7359
- }
7349
+ this.inner.on('renderstart', () => {
7350
+ // renderstart在每次渲染时都会触发, renderend在动画时, 不会每次都触发
7351
+ // 渲染过程中, 才会重新计算getCurrentNeedRenderGeos(), 故需要等待渲染执行过之后, 再去执行checkMarkersVisibility
7352
+ this.isRenderStarted = true;
7353
+ });
7354
+ map.innerMap.on('zoomend', this.postCheckMarkersVisibility);
7355
+ this.postCheckMarkersVisibility();
7356
+ }
7357
+ checkMarkersVisibility = () => {
7358
+ // 检测marker在点聚合中的可见性改变, 然后发送事件通知marker点
7359
+ const visibleMarkerSet = new Set(this.inner.getRenderer()?.getCurrentNeedRenderGeos() ?? []);
7360
+ const markers = this.inner.getGeometries();
7361
+ for (const marker of markers) {
7362
+ const prev = marker.__visible_in_cluster ?? marker.isVisible();
7363
+ const curr = visibleMarkerSet.has(marker);
7364
+ if (prev !== curr) {
7365
+ marker.__visible_in_cluster = curr;
7366
+ marker.fire('visible-change-in-cluster', { visible: curr });
7360
7367
  }
7361
- }, 100);
7362
- map.innerMap.on('zoomend', checkMarkersVisibility);
7363
- checkMarkersVisibility();
7364
- }
7368
+ }
7369
+ };
7370
+ timeoutId;
7371
+ isRenderStarted = false;
7372
+ postCheckMarkersVisibility = () => {
7373
+ clearTimeout(this.timeoutId);
7374
+ if (!this.inner.getCount()) {
7375
+ // 没有marker点, 不需要检测
7376
+ return;
7377
+ }
7378
+ this.isRenderStarted = false;
7379
+ const waitRenderStarted = (times = 0) => {
7380
+ // 为了防止无限等待, 最多等3次
7381
+ if (this.isRenderStarted || times > 3) {
7382
+ this.checkMarkersVisibility();
7383
+ }
7384
+ else {
7385
+ this.timeoutId = setTimeout(() => waitRenderStarted(times + 1), 50);
7386
+ }
7387
+ };
7388
+ this.timeoutId = setTimeout(waitRenderStarted, 100);
7389
+ };
7365
7390
  clearMarkers(removeFromMap = true) {
7366
7391
  this.inner.clear();
7367
7392
  if (removeFromMap) {
7368
7393
  this.inner.remove();
7394
+ clearTimeout(this.timeoutId);
7369
7395
  }
7370
7396
  }
7371
7397
  addMarker(marker) {
7372
7398
  this.inner.addMarker(marker.innerOverlay);
7399
+ this.postCheckMarkersVisibility();
7373
7400
  }
7374
7401
  removeMarker(marker) {
7375
7402
  this.inner.removeGeometry(marker.innerOverlay);
@@ -7377,6 +7404,7 @@ class TalksMarkerClusterer {
7377
7404
  }
7378
7405
  addMarkers(markers) {
7379
7406
  this.inner.addMarker(markers.map(it => it.innerOverlay));
7407
+ this.postCheckMarkersVisibility();
7380
7408
  }
7381
7409
  removeMarkers(markers) {
7382
7410
  this.inner.removeGeometry(markers.map(it => it.innerOverlay));
@@ -9162,9 +9190,9 @@ class BaiduLabelOverlay extends BaiduOverlay {
9162
9190
  icon.__icon__.scale,
9163
9191
  icon.__icon__.strokeWeight,
9164
9192
  ].map(it => it ?? '').join(',');
9165
- console.warn('BaiduLabelOverlay.attachIcon', icon.__icon__, Strings.trimIndent(`
9166
- 为了保证Label的位置正确, 请将SymbolIcon(${iconInfo})中baiduLabelOffset的值改写成:
9167
- ${JSON.stringify({ x, y })}
9193
+ console.warn('BaiduLabelOverlay.attachIcon', icon.__icon__, Strings.trimIndent(`
9194
+ 为了保证Label的位置正确, 请将SymbolIcon(${iconInfo})中baiduLabelOffset的值改写成:
9195
+ ${JSON.stringify({ x, y })}
9168
9196
  `));
9169
9197
  }
9170
9198
  }, 1);
@@ -9268,7 +9296,7 @@ class TalksLabelOverlay extends TalksOverlay {
9268
9296
  });
9269
9297
  }
9270
9298
  setZIndex(zIndex) {
9271
- this.setZIndex(zIndex);
9299
+ this.innerOverlay.setZIndex(zIndex);
9272
9300
  }
9273
9301
  }
9274
9302
 
@@ -9847,6 +9875,7 @@ class TalksMarker extends TalksOverlay {
9847
9875
  };
9848
9876
  const mapChanged = this.labelMapChangedListener = () => {
9849
9877
  // 存在layer说明marker已经被添加到地图上, label也要添加进去
9878
+ // TODO: 2026/02/05 ipcjs 向talks地图中添加label非常耗时, 并且如果在点聚合中, 大部分label其实会被隐藏, 这里是一个可以优化的点
9850
9879
  if (this.innerOverlay.getLayer()) {
9851
9880
  this.map.addOverlay(label);
9852
9881
  }
@@ -11358,6 +11387,10 @@ class TalksMap extends BaseMap {
11358
11387
  setCenter(latlng) {
11359
11388
  this.map.setCenter(latlng.toTalks(this.coordType));
11360
11389
  }
11390
+ setZoom(zoom) {
11391
+ // tg-map中, setZoom的语义是直接改变zoom, 不播放动画
11392
+ this.map.setZoom(zoom, { animation: false });
11393
+ }
11361
11394
  setMinZoom(zoom) {
11362
11395
  this.map.setMinZoom(zoom);
11363
11396
  }