/** * 鹰眼视图widget * @author Liuyl * @date 2015/10/9 */ define([ "dojo/_base/declare", "base/BaseControl", "dojo/_base/array", "dojo/_base/lang", "dojo/dom", "dojo/dom-class", "dojo/dom-style", "dojo/topic", "dojo/aspect", "dojo/on", "dojo/text!controls/overview/OverviewControl.html", "esri/map", "esri/graphic", "esri/Color", "esri/geometry/Polygon", "esri/symbols/SimpleFillSymbol", "esri/symbols/SimpleLineSymbol", "esri/layers/GraphicsLayer", "esri/toolbars/edit", "esri/graphicsUtils", "utils/LayerUtil", "controls/overview/config", "base/AppEvent" ], function( declare, BaseControl, arrayUtil, lang, dom, domClass, domStyle, topic, aspect, on, template, Map, Graphic, Color, Polygon, SimpleFillSymbol, SimpleLineSymbol, GraphicsLayer, Edit, graphicsUtils, LayerUtil, config, AppEvent) { var Widget = declare([BaseControl], { templateString: template, defaultOptions: { rate: 2.5, base_class: "overview-default-base-class", fill_color: [135, 206, 250, 0.3], border_color: [135, 206, 250, 1] }, /** * GroupLayers的配置 */ grouplayersConfig: null, /** * 当前显示的GroupLayer的Id */ visibleGroupLayerId: "", /** * 根据图层配置信息转换成实例化后的图层结果对象 */ _parseResult: null, /** * options */ constructor: function(options) { /** * 确保实例化时传入图层组配置参数和该鹰眼初始显示的图层组Id */ if (!options || !options.grouplayersConfig || !options.visibleGroupLayerId) { throw { message: "初始化参数不完整,应指定grouplayersConfig和visibleGroupLayerId参数" }; } declare.safeMixin(this, options); //$.extend(true, config, this.defaultOptions, options); //this.map = config.basemap; // dojo.create("link", { // href: require.toUrl("widgets/overview/") + 'OverviewWidget.css', // type: 'text/css', // rel: 'stylesheet' // }, // document.getElementsByTagName('head')[0]); //this.MAP_DOM_ID = srcRefNode + this.MAP_DOM_ID; this.base_class = "overview-default-base-class"; //this.map = config.basemap; this._myMap = null; this._layer1 = null; this._layer2 = null; this._graphic1 = null; this._graphic2 = null; }, startup: function() { this.inherited(arguments); this._init(); AppEvent.addAppEventListener(AppEvent.SWITCH_BASEMAP, lang.hitch(this, this.onSwitchBaseMap)); }, postCreate: function() { this.inherited(arguments); }, _init: function() { if (this.myMapNode.id == "") { this.myMapNode.id = uuid(); } //初始化自己的地图 this._myMap = new Map(this.myMapNode.id, { logo: false, slider: false }); //this._myMap = map; //禁用鹰眼地图的所有用户导航方式 this._myMap.on("load", lang.hitch(this, function(map) { this._myMap.disableMapNavigation(); this._myMap.hideZoomSlider(); })); //var _cs = domStyle.getComputedStyle(this.mapNode); //根据配置添加图层 this._addLayer(); this._initGraphic(); var resizeTimer; clearTimeout(resizeTimer); resizeTimer = setTimeout(lang.hitch(this, function() { this._myMap.resize(); this._myMap.reposition(); }), 500); }, _addLayer: function() { //仅显示baselayer即可,去掉baselayer的displaylevel限制,让其在所有显示级别都可以显示 this._parseResult = LayerUtil.parseGroups(this.grouplayersConfig); var groups = this._parseResult.groups; for (var key in groups) { var layer; var visible = (key == this.visibleGroupLayerId); if(visible == false){ continue; } if(groups[key].baselayers==null){ groups[key].baselayers=LayerUtil.parseLayers(groups[key].baselayersConfig); } for (var i = 0; i < groups[key].baselayers.length; i++) { layer = groups[key].baselayers[i]; layer.visible = visible; if (layer.setDisplayLevels) { layer.setDisplayLevels(null); } this._myMap.addLayer(layer); } } }, onSwitchBaseMap: function(evt) { if (evt.hockId != this.hockId || !evt.grouplayer) return; if (this.visibleGroupLayerId == evt.grouplayer) { return; } else { //先隐藏原来的图层 var grouplayer = this._parseResult.groups[this.visibleGroupLayerId]; for (var key in grouplayer.baselayers) { var layer = grouplayer.baselayers[key]; //layer.setVisibility(false); this._myMap.removeLayer(layer); } //再显示需要展示的图层 var grouplayer = null; for (var key in this._parseResult.groups) { if (key == evt.grouplayer) { var grouplayer = this._parseResult.groups[key]; if(grouplayer.baselayers == null){ grouplayer.baselayers=LayerUtil.parseLayers(grouplayer.baselayersConfig); } for (var index in grouplayer.baselayers) { var layer = grouplayer.baselayers[index]; //layer.setVisibility(true); this._myMap.addLayer(layer); } } } this.visibleGroupLayerId = evt.grouplayer; } }, _initGraphic: function() { var _symbol = new SimpleFillSymbol() .setStyle(SimpleFillSymbol.STYLE_SOLID) .setColor(new Color(config.fill_color)) .setOutline(new SimpleLineSymbol().setColor(new Color(config.border_color)).setWidth(0.5)); this._layer1 = new GraphicsLayer({ id: "rect1" }); this._layer2 = new GraphicsLayer({ id: "rect2" }); this._myMap.addLayer(this._layer1); this._myMap.addLayer(this._layer2); this._graphic1 = new Graphic(Polygon.fromExtent(this.map.extent), _symbol); this._graphic2 = new Graphic(Polygon.fromExtent(this.map.extent), _symbol); this._layer1.add(this._graphic1); this._layer2.add(this._graphic2); var _startMapPoint = null; var _basemapExtent = null; this.map.on("mouse-drag-start", lang.hitch(this, function(evt) { _startMapPoint = evt.mapPoint; _basemapExtent = this.map.extent; })); this.map.on("mouse-drag", lang.hitch(this, function(evt) { var _curMapPoint = evt.mapPoint; var _deltaX = _curMapPoint.x - _startMapPoint.x; var _deltaY = _curMapPoint.y - _startMapPoint.y; var _basemapCenter = _basemapExtent.getCenter(); _basemapCenter.x -= _deltaX; _basemapCenter.y -= _deltaY; _newExtent = _basemapExtent.centerAt(_basemapCenter); var _newPolygon = Polygon.fromExtent(_newExtent); this._graphic2.setGeometry(_newPolygon); this._layer2.redraw(); })); this.map.on("extent-change", lang.hitch(this, function(evt) { var _newPolygon = Polygon.fromExtent(evt.extent); var _extent = new esri.geometry.Extent(evt.extent); var _deltaX = (_extent.xmax - _extent.xmin) / 2.0 * (config.rate - 1); var _deltaY = (_extent.ymax - _extent.ymin) / 2.0 * (config.rate - 1); _extent.xmin -= _deltaX; _extent.xmax += _deltaX; _extent.ymin -= _deltaY; _extent.ymax += _deltaY; this._myMap.setExtent(_extent).then(lang.hitch(this, function() { this._redrawRect(_newPolygon); })); //主地图缩放时让矩形框具有动态效果 this.map.on("zoom", lang.hitch(this, function(evt) { try { var _curZoomLevel = evt.level; var _newPolygon = Polygon.fromExtent(evt.extent); this._redrawRect(_newPolygon); } catch (err) { console.log(err); } })); })); this._initEditing(); }, _redrawRect: function(polygon) { this._graphic2.setGeometry(polygon); this._layer2.redraw(); this._graphic1.setGeometry(polygon); this._layer1.redraw(); }, _initEditing: function() { var editToolBar = new Edit(this._myMap); editToolBar.activate(Edit.MOVE, this._graphic2); editToolBar.on("graphic-move-stop", lang.hitch(this, function(g, t) { var _newCenter = graphicsUtils.graphicsExtent([g.graphic]).getCenter(); this.map.centerAt(_newCenter); })); }, _toggle: function() { require(["dojo/_base/fx", "dojo/dom", "dojo/domReady!"], lang.hitch(this, function(baseFx, dom) { var _prop = null; // var _cs = domStyle.getComputedStyle(this.mapNode); // var _width = -parseInt(_cs.width.substr(0, _cs.width.length - 2)); // var _height = -parseInt(_cs.height.substr(0, _cs.height.length - 2)); if (domClass.contains(this.toggleNode, "overview-toggle-show")) { //由于控件初始化后无法设置成正确的显示范围 //故在显示鹰眼前手动触发一次basemap的extent-change事件以重新设置鹰眼地图的显示范围 domStyle.set(this._myMap.container, "height", domStyle.get(this.mapNode, "height") + "px"); this._myMap.resize(); this.map.centerAt(this.map.extent.getCenter()); domStyle.set(this.mapNode, "display", "block"); _prop = { // right: { // start: _width, // end: '0', // units: 'px' // }, // bottom: { // start: _height, // end: '0', // units: 'px' // }, opacity: { start: 0, end: 1 } } baseFx.animateProperty({ node: this.mapNode, properties: _prop, duration: 1000 }).play(); domClass.remove(this.toggleNode, "overview-toggle-show"); domClass.add(this.toggleNode, "overview-toggle-hide"); } else { _prop = { // right: { // end: _width, // units: 'px' // }, // bottom: { // end: _height, // units: 'px' // }, opacity: { start: 1, end: 0 } } var anim = baseFx.animateProperty({ node: this.mapNode, properties: _prop, duration: 1000 }); aspect.after(anim, "onEnd", lang.hitch(this, function() { domStyle.set(this.mapNode, "display", "none"); }, true)); anim.play(); domClass.remove(this.toggleNode, "overview-toggle-hide"); domClass.add(this.toggleNode, "overview-toggle-show"); } })); }, destroy: function() { this.inherited(arguments); var layerIds = this._myMap.layerIds; for (var index in layerIds) { this._myMap.removeLayer(this._myMap.getLayer(layerIds[index])); } } }); return Widget; });