vue使用superMap超图api加载暗黑深色系天地图

前言

可能在现实前端项目开发中,我们使用的是超图的api加载的超图的地图服务,然后客户要求可以做一个天地图和超图服务的切换,然后在大屏可视化方面会使用到蓝黑背景的天地图,网上的文章比较杂乱,没有总结,我这里结合平时的开发做了总结,方便大家,也希望大家分享各自的经验。

image

1. 引入 超图的api

我这里是在html文件中直接引入的超图的在线js地址


<script type="text/javascript"src="https://iclient.supermap.io/web/libs/iclient8c/libs/SuperMap.Include.js"></script>

2. 加入一下js文件对天地图的拓展

这里也是直接拿的别人封装好的代码,可在网上找到示例。


/* eslint-disable */

/**

 * @requires window.SuperMap/Layer/CanvasLayer.js

 * @requires window.SuperMap/Layer/Grid.js

 * @requires window.SuperMap/Tile/Image.js

 */

/**

 * Class: window.SuperMap.Layer.Tianditu

 * 天地图服务图层类。

 *     用于显示天地图的地图服务,使用<window.SuperMap.Layer.Tianditu>的

 *     构造函数可以创建天地图图层,更多信息查看:

 *

 * Inherits from:

 *  - <window.SuperMap.Layer.CanvasLayer>

 */

window.SuperMap.Layer.Tianditu = window.SuperMap.Class(window.SuperMap.CanvasLayer, {

  /**

   * APIProperty: layerType

   * {String} 图层类型.(vec:矢量图层,img:影像图层,ter:地形图层)

   */

  layerType: 'vec', //(vec:矢量图层,cva:矢量标签图层,img:影像图层,cia:影像标签图层,ter:地形,cta:地形标签图层)

  /**

   * APIProperty: isLabel

   * {Boolean} 是否是标签图层.

   */

  isLabel: false,

  /**

   * Property: attribution

   * {String} The layer attribution.

   */

  attribution:

    "Data by <a style='white-space: nowrap' target='_blank' href='http://www.tianditu.com'>Tianditu</a>",

  /**

   * Property: url

   * {String} 图片url.

   */

  url:

    'http://t${num}.tianditu.com/DataServer?T=${type}_${proj}&x=${x}&y=${y}&l=${z}&tk=8177363d1b5e8f65ab85876dd85ca41f',

  //cva_url:"http://t${num}.tianditu.com/DataServer?T=cva_${proj}&x=${x}&y=${y}&l=${z}",

  /**

   * Property: zOffset

   * {Number} 图片url中z值偏移量

   */

  zOffset: 1,

  /**

   * APIProperty: dpi

   * {Float} 屏幕上每英寸包含像素点的个数。

   * 该参数结合图层比例尺可以推算出该比例尺下图层的分辨率.默认为96。

   */

  dpi: 96,

  /**

   * Constructor: window.SuperMap.Layer.Tianditu

   * 创建天地图图层

   *

   * Example:

   * (code)

   * var tiandituLayer = new window.SuperMap.Layer.Tianditu();

   * (end)

   */

  initialize: function(options) {

    var me = this;

    me.name = '天地图';

    //        options = window.SuperMap.Util.extend({

    //            maxExtent: new window.SuperMap.Bounds(

    //                minX, minY, maxX, maxY

    //            ),

    //            tileOrigin:new window.SuperMap.LonLat(minX, maxY),

    //            //maxResolution:maxResolution,

    //            //minResolution:minResolution,

    //            resolutions:resolutions,

    //            units:me.units,

    //            projection:me.projection

    //        }, options);

    window.SuperMap.CanvasLayer.prototype.initialize.apply(me, [me.name, me.url, null, options]);

  },

  /**

   * APIMethod: clone

   * 创建当前图层的副本。

   *

   * Parameters:

   * obj - {Object}

   *

   * Returns:

   * {<window.SuperMap.Layer.Tianditu>}  新的图层。

   */

  clone: function(obj) {

    var me = this;

    if (obj == null) {

      obj = new window.SuperMap.Layer.Tianditu(me.name, me.url, me.params, me.getOptions());

    }

    obj = window.SuperMap.CanvasLayer.prototype.clone.apply(me, [obj]);

    obj._timeoutId = null;

    return obj;

  },

  /**

   * Method: getTileUrl

   * 获取每个tile的图片url

   *

   * Parameters:

   * xyz - {Object}

   */

  getTileUrl: function(xyz) {

    var me = this;

    var proj = this.projection;

    if (proj.getCode) {

      proj = proj.getCode();

    }

    if (proj == 'EPSG:4326') {

      var proj = 'c';

    } else {

      var proj = 'w';

    }

    var x = xyz.x;

    var y = xyz.y;

    var z = xyz.z + me.zOffset;

    var num = Math.abs((xyz.x + xyz.y) % 7);

    var lt = this.layerType;

    if (this.isLabel) {

      if (this.layerType == 'vec') lt = 'cva';

      if (this.layerType == 'img') lt = 'cia';

      if (this.layerType == 'ter') lt = 'cta';

    }

    var url = window.SuperMap.String.format(me.url, {

      num: num,

      x: x,

      y: y,

      z: z,

      proj: proj,

      type: lt

    });

    return url;

  },

  /**

   * Method: setMap

   * Set the map property for the layer. This is done through an accessor

   *     so that subclasses can override this and take special action once

   *     they have their map variable set.

   *

   *     Here we take care to bring over any of the necessary default

   *     properties from the map.

   *

   * Parameters:

   * map - {<window.SuperMap.Map>}

   */

  setMap: function(map) {

    window.SuperMap.CanvasLayer.prototype.setMap.apply(this, [map]);

    var proCode = null;

    var proj = this.projection || map.projection;

    if (proj) {

      if (proj.getCode) {

        proCode = proj.getCode();

      } else {

        proCode = proj;

      }

    }

    this.setTiandituParam(proCode);

  },

  /**

   * Method: setTiandituParam

   * 设置出图相关参数

   *

   * Parameters:

   * projection - {String} 投影坐标系

   */

  setTiandituParam: function(projection) {

    var lt = this.layerType;

    if (lt == 'vec') {

      var resLen = 18;

      var resStart = 0;

      this.zOffset = 1;

      this.numZoomLevels = 18;

    } else if (lt == 'img') {

      var resLen = 17;

      var resStart = 0;

      this.zOffset = 1;

      this.numZoomLevels = 17;

    } else if (lt == 'ter') {

      var resLen = 13;

      var resStart = 0;

      this.zOffset = 1;

      this.numZoomLevels = 13;

    }

    if (projection == 'EPSG:4326') {

      var minX = -180;

      var minY = -90;

      var maxX = 180;

      var maxY = 90;

      //var maxResolution = 156543.0339;

      //var minResolution = 0.5971642833709717;

      var resolutions = [];

      for (var i = resStart; i < resLen; i++) {

        resolutions.push(1.40625 / 2 / Math.pow(2, i));

      }

      this.units = 'degree';

      this.projection = new window.SuperMap.Projection('EPSG:4326');

      this.maxExtent = new window.SuperMap.Bounds(minX, minY, maxX, maxY);

      this.tileOrigin = new window.SuperMap.LonLat(minX, maxY);

      this.resolutions = resolutions;

    } else {

      var minX = -20037508.3392;

      var minY = -20037508.3392;

      var maxX = 20037508.3392;

      var maxY = 20037508.3392;

      //var maxResolution = 156543.0339;

      //var minResolution = 0.5971642833709717;

      var resolutions = [];

      for (var i = resStart; i < resLen; i++) {

        resolutions.push(156543.0339 / 2 / Math.pow(2, i));

      }

      //this.numZoomLevels = 18;

      this.units = 'm';

      this.projection = new window.SuperMap.Projection('EPSG:3857');

      this.maxExtent = new window.SuperMap.Bounds(minX, minY, maxX, maxY);

      this.tileOrigin = new window.SuperMap.LonLat(minX, maxY);

      this.resolutions = resolutions;

    }

  },

  CLASS_NAME: 'window.SuperMap.Layer.Tianditu'

});

export default window.SuperMap.Layer.Tianditu;

3. 在地图页面代码中加入以下代码

引入封装的超图加载天地图的脚本;
进行样式暗黑渗透


<template>

    <div class="super" id="mapwg"></div>

</template>

<script>

import '@/utils/Tianditu';

export default {

    name: 'super',

    data() {

        return {

            map: null,

        };

    },

    mounted() {

        this.map = new window.SuperMap.Map('mapwg', {

            controls: [new window.SuperMap.Control.Navigation(), new window.SuperMap.Control.Zoom()],

            allOverlays: true

        });

        // 外网 天地图 图层

        let tiandituLayer = new window.SuperMap.Layer.Tianditu();

        let tianMarkerLayer = new window.SuperMap.Layer.Tianditu();

        tianMarkerLayer.layerType = 'cva';

        tianMarkerLayer.isLabel = true;

        console.log('tiandituLayer', tiandituLayer);

        this.layer3 = [tiandituLayer, tianMarkerLayer];

        this.map.addLayers(this.layer3);

        this.map.setCenter(new window.SuperMap.LonLat(108.94167, 34.25529), 13);

    },

};

</script>

<style lang="scss" scoped>

.super {

    width: 100%;

    height: 100vh;

    filter: invert(100%) hue-rotate(180deg);

    -webkit-filter: invert(100%) hue-rotate(180deg);

    mix-blend-mode: exclusion;

}

</style>

4. 样式反转渲染

filter: invert(100%) hue-rotate(180deg); 实现天地图从白色变成暗黑模式的地图服务,从而达到要求。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容