iclient for leaflet 服务端专题图

172 阅读2分钟

最近在使用superMap iclient for leaflet 构建自己的地图应用,
专题图制作时发现服务端专题图频繁使用会对服务器造成很大鸭梨,时常导致iserver崩溃。

方案1

采用客户端专题图
例: iclient.supermap.io/examples/le…
实现:需要从服务器查询数据再在浏览器绘制专题图 缺点:查询数据量大的话耗时长,传输慢,且占用浏览器大量内存。地图每次移动都需要重新计算渲染的几何,卡顿。 数据量小可以采用这种方式

方案2

数据量大的情况下采用服务端专题图

思路:

  1. 每次重启iserver会清除前端制作的专题图切片,可以iserver设置清除缓存的时常,最短为1天一次,也可设置一周
  2. 绘制专题图成功时能够拿到服务器端专题图切片的layerID,将layerID存在客户端浏览器内。
  3. 用户再次查看专题图时,先判断layerID是否存在于iserver对应的地图服务下。若存在,则直接使用该切片专题图,若不存在则执行步骤2制作新的切片专题图。

实现:

  1. 服务端专题图绘制可参考官方示例 iclient.supermap.io/examples/le…
  2. 前端缓存此处不赘述,可使用localstorage 我这里用了个localforage插件
  3. 这部分研究了官方服务的一些接口,取巧写了个方法,直接上代码
/**
   * 判断专题图ID是否仍然有效
   * @param layer  图层URL
   * @param layerId  要判断的专题图ID
   */
  ifThemeLayerIDAvailable(layer,layerId){
    return new Promise((reslove,reject)=>{
      if(layerId == null){
        reject(false)
        return
      }
      let checkUrl = layer + '.jsonp/tileImage.json?callback=callback&layersID='+layerId
             $.ajax({
                 url: checkUrl,
                 type: "GET",
                 dataType: "json",  //指定服务器返回的数据类型
                 jsonpCallback: "callback",  //指定回调函数名称
                 success: function (data) {
                    reslove(true)
                 },
                 error: function(err){
                  reject(false)
                 }
             });
    })
  }

总结:方案1可制作小数据量专题图,不会对iserver造成压力。方案2在大数据量专题图展示表现非常优秀,切片用着就是飞一般的感受,若服务器每天清除一次缓存,用户在次日就能看到当天修改的数据。(数据量这么大,估计也不会关心一天修改的边边角角吧...)