/** * 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/overview/OverviewControl", "controls/timeslider/TimeSliderControl", "esri/geometry/Point", "dojo/domReady!", ], function(AppEvent, ConfigData, declare, lang, Map, aspect, MapWidget, domConstruct, domStyle, dom, on, // MapSwitchControl, OverviewControl, TimeSliderControl, 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(evt) { 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"); // console.log("containerWidth:"+containerWidth+" ---- containerHeight:" + containerHeight); 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", "100%"); domStyle.set(mapWidget.domNode, "float", ""); domStyle.set(mapWidget.domNode, "z-index", 1); } 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", "100%"); domStyle.set(leftMapWidget.domNode, "z-index", 1); //设置右边地图位置 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", "100%"); 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 == 1) { alert("系统中最多可展现1个地图,不能再增加地图。"); 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 overviewControl = new OverviewControl({ // grouplayersConfig: ConfigData.basemap.grouplayers, // visibleGroupLayerId: "veclry", // cssPath: "controls/overview/OverviewControl.css" // }); // this._mainMapWidget.addControl(overviewControl); // //添加对开启关闭事件的监听 // 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") { // var widget = widgetArgs.instance; // widget.initMouseDragHandler(this._mainMapWidget); // 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") { // var widget = widgetArgs.instance; // widget.removeMouseDragHandler(this._mainMapWidget); // AppEvent.dispatchAppEvent(AppEvent.SWITCH_BASEMAP,{ // hockId: this._mainMapWidget.id, // grouplayer: groupLayerId, // 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); // } // else if(evt.menuItemId=="setStartPoint"||evt.menuItemId=="setEndPoint"){ // _AppEvent.dispatchAppEvent(_AppEvent.RUN_WIDGET,"routeWidget"); // _AppEvent.dispatchAppEvent("changeWidgets",{id:"routeWidget"}); // AppEvent.dispatchAppEvent("routeSearch",{ // menuId: evt.id, // menuItemId: evt.menuItemId, // coordinate: evt.coordinate, // }); // } // } // })); } if (data.type == "bottom") { this._bottomMapWidget = mapWidget; } else { this._mapWidgets.push(mapWidget); } if (data.relate) { var content = { 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; } this.mapManager._mapWidgets[index].setExtent(ext); } if (this.mapManager._bottomMapWidget && this.mapManager._bottomMapWidget.id != this.sourceI) { 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 } } }); });