美文网首页ArcGIS js api 4+ 扩展工具
ArcGIS api for JavaScript 4+版本图例

ArcGIS api for JavaScript 4+版本图例

作者: Swanky | 来源:发表于2017-02-16 09:34 被阅读1111次

    简介

    4+版本的legend widget现在只支持featurelayer的图例呈现了,而此处的图例控件则支持远程dynamicLayer的图例。

    代码如下

    custom.js

    ·define([
    "../core/Accessor"
    ], function (accessor) {

    var Custom = accessor.createSubclass({
        debounce: function (func, wait, immediate) {
            var timeout, args, context, timestamp, result;
            return function () {
                context = this;
                args = arguments;
                timestamp = new Date();
                var later = function () {
                    var last = (new Date()) - timestamp;
                    if (last < wait) {
                        timeout = setTimeout(later, wait - last);
                    } else {
                        timeout = null;
                        if (!immediate) result = func.apply(context, args);
                    }
                };
                var callNow = immediate && !timeout;
                if (!timeout) {
                    timeout = setTimeout(later, wait);
                }
                if (callNow) result = func.apply(context, args);
                return result;
            };
        }
    });
    return Custom;
    

    })·

    RemoteLegend.js

    ·define([
    "./Custom",
    ], function (Custom) {
    'use strict';

    var _tpl = dojo.string.substitute;
    
    var ROOTTEMPLATE = '<div>${content}</div>';
    var ITEMTEMPLATE = '<div class="esriLegendService">${content}</div>';
    var TITLETEMPLATE = '<table width="95%"><tbody><tr><td align="left"><span class="esriLegendServiceLabel">${title}</span></td></tr></tbody></table>';
    var SUBLAYERTEMPLATE = '<div>${content}</div>';
    var LABELTEMPLATE = '<table width="95%" class="esriLegendLayerLabel"><tbody><tr><td align="left">${layerName}</td></tr></tbody></table>';
    var LEGENDTEMPLATE =
        '<table cellpadding="0" cellspacing="0" width="95%" class="esriLegendLayer">' +
        '<tbody>' +
        '<tr>' +
        '<td width="35" align="center">' +
        '<img src="data:image/png;base64,${imageData}" border="0"/>' +
        '</td>' +
        '<td>' +
        '<table>' +
        '<tbody>' +
        '<tr>' +
        '<td align="left">' +
        '${label}' +
        '</td>' +
        '</tr>' +
        '</tbody>' +
        '</table>' +
        '</td>' +
        '</tr>' +
        '</tbody>' +
        '</table>';
    
    var RemoteLegend = Custom.createSubclass({
        declaredClass: "esri.custom._RemoteLegend",
        normalizeCtorArgs: function (view, options) {
            options || (options = {});
            this._mapView = view;
            this._containerId = options.containerId;
            this._layers = options.layers;
            if (!this._containerId) {
                console.error('未传入containerId');
                return;
            }
            var layerInfos = this._layerInfos = this._generateLayerInfos();
            this._generateLayerRender(this._layerInfos);
            this._registerEvents();
        },
        _registerEvents: function () {
            var me = this;
            this.handlers = [this._mapView.watch('scale', this.debounce(function () {
                me._generateLayerRender(me._layerInfos);
            }, 100))];
        },
        _generateLayerInfos: function () {
            var me = this;
            var layers = dojo.filter(this._mapView.map.allLayers.items, function (layer) {
                return layer.allSublayers;
            });
            if (this._layers) {
                var layerIds = dojo.map(this._layers, function (layer) {
                    return layer.id;
                });
                layers = dojo.filter(layers, function (layer) {
                    var index = dojo.indexOf(layerIds, layer.id)
                    if (index > -1) {
                        me._layers[index].title && (layer.title = me._layers[index].title);
                        return true;
                    }
                    return false;
                });
            }
            return layers;
        },
        _generateLayerRender: function (layers) {
            var me = this;
            this.layerCache || (this.layerCache = {});
            dojo.query('#' + me._containerId).empty();
            dojo.forEach(layers, function (layer) {
                if (layer.url) {
                    if (me.layerCache[layer.url]) {
                        var html = me._generateHtml(me.layerCache[layer.url], layer);
                        dojo.query('#' + me._containerId).addContent(html);
                    } else {
                        dojo.io.script.get({
                            url: layer.url + '/legend?f=json',
                            callbackParamName: 'callback'
                        }).then(function (resp) {
                            me.layerCache[layer.url] = resp.layers;
                            var html = me._generateHtml(resp.layers, layer);
                            dojo.query('#' + me._containerId).addContent(html);
                        });
                    }
                }
            });
        },
        _generateHtml: function (layers, layer) {
            var me = this;
            var content = '';
            var currScale = this._mapView.scale;
            dojo.forEach(layers, function (l) {
                if (l.maxScale && currScale < l.maxScale) {
                    return;
                }
                if (l.minScale && currScale > l.minScale) {
                    return;
                }
                var sublayerLabelContent = _tpl(LABELTEMPLATE, l);
                var legendHtml = '';
                dojo.forEach(l.legend, function (legend) {
                    legendHtml += _tpl(LEGENDTEMPLATE, legend);
                });
                content += _tpl(SUBLAYERTEMPLATE, { content: sublayerLabelContent + legendHtml });
            });
            var titleHtml = _tpl(TITLETEMPLATE, layer);
            return _tpl(ITEMTEMPLATE, { content: titleHtml + content });
        },
        destroy: function () {
            dojo.forEach(this.handlers,function(handler){
                handler.remove();
            });
        }
    });
    
    return RemoteLegend;
    

    });·

    相关文章

      网友评论

      • ys_e98f:大神我想请教您一个问题,显示多个图层图例可以用您写的这个么“esri.custom._RemoteLegend”
      • 猿基地:太好了,多多分享这种干货

      本文标题:ArcGIS api for JavaScript 4+版本图例

      本文链接:https://www.haomeiwen.com/subject/domcwttx.html