/** * Created by Webyb on 2015/6/29. * @description 管理地图的模块,所有的地图操作必须由该模块完成。 */ define(["base/AppEvent", "base/ConfigData", "dojo/_base/declare", "dojo/_base/lang", "esri/map", "dojo/aspect", "widgets/map/MapWidget", "dojo/dom-construct", "dojo/dom-style", "dojo/dom", "dojo/on", "controls/mapswitch/MapSwitchControl", // "controls/sceneControl/SceneControl", "controls/overview/OverviewControl", "controls/timeslider/TimeSliderControl", "controls/timeliner/TimeLinerControl", // "controls/Splittime/SplittimeControl", "esri/geometry/Point", "dojo/domReady!", ], function (AppEvent, ConfigData, declare, lang, Map, aspect, MapWidget, domConstruct, domStyle, dom, on, MapSwitchControl, // SceneControl, OverviewControl, TimeSliderControl, TimeLinerControl, // SplittimeControl, Point) { return declare("MapManager", null, { /** * 地图容器Div的id */ containerDiv: "mapcontentClass", /** * 主MapWidget的实际地图对象 */ _map: null, _mainMapWidget: null, _mapWidgets: [], _bottomMapWidget: null, _resizeTimer: null, /** * 附属地图的事件委托索引 */ _relateMapEventHandlerIndex: {}, otherMapWidget: null, //用于测试 constructor: function () { var boundFunction = lang.hitch(this, this.onConfigLoaded); AppEvent.addAppEventListener(AppEvent.CONFIG_LOADED, boundFunction); //当窗体大小发生变化时,调用map对象的resize方法 AppEvent.addAppEventListener(AppEvent.APPLICATION_RESIZE, lang.hitch(this, this.onResizeHandler)); AppEvent.addAppEventListener(AppEvent.APPEND_MAPWIDGET, lang.hitch(this, this.appendMapWidgetHandler)); AppEvent.addAppEventListener(AppEvent.REMOVE_MAPWIDGET, lang.hitch(this, this.removeMapWidgetHandler)); }, onResizeHandler: function () { var mapWidgets = this._mapWidgets; var bottomMapWidget = this._bottomMapWidget; //开始重新计算各个地图的位置 // console.log("开始重新计算各个地图的位置"); var containerWidth = domStyle.get(dom.byId(this.containerDiv), "width"); var containerHeight = domStyle.get(dom.byId(this.containerDiv), "height"); if (mapWidgets.length == 0) { return; } else if (mapWidgets.length == 1) { var mapWidget = mapWidgets[0]; domStyle.set(mapWidget.domNode, "position", "relative"); domStyle.set(mapWidget.domNode, "width", containerWidth + "px"); domStyle.set(mapWidget.domNode, "height", containerHeight + "px"); domStyle.set(mapWidget.domNode, "float", ""); domStyle.set(mapWidget.domNode, "z-index", 1); //设置绘制图表的div $("#chart").css({"position": "relative", "width": containerWidth + "px", "z-index": 2}); } else if (mapWidgets.length == 2) { var leftMapWidget = mapWidgets[0]; var rightMapWidget = mapWidgets[1]; //设置左边地图位置 domStyle.set(leftMapWidget.domNode, "position", "relative"); domStyle.set(leftMapWidget.domNode, "float", "left"); domStyle.set(leftMapWidget.domNode, "width", containerWidth / 2 + "px"); domStyle.set(leftMapWidget.domNode, "height", containerHeight + "px"); domStyle.set(leftMapWidget.domNode, "z-index", 1); //设置绘制图表的div $("#chart").css({"position": "relative", "width": containerWidth / 2 + "px", "z-index": 2}); //设置右边地图位置 domStyle.set(rightMapWidget.domNode, "position", "relative"); domStyle.set(rightMapWidget.domNode, "float", "right"); domStyle.set(rightMapWidget.domNode, "width", (containerWidth / 2 - 1) + "px"); //留出边框的宽度 domStyle.set(rightMapWidget.domNode, "height", containerHeight + "px"); domStyle.set(rightMapWidget.domNode, "border-left", "1px solid #87898A"); domStyle.set(rightMapWidget.domNode, "z-index", 1); } if (bottomMapWidget) { domStyle.set(bottomMapWidget.domNode, "position", "absolute"); domStyle.set(bottomMapWidget.domNode, "width", containerWidth + "px"); domStyle.set(bottomMapWidget.domNode, "height", containerHeight + "px"); domStyle.set(bottomMapWidget.domNode, "float", ""); domStyle.set(bottomMapWidget.domNode, "top", "0px"); domStyle.set(bottomMapWidget.domNode, "left", "0px"); } //执行各个地图的resize事件 if (this._resizeTimer) { clearTimeout(this._resizeTimer); } this._resizeTimer = setTimeout(function () { for (var i = 0; i < mapWidgets.length; i++) { var mapWidget = mapWidgets[i]; if (mapWidget.map && mapWidget.map.loaded) { mapWidget.map.resize(); mapWidget.map.reposition(); } } if (bottomMapWidget && bottomMapWidget.map && bottomMapWidget.map.loaded) { bottomMapWidget.map.resize(); bottomMapWidget.map.reposition(); } }, 500); }, onConfigLoaded: function () { this.createMainMapWidget(); }, /** * 创建系统的主MapWidget对象 */ createMainMapWidget: function () { _mainMapWidget = new MapWidget({ id: "mainMapWidget", cssPath: "widgets/map/MapWidget.css" }); ConfigData.mapWidgetId = "mainMapWidget"; AppEvent.dispatchAppEvent(AppEvent.APPEND_MAPWIDGET, { mapwidget: _mainMapWidget, relate: true }); }, appendMapWidgetHandler: function (data) { if (this._mapWidgets.length == 4) { alert("系统中最多可展现4个地图,不能再增加地图。"); return; } var mapWidget = data.mapwidget; //如果mapWidget没有ID,则随机生成一个 if (!mapWidget.id) { mapWidget.id = uuid(); } else { //防止添加两个一样的mapWidget for (var i = 0; i < this._mapWidgets.length; i++) { if (this._mapWidgets[i].id == mapWidget.id) { alert("系统中已有一个ID为" + mapWidget.id + "的地图存在,故无法再次添加"); return; } } if (this._bottomMapWidget && this._bottomMapWidget.id == mapWidget.id) { alert("系统中已有一个ID为" + mapWidget.id + "的地图存在,故无法再次添加"); return; } } if (data.type == "bottom") { domConstruct.place(mapWidget.domNode, dom.byId(this.containerDiv), "first"); } else { domConstruct.place(mapWidget.domNode, dom.byId(this.containerDiv)); } if (this._mapWidgets.length == 0) { //说明是主地图 aspect.after(mapWidget, "onload", lang.hitch(this, function (map) { AppEvent.dispatchAppEvent(AppEvent.BASE_MAP_LAYER_LOADED, map); })); } mapWidget.startup(); if (this._mapWidgets.length == 0) { //说明是主地图 this._mainMapWidget = mapWidget; this._map = this._mainMapWidget.map; this._map.on("extent-change", lang.hitch(this, function (evt) { //AppEvent.dispatchAppEvent(AppEvent.MAP_EXTENT_CHANGE, evt); })); //给主地图添加鹰眼、地图切换控件 var mapSwitchControl = new MapSwitchControl({ map: this._map, cssPath: "controls/mapswitch/MapSwitchControl.css" }); this._mainMapWidget.addControl(mapSwitchControl); //全景按钮 // var sceneControl = new SceneControl({ // map: this._map, // cssPath: "controls/sceneControl/SceneControl.css" // }); // this._mainMapWidget.addControl(sceneControl); //this._relateMapEventHandlerIndex["mainMapWidget"]=this._map.on("extent-change",lang.hitch(this,this._extentChangeHandler)); // var overviewControl = new OverviewControl({ // grouplayersConfig: ConfigData.basemap.grouplayers, // visibleGroupLayerId: "veclry", // cssPath: "controls/overview/OverviewControl.css" // }); // this._mainMapWidget.addControl(overviewControl); // var splitimeControl = new SplittimeControl({ // cssPath: "controls/Splittime/SplittimeControl.css" // }); // this._mainMapWidget.addControl(splitimeControl); //添加对开启关闭事件的监听 /* var timesliderControl = new TimeSliderControl({ grouplayersConfig: ConfigData.basemap.grouplayers, map: this._mainMapWidget.map, visibleGroupLayerId: this._mainMapWidget._currentVisibleGroupLayer.id, visibleSetLayerId: this._mainMapWidget._currentVisibleSetLayer.id, cssPath: "controls/timeslider/TimeSliderControl.css" }); this._mainMapWidget.addControl(timesliderControl); var timesliderStyleBottom = null; timesliderControl.hide();*/ // // var timelinerControl = new TimeLinerControl({ // map: this._mainMapWidget.map, // cssPath: "controls/timeliner/TimeLinerControl.css" // }); // this._mainMapWidget.addControl(timelinerControl); var groupLayerId = null; var setLayerId = null; function onWidgetOpened(widgetArgs) { if (widgetArgs.name == "MultidateWidget") { // timesliderControl.show(); groupLayerId = this._mainMapWidget._currentVisibleGroupLayer.id; setLayerId = this._mainMapWidget._currentVisibleSetLayer.id; } if (widgetArgs.name == "SwipeWidget") { // timesliderStyleBottom = domStyle.get(timesliderControl.domNode, "bottom"); // domStyle.set(timesliderControl.domNode, "bottom", "200px"); // timesliderControl.show(); var widget = widgetArgs.instance; widget.initMouseDragHandler(this._mainMapWidget); // domStyle.set(timesliderControl.domNode, "bottom", "200px"); this._mainMapWidget.map.setExtent(this._mainMapWidget.map.extent); groupLayerId = this._mainMapWidget._currentVisibleGroupLayer.id; setLayerId = this._mainMapWidget._currentVisibleSetLayer.id; } } function onWidgetClosed(widgetArgs) { if (widgetArgs.name == "MultidateWidget") { // timesliderControl.hide(); AppEvent.dispatchAppEvent(AppEvent.SWITCH_BASEMAP, { hockId: this._mainMapWidget.id, grouplayer: groupLayerId, setlayer: setLayerId, sender: this._mainMapWidget.id }); } if (widgetArgs.name == "SwipeWidget") { // domStyle.set(timesliderControl.domNode, "bottom", timesliderStyleBottom); // timesliderControl.hide(); var widget = widgetArgs.instance; widget.removeMouseDragHandler(this._mainMapWidget); AppEvent.dispatchAppEvent(AppEvent.SWITCH_BASEMAP, { hockId: this._mainMapWidget.id, grouplayer: groupLayerId, setlayer: setLayerId, sender: this._mainMapWidget.id }); } } AppEvent.addAppEventListener(AppEvent.WIDGET_OPENED, lang.hitch(this, onWidgetOpened)); AppEvent.addAppEventListener(AppEvent.WIDGET_CLOSED, lang.hitch(this, onWidgetClosed)); //绑定菜单 AppEvent.addAppEventListener(AppEvent.WIDGET_LOADED, lang.hitch(this, function (evt) { if (evt.name == "MenuWidget") { AppEvent.dispatchAppEvent(AppEvent.BIND_MENU, { menuId: "mapMenu", dom: this._mainMapWidget.domNode }); } })); AppEvent.addAppEventListener(AppEvent.MENU_ITEM_CLICKED, lang.hitch(this, function (evt) { if (evt.menuId == "mapMenu") { if (evt.menuItemId == "zoomIn") { this._mainMapWidget.map.setZoom(this._mainMapWidget.map.getZoom() + 1); } else if (evt.menuItemId == "zoomOut") { this._mainMapWidget.map.setZoom(this._mainMapWidget.map.getZoom() - 1); } } })); } if (data.type == "bottom") { this._bottomMapWidget = mapWidget; } else { this._mapWidgets.push(mapWidget); } if (data.relate) { var content = { init: true, sourceId: mapWidget.id, mapManager: this } this._relateMapEventHandlerIndex[mapWidget.id] = aspect.after(mapWidget, MapWidget.EXTENT_CHANGE, lang.hitch(content, function (ext) { for (var index in this.mapManager._mapWidgets) { if (this.mapManager._mapWidgets[index].id == this.sourceId) { continue; } if (data.type != "bottom") { if (this.init) { if (this.sourceId == "multidateRightMapWidget") { } else { this.mapManager._mapWidgets[index].setExtent(ext); } this.init = false; } else { this.mapManager._mapWidgets[index].setExtent(ext); } } } if (this.mapManager._bottomMapWidget && this.mapManager._bottomMapWidget.id != this.sourceId) { this.mapManager._bottomMapWidget.setExtent(ext); } })); } //调用窗体变化事件,重新计算各个map的位置 this.onResizeHandler(); }, removeMapWidgetHandler: function (id) { if (this._mainMapWidget.id == id) { return; //主地图是不能移除的 } var mapWidget = this._getMapWidgetById(id); this._relateMapEventHandlerIndex[mapWidget.id].remove(); delete this._relateMapEventHandlerIndex[mapWidget.id]; for (var i = 1; i < this._mapWidgets.length; i++) { if (this._mapWidgets[i].id == id) { this._mapWidgets.splice(i, 1); break; } } if (this._bottomMapWidget && this._bottomMapWidget.id == id) { this._bottomMapWidget = null; } //domConstruct.destroy(mapWidget.domNode.id); //mapWidget=null; if (mapWidget.destroyRecursive) { mapWidget.destroyRecursive(); } mapWidget = null; this.onResizeHandler(); }, _getMapWidgetByMapId: function (id) { for (var i in this._mapWidgets) { if (this._mapWidgets[i].map.id == id) { return this._mapWidgets[i]; } } if (this._bottomMapWidget && this._bottomMapWidget.map.id == id) { return this._bottomMapWidget } }, _getMapWidgetById: function (id) { for (var i in this._mapWidgets) { if (this._mapWidgets[i].id == id) { return this._mapWidgets[i]; } } if (this._bottomMapWidget && this._bottomMapWidget.id == id) { return this._bottomMapWidget } } }); });