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

2023-10-27

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

一、创建自定义切片层

要创建自定义图块层,您必须调用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>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

arcgis for javascript TileLayer 自定义高德地图图层 的相关文章

随机推荐

  • Oracle:number类型的使用

    一 number m n 创建测试表 create table t1 a number b number 9 c number 9 2 d number 9 1 e number 6 f number 7 2 g number 7 2 插入
  • 深入理解数据结构——堆栈应用(括号匹配)

    include
  • Feed流系统设计

    Feed流系统简介 Feed 是一种数据格式 用于给订阅的用户提供持续更新的内容 内容大多是基于时间线的方式呈现 从上往下流动 通常称为Feed流 移动互联网时代 国内最具代表性的Feed流类产品包括微信 微博 抖音 它们各具特点 产品 特
  • ChatGLM-6B-PT,P-Tuning

    本仓库实现了对于 ChatGLM 6B 模型基于 P Tuning v2 的微调 P Tuning v2 将需要微调的参数量减少到原来的 0 1 再通过模型量化 Gradient Checkpoint 等方法 最低只需要 7GB 显存即可运
  • 华为ensp模拟器--通过IKE动态协商方式建立IPSec隧道的实验(不对对等体存活进行检测)

    组网需求 如图1所示 在Router1和Router3之间建立一个安全隧道 对PC 1代表的子网 10 1 1 x 与PC2代表的子网 20 1 1 x 之间的数据流进行安全保护 安全协议采用ESP协议 加密算法采用DES 认证算法采用SH
  • 利用linux系统安装caffe_fastrcnn参考链接

    1 2 3 4 5
  • Code Llama系列教程之 微调 CodeLlama 34B 以进行聊天(打造自己的代码AI)

    虽然 Meta 的 Llama2 在 AI 领域引起了广泛关注 但 34b 模型却缺席了相当长一段时间 对于许多人来说 这个 34b 模型是运行本地 LLM 的理想选择 因为它与使用 4 位量化的单个 4090 GPU 兼容 我一直在热切地
  • TCP报文格局详解

    TCP和谈只定义了一种报文格局 建立 拆除连接 传输数据应用同样的报文 TCP报文格局 TCP报文段首部 20个字节 源端口和目标端口 各占2个字节 16比特的端标语加上32比特的IP地址 共同构成相当于传输层办事接见点的地址 即 插口 这
  • (十九)STM32——输入捕获

    目录 学习目标 成果展示 内容 获取 配置 代码 总结 学习目标 本节内容我们要介绍的是输入捕获 其实也和定时器那部分知识是有关系的 所谓输入捕获 通俗一点来讲 其实就是通过检测上升沿和下降沿来计算你的输入持续时间 具体怎么去检测和捕获呢
  • c++实现图的操作(最小生成树和最短路径)

    题目描述 1 图的深度优先搜索演示 要求 图采用邻接表存储结构 编程实现图的创建 图的深度优先搜索递归算法 2 图的广度优先搜索演示 要求 图采用邻接表存储结构 编程实现图的创建 图的深度优先搜索递归算法 3 求带权无向图的最小生成树问题
  • VueRouter4简介

    第十四节 VueRouter4 x简介 基本用法 路由懒加载 打包分析 动态路由 路由嵌套 相关Api 一 简介和基本用法 1 简介 官网地址 https next router vuejs org zh introduction html
  • 详解随机梯度下降法(Stochastic Gradient Descent,SGD)

    深度学习最常用的优化方法就是随机梯度下降法 但是随机梯度下降法在某些情况下会失效 这是为什么呢 带着这个问题我们接着往下看 一个经典的例子就是假设你现在在山上 为了以最快的速度下山 且视线良好 你可以看清自己的位置以及所处位置的坡度 那么沿
  • 递归的本质理解

    什么是递归 函数里面调用函数本身 这就是递归 public int factorial int n if n lt 1 return 1 return n factorial n 1 先有 递 再有 归 递 是将问题拆分成子问题来解决 子问
  • vue 高德地图 实时路况

    先放效果图 1 准备工作 路况信息只需要使用web端即可实现 2 代码部分 1 在 public index html中引入 2 在需要用到地图的页面中
  • c语言valotile关键字

    volatile 是一种类型修饰符 提醒编译器他后面所定义的变量随时都有可能改变 因此编译后的程序每次需要存储或读取这个变量的时候 都会直接从变量地址中 内存中 读取数据 如果没有volatile关键字 则编译器可能优化读取和存储 可能暂时
  • Python爬虫案例:爬取世界大学排行榜,做数据可视化

    前言 闲的一匹 高三生没多久就要高考了 还有四个月 也是快了 咱来看看世界大学的排行榜 采集一下 做个可视化 看看有没有你心仪的学校 嘿嘿 知识点 动态数据抓包 requests发送请求 结构化 非结构化数据解析 开发环境 python 3
  • CCF-CSP真题《202212-3 JPEG 解码》思路+python,c++满分题解

    想查看其他题的真题及题解的同学可以前往查看 CCF CSP真题附题解大全 试题编号 202212 3 试题名称 JPEG 解码 时间限制 1 0s 内存限制 512 0MB 问题描述 问题背景 四年一度的世界杯即将画上尾声 在本次的世界杯比
  • RT-Thread 中龙芯1C的网络lwip升级到2.1.0

    RT Thread 龙芯1C 智龙开发板 的网络lwip升级到2 1 0 1 硬件平台 智龙开发板V3 42 2 软件平台 RT Thread 4 0 0 其中LWIP 2 1 0 3 问题描述 一直使用 RT Thread 软件平台 配套
  • (史上最全总结)总体方差,样本方差,标准差,抽样方差,标准误差,均方误差,协方差 ...........

    文章目录 数学期望 color blue 数学期望 数学期望 总体和样本 color blue 总体和样本 总体和样本
  • arcgis for javascript TileLayer 自定义高德地图图层

    效果如图 一 创建自定义切片层 要创建自定义图块层 您必须调用BaseTileLayer类的createSubclass 方法 命名自定义层为TintLayer 由于这一层需要知道在哪里访问预定义的图块 我们将创建一个属性 应用程序将为图层