【问题标题】:Map scrolling performance issue when using vectorGrid with ngx-leaflet使用带有 ngx-leaflet 的 vectorGrid 时的地图滚动性能问题
【发布时间】:2019-01-27 21:27:18
【问题描述】:

我正在使用 Leaflet + VectorGrid + ngx-leaflet 在 Angular 应用程序的地图上显示矢量切片。但是,当显示的点太多时,滚动变得非常缓慢且不可能。减少点数可以改善情况。

当简单地使用 Leaflet + Vectorgrid 时,同样的场景效果很好 (plunker),所以我相信在使用 ngx-leaflet 时会有一些鼠标事件被垃圾邮件。我该如何改善这种情况?我已经在demo app from ngx-leaflet 上重现了该问题,但无法使其与 plunker 一起使用。

【问题讨论】:

    标签: angular leaflet ngx-leaflet


    【解决方案1】:

    这里可能发生的情况是,您在 Angular 区域内添加了 VectorGrid 层,这意味着 Angular 将猴子补丁更改检测挂钩到所有已注册的事件回调中。基本上,您是正确的,因为所有鼠标事件都在向 Angular 的更改检测发送垃圾邮件。

    如果您查看 ngx-leaflet 核心指令,您将看到地图是如何在 Angular 区域之外创建的。您想做类似的事情(我没有对此进行测试,但这应该是正确的基本想法):

    constructor(private zone: NgZone) {}
    ...
    onMapReady(map: any) {
      // noinspection JSUnusedGlobalSymbols
      const vectorTileOptions = {
        vectorTileLayerStyles: {
          "cities-point": (p: any) => this.stylingFunction(p)
        },
        interactive: true
      };
    
    
      // Create outside of angular so the events don't trigger change detection
      this.zone.runOutsideAngular(() => {
        L.vectorGrid.protobuf(
          "http://localhost:9999/maps/batimap/{z}/{x}/{y}.vector.pbf",
          vectorTileOptions
        ).addTo(map);
      });
    }
    

    这里唯一的技巧是,当您真的希望 Angular 注意到您在注册到其中一个事件的处理程序中所做的更改时,您必须手动调用更改检测。但是,当您像这样包装非 Angular 库时,这是相当标准的做法。当您希望数据绑定的自动化工作时,这是使事情高效工作的唯一方法。

    【讨论】:

    • 这个想法看起来不错,但它并不能解决问题。似乎仍有事件被发送垃圾邮件(?)。我不知道如何处理 - 此外,如果 I copy the leaflet+vectorgrid alternative 在 angular 应用程序旁边(在 内),它也开始滞后。所以我相信 Angular 正在监听这些事件,而它不应该监听这些事件?
    • 我开始分析这个问题,我可以看到mouseup 事件是导致性能不佳的原因。它触发了应用程序的整个重新布局。无论如何在 ngx-leaflet 中禁用/不收听它?
    猜你喜欢
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 2021-10-31
    • 2020-11-12
    • 1970-01-01
    • 2018-05-15
    相关资源
    最近更新 更多