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

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

一、创建自定义切片层

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ArcGIS for JavaScript Vue 视频教程是一种通过视频方式来教授如何使用ArcGIS for JavaScript和Vue框架来创建交互式地图应用的教程。 ArcGIS for JavaScript 是一款由Esri开发的用于构建地图应用的JavaScript API。它提供了丰富的地图、图层、遥感影像和空间分析功能,能够帮助开发者构建出功能强大、可视化效果出众的地理信息系统。 Vue是一款流行的JavaScript前端框架,它的核心思想是响应式数据绑定和组件化开发。Vue的主要特点是易学、灵活和高效,它能够帮助开发者更快速地构建出交互式和可重用的界面组件。 ArcGIS for JavaScript Vue 视频教程主要介绍如何结合使用ArcGIS for JavaScript和Vue来创建地图应用。通过视频教程,开发者可以学习如何进行地图初始化、添加图层、展示地图、进行空间查询、添加交互等操作。 这些视频教程通常包括一系列教学视频,每个视频都会重点介绍某个具体的功能或操作。开发者可以按照自己的学习进度逐步学习和实践,从而逐渐掌握如何使用ArcGIS for JavaScript和Vue来构建出自己的地图应用。 通过视频教程,开发者可以更清晰地了解和学习如何使用ArcGIS for JavaScript和Vue。视频教程以实际操作为主,让开发者能够更加直观地理解每个步骤和操作的含义和作用。同时,视频教程也提供了练习和示例代码,方便开发者进行实践和理解。 总之,ArcGIS for JavaScript Vue 视频教程是一种通过视频方式来教授如何使用ArcGIS for JavaScript和Vue框架来创建交互式地图应用的教程,它能够帮助开发者快速学习和掌握这两个优秀的技术,从而构建出功能强大、可视化效果出众的地理信息系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jieyucx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值