/**
|
* 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
|
}
|
}
|
});
|
});
|