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); 实现天地图从白色变成暗黑模式的地图服务,从而达到要求。

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

推荐阅读更多精彩内容