• 如何编写 maptalks plugin


    前面写过 maptalks plugin ( ArcGISTileLayer ),有读者留言说文章写得太精简,根据文章给出的核心代码没办法写出一个完整的 plugin ( 文中有完整 demo 地址,可能太隐蔽 ),这篇文章具体地说下 plugin 如何编写,并实现一个 plugin ( WMTSTileLayer )。

    学习一个新东西,最好的方式就是找官方文档。这里介绍一种捷径( 个人认为 ),直接模仿已有的插件编写。打开官网 plugins 页面[1],找一个 plugin,如 maptalks.e3.js,下面参考 maptalks.e3.js 写一个 WMTSTileLayer

    1、基本结构

    以 maptalks.e3.js 为基本版本,通过对比其他插件,去掉具体业务代码,得到一个 WMTSTileLayer 的基本框架如下:

     1 /*!
     2  * 版本申明
     3  * maptalks.wmts v0.1.0
     4  * LICENSE : MIT
     5  */
     6 /*!
     7  * 依赖申明
     8  * requires maptalks@^0.39.0 
     9  */
    10 // UMD 固定写法
    11 (function (global, factory) {
    12   typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('maptalks')) :typeof define === 'function' && define.amd ? define(['exports', 'maptalks'], factory) :(factory((global.maptalks = global.maptalks || {}), global.maptalks));}(this, (function (exports, maptalks) {
    13   'use strict';
    14   
    15   // 定义layer
    16   var WMTSTileLayer = function (_TileLayer) {
    17     // 构造函数
    18     function WMTSTileLayer(id, options) {
    19       
    20     }
    21     // 图层导出为 JSON
    22     WMTSTileLayer.prototype.toJSON = function toJSON() {
    23       
    24     };
    25     // 图层导入 
    26     WMTSTileLayer.prototype.fromJSON = function fromJSON(layerJSON) {
    27       
    28     };
    29     return WMTSTileLayer;
    30   }(maptalks.TileLayer);
    31 
    32   // 注册图层
    33   WMTSTileLayer.registerJSONType('WMTSTileLayer');
    34   
    35   // 导出整个类,外界调用入口
    36   exports.WMTSTileLayer = WMTSTileLayer;
    37 
    38   Object.defineProperty(exports, '__esModule', { value: true });
    39     
    40   // 一些打印信息
    41   typeof console !== 'undefined' && console.log('maptalks.wmts v0.1.0, requires maptalks@^0.39.0.');
    42     
    43 })));

    2、WMTS 服务

    网上搜索 WMTS 服务接口说明[2],得到参数说明如下:

    拿到参数说明后,接下来就是具体代码实现。WMTS 服务是切片服务,相比 WMS 而言,牺牲定制地图的灵活性来提升性能,那么具体的代码实现可以参考官方的 WMTSTileLayer[3],具体实现代码如下:

     1 /*!
     2  * 版本申明
     3  * maptalks.wmts v0.1.0
     4  * LICENSE : MIT
     5  */
     6 /*!
     7  * 依赖申明
     8  * requires maptalks@^0.39.0 
     9  */
    10 // UMD 固定写法
    11 (function (global, factory) {
    12   typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('maptalks')) :typeof define === 'function' && define.amd ? define(['exports', 'maptalks'], factory) :(factory((global.maptalks = global.maptalks || {}), global.maptalks));}(this, (function (exports, maptalks) {
    13   'use strict';
    14   
    15  // 参数大小写配置
    16   var options$v2 = {
    17     uppercase: false
    18   };
    19   // 参数默认值
    20   var defaultWmtsParams = {
    21     service: 'WMTS',
    22     request: 'GetTile',
    23     layer: '',
    24     tilematrixset: '',
    25     format: 'image/png',
    26     version: '1.0.0'
    27   };
    28     
    29   // 定义layer
    30   var WMTSTileLayer = function (_TileLayer) {
    31      // 继承
    32      _inherits(WMTSTileLayer, _TileLayer);
    33     // 构造函数,mixins 参数
    34     function WMTSTileLayer(id, options) {
    35       var _this;
    36       _this = _TileLayer.call(this, id) || this;
    37       var wmtsParams = extend({}, defaultWmtsParams);
    38       for (var p in options) {
    39         if (!(p in _this.options)) {
    40           wmtsParams[p] = options[p];
    41         }
    42       }
    43       // 改写 url
    44       var url = options.urlTemplate;
    45       options.urlTemplate = url + getParamString(wmtsParams, url, this.options.uppercase) + '&tileMatrix={z}&tileRow={y}&tileCol={x}';
    46         
    47       _this.setOptions(options);
    48       _this.setZIndex(options.zIndex);
    49       return _this;
    50     }
    51     // 图层导出为 JSON
    52     WMTSTileLayer.prototype.toJSON = function toJSON() {
    53       return {
    54         'type': 'WMTSTileLayer',
    55         'id': this.getId(),
    56         'options': this.config()
    57       };
    58     };
    59     // 图层导入 
    60     WMTSTileLayer.prototype.fromJSON = function fromJSON(layerJSON) {
    61       if (!layerJSON || layerJSON['type'] !== 'WMTSTileLayer') {
    62         return null;
    63       }
    64       return new WMTSTileLayer(layerJSON['id'], layerJSON['options']);
    65     };
    66     return WMTSTileLayer;
    67   }(maptalks.TileLayer);
    68 
    69   // 注册图层
    70   WMTSTileLayer.registerJSONType('WMTSTileLayer');
    71   
    72   // 导出整个类,外界调用入口
    73   exports.WMTSTileLayer = WMTSTileLayer;
    74 
    75   Object.defineProperty(exports, '__esModule', { value: true });
    76     
    77   // 一些打印信息
    78   typeof console !== 'undefined' && console.log('maptalks.wmts v0.1.0, requires maptalks@^0.39.0.');
    79     
    80 })));

    3、试一试,加载天地图 WMTS 服务[4]

     1 var map = new maptalks.Map('map', {
     2     center: [105.08052356963802, 36.04231948670001],
     3     zoom: 4,
     4     minZoom:1,
     5     maxZoom:18,
     6     spatialReference:{
     7         projection:'EPSG:4326'
     8     },
     9     baseLayer: new maptalks.WMTSTileLayer('base', {
    10         tileSystem : [1, -1, -180, 90],
    11         layer:'vec',
    12         tilematrixset:'c',
    13         format:'tiles',
    14         urlTemplate:'http://t{s}.tianditu.com/vec_c/wmts?tk=de0dc270a51aaca3dd4e64d4f8c81ff6',
    15         subdomains:['1', '2', '3', '4', '5'],
    16         attribution : '&copy; <a target="_blank" href="http://www.tianditu.cn">Tianditu</a>'
    17     }),
    18     layers : [
    19         new maptalks.WMTSTileLayer('road', {
    20             layer:'cva',
    21             tilematrixset:'c',
    22             format:'tiles',
    23             urlTemplate:'http://t{s}.tianditu.com/cva_c/wmts?tk=de0dc270a51aaca3dd4e64d4f8c81ff6',
    24             subdomains:['1', '2', '3', '4', '5'],
    25             opacity:1
    26         })
    27     ]
    28 });
    [1] http://maptalks.org/plugins.html
    [2] http://tdt.fuzhou.gov.cn/help/apipfs/3.htm
    [3] https://github.com/maptalks/maptalks.js/blob/master/src/layer/tile/WMSTileLayer.js
    [4] http://maptalks.org/examples/en/tilelayer-projection/wms/#tilelayer-projection_wms
  • 相关阅读:
    vue2.0 移动端,下拉刷新,上拉加载更多插件,修改版
    修改maven产生missing artifact错误
    程序的态度-一生想靠近的完美
    计算机中的存储
    Vue-router结合transition实现app前进后退动画切换效果
    js获取input上传图片装换为base64格式图片
    mongoose的基本操作
    vue路由跳转时判断用户是否登录功能
    Node.js学习笔记之文件上传
    推荐一个基于Vue2.0的的一款移动端开发的UI框架,特别好用。。。
  • 原文地址:https://www.cnblogs.com/lifefriend/p/11048318.html
Copyright © 2020-2023  润新知