arcgis for javascript TileLayer 自定义高德地图图层

news2025/7/10 13:31:05

效果如图:
在这里插入图片描述

一、创建自定义切片层

要创建自定义图块层,您必须调用BaseTileLayer类的createSubclass()方法。命名自定义层为TintLayer
由于这一层需要知道在哪里访问预定义的图块,我们将创建一个属性。应用程序将为图层提供值,图层将从生成的 URL 中获取切片。然后在显示每个图像之前将差异混合操作应用于 Stamen 块。我们将在该层上创建一个属性,以便应用程序可以指定一种颜色,该颜色将用于混合操作

 
const TintLayer = BaseTileLayer.createSubclass({
  // 设置特定于此图层的特性
  properties: {
    // tile的url,由应用程序提供
    urlTemplate: null,
	// 更改图层颜色
    tint: {
      value: null,
      type: Color
    }
  }
});

可以通过两种不同的方式扩展 BaseTileLayer

  1. 请求图块,因为它们是从数据源预定义的
  2. 图像或数据需要在视图中显示之前进行预处理

二、请求图块

要请求从数据源预定义的图像,请覆盖getTileUrl()方法,以便它返回给定级别、行和列的所请求图块的 URL。

const MyCustomTileLayer = BaseTileLayer.createSubclass({
  properties: {
    urlTemplate: null
  },

  // 重写getTileUrl()
  // 为LayerView提供的给定级别、行和列生成tile url
  getTileUrl: function(level, row, col) {
    return this.urlTemplate
      .replace("{z}", level)
      .replace("{x}", col)
      .replace("{y}", row);
  }
});

三. 图像或数据在视图中显示之前需要进行预处理

如果数据或图块需要在显示前进行预处理,则覆盖fetchTile()方法。图像和颜色混合后,最终结果将显示在视图中

const TintLayer = BaseTileLayer.createSubclass({
          properties: {
            urlTemplate: null,
            tint: {
              value: null,
              type: Color,
            },
          },

          //为LayerView提供的给定级别、行和列生成tile url
          getTileUrl: function (level, row, col) {
            return this.urlTemplate.replace("{z}", level).replace("{x}", col).replace("{y}", row);
          },

          // 此方法获取指定级别和大小的瓦片
          // 重写此方法以处理从服务器返回的数据
          fetchTile: function (level, row, col, options) {
            // 调用getTileUrl()方法来构造tiles的URL
            // 对于LayerView提供的给定级别、行和列
            const url = this.getTileUrl(level, row, col);

            // 基于生成的url请求平铺
            // the signal option 确保废弃的请求被中止
            return esriRequest(url, {
              responseType: "image",
              signal: options && options.signal,
            }).then(
              function (response) {
                // esri请求解析成功时
                // 从响应中获取图像
                const image = response.data;
                const width = this.tileInfo.size[0];
                const height = this.tileInfo.size[0];

                // 使用二维渲染上下文创建画布
                const canvas = document.createElement("canvas");
                const context = canvas.getContext("2d");
                canvas.width = width;
                canvas.height = height;

                // 将应用程序提供的色调应用于画布
                if (this.tint) {
                  // 获取一个rgba形式的CSS颜色字符串,表示tint color实例.
                  context.fillStyle = this.tint.toCss();
                  context.fillRect(0, 0, width, height);

                  // 在画布和steman平铺之间应用“差异”混合操作。差值混合操作从顶层(瓦片)中减去底层(画布),或者反过来总是得到一个正值
                  context.globalCompositeOperation = "difference";
                }

                //将混合图像绘制到画布上。
                context.drawImage(image, 0, 0, width, height);

                return canvas;
              }.bind(this)
            );
          },
        });

四、使用自定义切片层

        // 创建TintLayer的新实例并设置其属性
        let jianyueTileLayer = new TintLayer({
          urlTemplate: "http://webst01.is.autonavi.com/appmaptile?style=7&x={x}&y={y}&z={z}",
          title: "高德",
        });
        // 将自定义平铺层的新实例添加到地图
        const map = new Map({
          layers: [jianyueTileLayer],
        });

        // 创建新的场景视图并添加贴图
        const view = new SceneView({
          container: "viewDiv",
          map: map,
          center: [0, 30],
          zoom: 3,
          environment: {
            lighting: {
              type: "virtual",
            },
          },
        });

五、完整代码如下:

<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no" />
    <title>Custom TileLayer</title>
    <style>
      html,
      body,
      #viewDiv {
        padding: 0;
        margin: 0;
        height: 100%;
        width: 100%;
      }
    </style>
    <link rel="stylesheet" href="https://js.arcgis.com/4.26/esri/themes/light/main.css" />
    <script src="https://js.arcgis.com/4.26/"></script>

    <script>
      require([
        "esri/Map",
        "esri/request",
        "esri/Color",
        "esri/views/SceneView",
        "esri/widgets/LayerList",
        "esri/layers/BaseTileLayer",
      ], (Map, esriRequest, Color, SceneView, LayerList, BaseTileLayer) => {
        // *******************************************************
        // 自定义图层类代码
        // 创建一个BaseTileLayer的子类
        // *******************************************************

        const TintLayer = BaseTileLayer.createSubclass({
          properties: {
            urlTemplate: null,
            tint: {
              value: null,
              type: Color,
            },
          },

          //为LayerView提供的给定级别、行和列生成tile url
          getTileUrl: function (level, row, col) {
            return this.urlTemplate.replace("{z}", level).replace("{x}", col).replace("{y}", row);
          },

          // 此方法获取指定级别和大小的瓦片
          // 重写此方法以处理从服务器返回的数据
          fetchTile: function (level, row, col, options) {
            // 调用getTileUrl()方法来构造tiles的URL
            // 对于LayerView提供的给定级别、行和列
            const url = this.getTileUrl(level, row, col);

            // 基于生成的url请求平铺
            // the signal option 确保废弃的请求被中止
            return esriRequest(url, {
              responseType: "image",
              signal: options && options.signal,
            }).then(
              function (response) {
                // esri请求解析成功时
                // 从响应中获取图像
                const image = response.data;
                const width = this.tileInfo.size[0];
                const height = this.tileInfo.size[0];

                // 使用二维渲染上下文创建画布
                const canvas = document.createElement("canvas");
                const context = canvas.getContext("2d");
                canvas.width = width;
                canvas.height = height;

                // 将应用程序提供的色调应用于画布
                if (this.tint) {
                  // 获取一个rgba形式的CSS颜色字符串,表示tint color实例.
                  context.fillStyle = this.tint.toCss();
                  context.fillRect(0, 0, width, height);

                  // 在画布和steman平铺之间应用“差异”混合操作。差值混合操作从顶层(瓦片)中减去底层(画布),或者反过来总是得到一个正值
                  context.globalCompositeOperation = "difference";
                }

                //将混合图像绘制到画布上。
                context.drawImage(image, 0, 0, width, height);

                return canvas;
              }.bind(this)
            );
          },
        });
        let jianyueTileLayer = new TintLayer({
          urlTemplate: "http://webst01.is.autonavi.com/appmaptile?style=7&x={x}&y={y}&z={z}",
          title: "高德",
        });
        // 将自定义平铺层的新实例添加到地图
        const map = new Map({
          layers: [jianyueTileLayer],
        });

        // 创建新的场景视图并添加贴图
        const view = new SceneView({
          container: "viewDiv",
          map: map,
          center: [0, 30],
          zoom: 3,
          environment: {
            lighting: {
              type: "virtual",
            },
          },
        });

        // 创建图层列表小部件
        const layerList = new LayerList({
          view: view,
        });
        view.ui.add(layerList, "top-right");
      });
    </script>
  </head>

  <body>
    <div id="viewDiv"></div>
  </body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/618821.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全球首发 《NGINX 完全指南》中文版

原文作者&#xff1a;Derek DeJonghe of F5 原文链接&#xff1a;全球首发 | 《NGINX 完全指南》中文版 转载来源&#xff1a;NGINX 开源社区 NGINX唯一中文官方社区 &#xff0c;尽在nginx.org.cn 在社区小伙伴们的催促下&#xff0c;我们很高兴地与大家分享这个好消息&#…

关于阵列发射端的波束形成(相控阵)研究与仿真实践

说明 相控阵是一个很大的话题&#xff0c;相控阵说得直白一点就是通过控制天线阵列中各个天线的相位来使得波束指向我们想要的方向。现阶段相控阵雷达用得更多的还是军事领域&#xff0c;不过随着技术的进步、成本的下降以及小型化&#xff0c;相控阵雷达也逐渐被用于民用领域了…

Python之Gradio简单使用

目录 安装Gradio示例用法应用界面1. gr.Interface2. gr.Blocks Gradio的输入和输出组件输入组件&#xff08;Inputs&#xff09;输出组件&#xff08;Outputs&#xff09; 其他 Gradio是一个Python库&#xff0c;用于构建快速的Web界面&#xff0c;以便于使用机器学习模型进行实…

Vue.js 中的 watch 属性详解

Vue.js 中的 watch 属性详解 在 Vue.js 中&#xff0c;watch 属性是一种非常重要的属性&#xff0c;它可以监听 Vue 实例中指定的数据变化&#xff0c;并在数据发生变化时执行相应的操作。本文将对 Vue.js 中的 watch 属性进行详细的介绍&#xff0c;并附上相关的代码示例。 什…

一文看穿 TypeScript 的庐山真面目

导语&#xff1a; 在了解 TypeScript 之前&#xff0c;我们需要了解 什么是强类型语言和什么是弱类型语言&#xff0c;以及什么是静态类型&#xff0c;什么又是动态类型。 强类型不允许任意的隐式类型转换&#xff0c;而 弱类型 允许静态类型&#xff1a;一个变量声明时它的类型…

基于Python的大数据舆情分析,舆论情感分析可视化系统

运行效果图 基于Python的微博大数据舆情分析&#xff0c;舆论情感分析可视化系统 系统介绍 微博舆情分析系统&#xff0c;项目后端分爬虫模块、数据分析模块、数据存储模块、业务逻辑模块组成。 先后进行了数据获取和筛选存储&#xff0c;对存储后的数据库数据进行提取分析处…

sqlmap -os-shell 使用方法

一、burp suite抓包。 如上图所示&#xff0c;红框处很明显是一个传参点&#xff0c;我们就在这个页面抓包。 抓到包之后将内容保存到桌面的1000.txt文件下。 二、sqlmap跑包。 打开sqlmap跑包。 python sqlmap.py -r C:\Users\16434\Desktop\1000.txt -dbmsmysql --os-shell…

Oracle-catalog影响归档量统计

有个12.2 rac环境报警备份异常&#xff0c;登录检查备份&#xff0c;发现报错日志 piece handle/backup/orcl/archbackup/ARCHBAK_ORCL_20230607_738_1 tagARCH_BAK commentNONE channel d1: backup set complete, elapsed time: 00:01:55 released channel: d1 RMAN-00571: …

从Vuex过渡到pinia

Vuex过渡到Pinia 众所周知&#xff0c;Vuex是一个状态管理库&#xff0c;它方便了我们任何组件不用考虑关系就可以共享一个全局的状态。&#x1f603;但是 Vuex也有它一定的缺陷。主要缺点&#xff0c;我总结如下&#xff1a; mutations里面不能写异步函数&#xff0c;否则就…

Simulink仿真模块 - Waveform Generator

Waveform Generator模块的功能是使用信号符号输出波形。它所在的库为: Simulink / Sources 如图所示: 双击模型弹出如下对话框,如图所示: Waveform Generator 模块根据您在波形定义表中输入的信号符号输出波形。 此模块支持下列用于信号符号的语法: 函数…

STM32单片机OLED语音识别路灯台灯控制系统人检测亮度调节

实践制作DIY- GC0143-OLED语音识别路灯台灯控制系统 基于STM32单片机设计---OLED语音识别路灯台灯控制系统 二、功能介绍&#xff1a; 电路&#xff1a;STM32F103C系列最小系统串口语音识别模块LED灯板1个红外传感器OLED显示器1个手动自动模式键1个开关按键 1.有两个模式1个手…

速卖通,国际站,temu测评,补单策略:安全与效能并重,提高账号存活率

测评能够帮助卖家让亚马逊平台更喜欢自己的产品&#xff0c;给予更好排名的同时也让后续进入店铺的买家更容易认可自己的产品。这些真实评价在亚马逊卖家管理系统中被称为Review Feedback。这是进行真实交易后形成的评价&#xff0c;而不是通过机器软件生成&#xff0c;形成虚拟…

SpringData进阶篇-下

SpringData进阶篇 一&#xff1a;故事背景二&#xff1a;自定义操作2.1 JPQL和SQL2.1.1 接口内定义2.1.2 调用2.2.3 SQL 方式查询 2.2 规定方法名2.2.1 普通查询规则2.2.2 修饰查询 2.3 Query By Example2.3.1 Repository继承QueryByExampleExecutor2.3.2 具体使用2.3.2 Exampl…

Aspose.Words功能演示:使用 C# 从 Word 文档中读取宏

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c; Aspose API支持流行文件格式处…

java-不借用三方程序情况下,使用java自动工具将可执行jar转成exe

一、先新建一个javafx项目 二、配置Artifacts 点击Artifacts,会看到新建的项目会自动创建好了 如果没有的话,可以手动创建如下操作 三、配置 按下图逐一配置即可 四、builde 5、使用java的打包命令打包 PS C:\Users\xx\Downloads\cc\exeex\out\artifacts\JavaFXApp>…

web前端 --- js事件

js事件&#xff08;event&#xff09; &#xff08;js诞生就是基于事件驱动型编程&#xff09; &#xff08;1&#xff09;事件 用户通过各种行为&#xff08;按键、鼠标点击、鼠标hover......&#xff09;行为动作&#xff0c;引起相关 js 代码的执行。 事件的三元素&#x…

多篇论文入选ICASSP 2023 火山语音有效解决多类实践问题

近日由IEEE主办、被誉为世界范围内最大规模、也是最全面的信号处理及其应用方面的顶级学术会议ICASSP2023于希腊召开&#xff0c;该会议具有权威、广泛的学界以及工业界影响力&#xff0c;备受AI领域多方关注。会上火山语音多篇论文被接收并发表&#xff0c;内容涵盖众多前沿领…

springboot+vue+java企业车间工位管理系统

。本文介绍了企业级工位管理系统的开发全过程。通过分析企业级工位管理系统管理的不足&#xff0c;创建了一个计算机管理企业级工位管理系统的方案。文章介绍了企业级工位管理系统的系统分析部分&#xff0c;包括可行性分析等&#xff0c;系统设计部分主要介绍了系统功能设计和…

Vue.js 中的过滤器和计算属性

Vue.js 中的过滤器和计算属性 Vue.js 是一款流行的 JavaScript 框架&#xff0c;它提供了一种简单而灵活的方式来构建交互式 Web 应用程序。在 Vue.js 中&#xff0c;过滤器和计算属性是两个常用的概念。它们可以帮助开发者更方便地处理数据&#xff0c;提高代码的可读性和可维…

【学习日记】操作系统-入门知识-个人学习记录

我的学习笔记链接&#xff1a; MyLinuxProgramming 参考资料 CSAPP操作系统导论OSTEP √APUEhttps://stevens.netmeister.org/631软件调试王道-操作系统操作系统真象还原小林coding-图解系统https://xiaolincoding.com嵌入式软件开发笔试面试指南Linux是怎样工作的2020 南京大…