ArcGIS JS API 4.24影像图层ImageryLayer加载太慢又不能做切片?

使用场景

使用arcgis api在网页上加载影像图层时,影像服务因为需要根据影像单景id来过滤图层,没办法在发布服务的时候做切片处理,此时影像速度加载过慢,想要优化加载速度。查询良久后无果,自暴自弃浑水摸鱼半天过后,向组里的大佬请教,大佬给我指了一条路说去吧小伙子,这是我去年开拓出来的路,路上遇到啥不懂的随时问。感动,这就是大佬么,还是抱大腿快乐嗷(废柴猫猫流泪跳起冲向前方.gif)。这是大佬的csdn账号https://blog.csdn.net/zmskra?type=blog,易智瑞的webgis开发大佬,webgis开发相关的问题有需要可以去找大佬付费咨询

思路

使用arcgis api中提供的BaseTileLayer相关内容,参考了arcgis官网的以下内容后:
1、Custom TileLayer的例子:https://developers.arcgis.com/javascript/latest/sample-code/layers-custom-tilelayer/
2、TileInfo的文档:https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-support-TileInfo.html
技术路线为:使用BaseTileLayer提供的createSubclass()创建自定义切片图层方法,在前端页面中用切片的形式加载影像图层

实例

技术框架:vue2 + arcgis api for js
0、初始化地图

this.map = new Map({
      // basemap: basemap,
      // layers: [],
  });
const params = {
      container: 'viewDiv',
      zoom: 5,
      center: [110, 35],
      map: this.map,
      constraints: {
          maxZoom: 18,
          minZoom: 4
      },
  };
//2维
this.activeView = new MapView(params);
//3维
this.activeView = new SceneView(params);

1、要加载动态切片,首先要确认当前坐标系以及切片方案,这里我用的是两种,都列上去了

const refList = [
  {
    name: '3857',
    wkid: 102100,
    latestWkid: 3857,
    origin: {x:-20037508.342787,y:20037508.342787},
    size: [256, 256],
    format: 'jpgpng',
    lods: [
      {levelValue: 0,level:0,resolution:156543.03392800014,scale:591657527.591555},
      {levelValue: 1,level:1,resolution:78271.51696399994,scale:295828763.795777},
      {levelValue: 2,level:2,resolution:39135.75848200009,scale:147914381.897889},
      {levelValue: 3,level:3,resolution:19567.87924099992,scale:73957190.948944},
      {levelValue: 4,level:4,resolution:9783.93962049996,scale:36978595.474472},
      {levelValue: 5,level:5,resolution:4891.96981024998,scale:18489297.737236},
      {levelValue: 6,level:6,resolution:2445.98490512499,scale:9244648.868618},
      {levelValue: 7,level:7,resolution:1222.992452562495,scale:4622324.434309},
      {levelValue: 8,level:8,resolution:611.4962262813797,scale:2311162.217155},
      {levelValue: 9,level:9,resolution:305.74811314055756,scale:1155581.108577},
      {levelValue: 10,level:10,resolution:152.87405657041106,scale:577790.554289},
      {levelValue: 11,level:11,resolution:76.43702828507324,scale:288895.277144},
      {levelValue: 12,level:12,resolution:38.21851414253662,scale:144447.638572},
      {levelValue: 13,level:13,resolution:19.10925707126831,scale:72223.819286},
      {levelValue: 14,level:14,resolution:9.554628535634155,scale:36111.909643},
      {levelValue: 15,level:15,resolution:4.77731426794937,scale:18055.954822},
      {levelValue: 16,level:16,resolution:2.388657133974685,scale:9027.977411},
      {levelValue: 17,level:17,resolution:1.1943285668550503,scale:4513.988705},
      {levelValue: 18,level:18,resolution:0.5971642835598172,scale:2256.994353},
      {levelValue: 19,level:19,resolution:0.29858214164761665,scale:1128.497176},
      {levelValue: 20,level:20,resolution:0.14929107082380833,scale:564.248588},
      {levelValue: 21,level:21,resolution:0.07464553541190416,scale:282.124294},
      {levelValue: 22,level:22,resolution:0.03732276770595208,scale:141.062147},
      {levelValue: 23,level:23,resolution:0.01866138385297604,scale:71.5310735}
    ]
  },
  {
    name: '4326',
    wkid: 4326,
    latestWkid: 4326,
    origin: {x:-180,y:90},
    size: [256, 256],
    format: 'jpgpng',
    lods: [
      {levelValue: 0,level:0,resolution:0.703125013115789,scale:2.95497598570834E8},
      {levelValue: 1,level:1,resolution:0.3515625065578945,scale:1.47748799285417E8},
      {levelValue: 2,level:2,resolution:0.17578125327894775,scale:7.38743996427087E7},
      {levelValue: 3,level:3,resolution:0.08789062663947399,scale:3.69371998213544E7},
      {levelValue: 4,level:4,resolution:0.043945313319736994,scale:1.84685999106772E7},
      {levelValue: 5,level:5,resolution:0.021972656659868472,scale:9234299.95533859},
      {levelValue: 6,level:6,resolution:0.010986328329934226,scale:4617149.97766929},
      {levelValue: 7,level:7,resolution:0.005493164164967124,scale:2308574.98883465},
      {levelValue: 8,level:8,resolution:0.0027465820824835504,scale:1154287.49441732},
      {levelValue: 9,level:9,resolution:0.0013732910412417797,scale:577143.747208662},
      {levelValue: 10,level:10,resolution:0.0006866455206208899,scale:288571.873604331},
      {levelValue: 11,level:11,resolution:0.0003433227603104438,scale:144285.936802165},
      {levelValue: 12,level:12,resolution:0.0001716613801552224,scale:72142.9684010827},
      {levelValue: 13,level:13,resolution:0.00008583069007761132,scale:36071.4842005414},
      {levelValue: 14,level:14,resolution:0.00004291534503880566,scale:18035.7421002707},
      {levelValue: 15,level:15,resolution:0.000021457672519402802,scale:9017.87105013534},
      {levelValue: 16,level:16,resolution:0.000010728836259701402,scale:4508.93552506767},
      {levelValue: 17,level:17,resolution:0.000005364418129850701,scale:2254.467762533835},
      {levelValue: 18,level:18,resolution:0.0000026822090649253505,scale:1127.2338812669175},
      {levelValue: 19,level:19,resolution:0.0000013411045324626752,scale:563.6169406334587},
      {levelValue: 20,level:20,resolution:0.0000006705522662313376,scale:281.80847031672937},
      {levelValue: 21,level:21,resolution:0.0000003352761331156688,scale:140.90423515836468},
      {levelValue: 22,level:22,resolution:0.0000001676380665578344,scale:70.45211757918234},
      {levelValue: 23,level:23,resolution:0.0000000838190332789172,scale:35.22605878959117}
    ]
  }
]

2、项目中引入所需模块

import refList from "../js/refLod"
import esriRequest from "@arcgis/core/request"
import BaseTileLayer from "@arcgis/core/layers/BaseTileLayer.js"
import TileInfo from "@arcgis/core/layers/support/TileInfo"

3、构造图层函数

async tileimageLayer(url, id, lockRasterIds, nowRef) {
    const _self = this;
    let teLayer = null;
    const tileimageLayer = BaseTileLayer.createSubclass({
        properties: {
            urlTemplate: null
        },
        getTileUrl: function (level, row, col) {
            // console.log("getTileUrl里的this",this);
            const lt_x = this.tileInfo.origin.x +
                col * this.tileInfo.lods[level].resolution 
                * this.tileInfo.size[0],
            lt_y = this.tileInfo.origin.y -
                row * this.tileInfo.lods[level].resolution 
                * this.tileInfo.size[1],
            rb_x = this.tileInfo.origin.x +
                (col + 1) *
                this.tileInfo.lods[level].resolution *
                this.tileInfo.size[0],
            rb_y = this.tileInfo.origin.y -
                (row + 1) *
                this.tileInfo.lods[level].resolution *
                this.tileInfo.size[1],
            bbox = lt_x + "," + rb_y + "," + rb_x + "," + lt_y,
            content = {
                bbox: bbox,
                size: this.tileInfo.size[0] + "," + this.tileInfo.size[1],
                dpi: this.tileInfo["dpi"],
                format: this.tileInfo["format"],
                bboxSR: this.bboxSR,
                imageSR: this.imageSR,
                // pixelType:this.pixelType,
                // noData:"0,0,0",
                mosaicRule:JSON.stringify({
                    "mosaicMethod":"esriMosaicLockRaster",
                    "lockRasterIds":this.lockRasterIds,
                }),
                transparent: true,
                f: "image",
            };
            return content;
        }, 
        fetchTile: function (level, row, col) {
            const content = this.getTileUrl(level, row, col);
            return esriRequest(this.urlTemplate + "/exportImage", {
                responseType: "image",
                query: content,
                // body:content,
                allowImageDataAccess: true,
            }).then(response => {
                const image = response.data,
                    width = this.tileInfo.size[0],
                    height = this.tileInfo.size[0],
                    canvas = document.createElement("canvas"),
                    context = canvas.getContext("2d");
                canvas.width = width;
                canvas.height = height;
                context.drawImage(image, 0, 0, width, height);
                return canvas;
            })
        },
    }),
    tileInfo = TileInfo.create({
        dpi: 96,
        format: nowRef.format,
        size: nowRef.origin.size,
        origin: {
            x: nowRef.origin.x,
            y: nowRef.origin.y,
            type: 'Point',
            spatialReference: {
                wkid: nowRef.wkid
            }
        },
        spatialReference: {
            wkid: nowRef.wkid
        },
        lods: nowRef.lods
    });
    teLayer = new tileimageLayer({
        title: "raster Layer",
        id: id,
        urlTemplate: url,
        tileInfo: tileInfo,
        bboxSR: nowRef.wkid,
        imageSR: nowRef.wkid,
        lockRasterIds: lockRasterIds,
        ascending: true,
    })
    return teLayer;
},

4、使用函数生成图层并加载

//首先选出来当前场景的坐标系
const nowRef = refList.find(l => {
  return l.wkid == this.activeView.spatialReference.wkid
})
//id是从影像服务中查询到的单景影像的objectId
const raster = this.tileimageLayer(url, "imgLayer", [id], nowRef)
this.map.add(raster, 0);

5、打完收功

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容