如何防止动态maplayer在每次缩放或平移地图时刷新?

How do I prevent a dynamicMapLayer from refreshing on every zoom or pan of the map?

本文关键字:地图 刷新 缩放 动态 何防止 maplayer      更新时间:2023-09-26

我正在使用传单L.esri.dynamicMapLayer在地图上显示大量的折线,并且向ArcGIS服务器导出请求来绘制它们可能需要一段时间。如果用户快速进行几个缩放或平移,我可能会以一堆待处理的导出请求告终,这也会阻止其他对ArcGIS Server的请求。除了最后一个以外,所有的导出请求都是无用的。

对于其他客户端图层,我已经通过确保用户在自己刷新图层之前停止缩放或平移至少2秒来控制刷新。如何对dynamicMapLayer执行相同的操作?我是否可以暂停或停止自动刷新,并自行决定何时要发出导出请求?

请注意,我们不能为了更好的性能而使用tile,因为其他原因层必须保持动态

如何防止dynamicMapLayer在每次缩放或平移地图时刷新?

你不能。它是那样设计的。

除非esri人员重新设计它以使L.GridLayer的子类而不是L.ImageOverlay,否则几乎没有任何方法可以绕过它。

我已经通过确保用户在自己刷新图层之前停止缩放或平移至少2秒来控制刷新。如何为dynamicMapLayer做同样的事情?

有一个可怕的,丑陋的hack。覆盖私有L.Esri.DynamicMapLayer._update方法,使其成为上一个方法的装饰器,例如:

(function() {
  var previousProto = L.Esri.DynamicMapLayer.prototype;
  L.Esri.DynamicMapLayer.include({
    _update: function(){
       throttle(previousProto._update, 2000);
    }
  });
})();

它很丑,它违背了大多数好的编码实践(覆盖私有方法,呵呵),而且它可能会崩溃。

请注意,我们不能为了更好的性能而使用tile,因为其他原因层必须保持动态。

我不同意。"tiles"并不意味着"静态"。你可以很容易地应用缓存破坏,或者使用一个时间维度,或者将所有数据发送给客户端,并让它将其切片成矢量块以快速渲染,或者使用像Carto(DB)的Torque这样更漂亮的东西。

您的Esri工具不允许您轻松地创建不同的块集,或者不允许对更改的资源进行块访问,或者不允许触发客户端数据失效,这并不意味着它不能完成。