define([
|
'dojo/_base/declare',
|
'dojo/_base/lang',
|
'dojo/_base/array',
|
'dojo/_base/html',
|
'dojo/query',
|
'dojo/topic',
|
'dojo/on',
|
'dojo/aspect',
|
'dojo/keys',
|
'dojo/i18n',
|
'dojo/_base/config',
|
'require',
|
'./utils',
|
'jimu/dijit/Message'
|
], function (declare, lang, array, html, query, topic, on, aspect, keys, i18n, dojoConfig,
|
require, jimuUtils,
|
Message) {
|
var instance = null,
|
clazz = declare(null, {
|
appConfig: null,
|
mapDivId: '',
|
map: null,
|
|
constructor: function (options, mapDivId) {
|
this.appConfig = options.appConfig;
|
this.urlParams = options.urlParams;
|
this.mapDivId = mapDivId;
|
this.id = mapDivId;
|
this.nls = window.jimuNls;
|
topic.subscribe("appConfigChanged", lang.hitch(this, this.onAppConfigChanged));
|
topic.subscribe("mapContentModified", lang.hitch(this, this.onMapContentModified));
|
|
on(window, 'resize', lang.hitch(this, this.onWindowResize));
|
on(window, 'beforeunload', lang.hitch(this, this.onBeforeUnload));
|
|
},
|
|
showMap: function () {
|
this._showMap(this.appConfig);
|
},
|
|
_showMap: function (appConfig) {
|
var mode = Cesium.SceneMode.SCENE3D;
|
if (appConfig.map['3D']) {
|
mode = Cesium.SceneMode.SCENE3D;
|
} else if (appConfig.map['2D']) {
|
mode = Cesium.SceneMode.SCENE2D;
|
} else {
|
mode = Cesium.SceneMode.COLUMBUS_VIEW;
|
}
|
|
this._createMap(mode, appConfig);
|
},
|
_visitConfigMapLayers: function (appConfig, cb) {
|
array.forEach(appConfig.map.basemaps, function (layerConfig, i) {
|
cb(layerConfig, i);
|
}, this);
|
|
array.forEach(appConfig.map.swzwLayers, function (layerConfig, i) {
|
cb(layerConfig, i);
|
}, this);
|
|
array.forEach(appConfig.map.shLayers, function (layerConfig, i) {
|
cb(layerConfig, i);
|
}, this);
|
|
array.forEach(appConfig.map.djyLayers, function (layerConfig, i) {
|
cb(layerConfig, i);
|
}, this);
|
|
},
|
|
_createMap: function (mode, appConfig) { //创建地图js
|
|
Cesium.Ion.defaultAccessToken = appConfig.cesiumToken;
|
|
appConfig.map.mapOptions["imageryProviderViewModels"] = this._getImageryProviderArr(appConfig);
|
appConfig.map.mapOptions["terrainProviderViewModels"] = this._getTerrainProviderViewModelsArr(appConfig);
|
this.map = new Cesium.Viewer(this.mapDivId, appConfig.map.mapOptions);
|
|
this.map.scene.highDynamicRange = false;
|
this.map._cesiumWidget._creditContainer.style.display = "none";
|
// console.log(this.map.scene)
|
this.map.scene.globe.depthTestAgainstTerrain = true;
|
this.map.scene.logarithmicDepthBuffer = false;
|
this.map.scene.globe.baseColor = Cesium.Color.BLACK;
|
window.viewer = this.map;
|
var imageryLayers = this.map.imageryLayers;
|
imageryLayers.removeAll();
|
|
this.map.baseLayerPicker.viewModel.selectedImagery = this.map.baseLayerPicker.viewModel.imageryProviderViewModels[1];
|
this.map.baseLayerPicker.viewModel.selectedTerrain = this.map.baseLayerPicker.viewModel.terrainProviderViewModels[1];
|
$(".cesium-baseLayerPicker-sectionTitle").eq(0).html("底图");
|
$(".cesium-baseLayerPicker-sectionTitle").eq(1).html("地形");
|
|
topic.subscribe("gis/map/setCenter", lang.hitch(this, this.centerAt));
|
topic.subscribe("gis/map/flyTo", lang.hitch(this, this.flyTo));
|
this._processMapOptions(appConfig.map.mapOptions);
|
this._publishMapEvent(this.map);
|
|
// window.viewer.scene.screenSpaceCameraController.maximumZoomDistance = 180000;
|
|
this.setMapHeight(this.map);
|
},
|
setMapHeight: function (map) {
|
// 相机最低高度
|
const minimumHeight = 100;
|
// 在渲染阶段前添加事件监听器
|
map.scene.preRender.addEventListener(function () {
|
var eye = map.camera.positionCartographic;
|
// 判断相机坐标是否小于阈值,若小于阈值,则保持视点方位,修改相机高度
|
if (eye.height < minimumHeight) {
|
map.camera.setView({
|
destination: Cesium.Cartesian3.fromRadians(eye.longitude, eye.latitude, minimumHeight),
|
orientation: {
|
direction: map.camera.direction,
|
up: map.camera.up
|
}
|
});
|
}
|
});
|
},
|
_getImageryProviderArr: function (mapconfig) {
|
var imageryProviderArr = [];
|
var imageryProviderViewModels = mapconfig.map.imageryProviderViewModels;
|
for (var i = 0; i < imageryProviderViewModels.length; i++) {
|
|
let layerArr = [];
|
for (var j = 0; j < imageryProviderViewModels[i].layers.length; j++) {
|
let layerConfig = imageryProviderViewModels[i].layers[j];
|
let layer;
|
if (layerConfig.type == "url") {
|
layer = new Cesium.UrlTemplateImageryProvider(layerConfig);
|
} else if (layerConfig.type == "wmts") {
|
layer = new Cesium.WebMapTileServiceImageryProvider(layerConfig);
|
} else if (layerConfig.type == "SuperMap") {
|
layer = new Cesium.SuperMapImageryProvider(layerConfig);
|
} else if (layerConfig.type == "arcgis") {
|
layer = new Cesium.ArcGisMapServerImageryProvider(layerConfig);
|
}
|
|
|
|
|
layerArr.push(layer);
|
}
|
|
var pvm = new Cesium.ProviderViewModel({
|
name: imageryProviderViewModels[i].name,
|
tooltip: imageryProviderViewModels[i].tooltip,
|
iconUrl: imageryProviderViewModels[i].iconUrl,
|
creationFunction: function () {
|
return layerArr;
|
}
|
});
|
imageryProviderArr.push(pvm);
|
}
|
return imageryProviderArr;
|
},
|
|
|
_getTerrainProviderViewModelsArr: function (mapconfig) {
|
|
var terrainProviderViewModelsArr = [new Cesium.ProviderViewModel({
|
name: "无地形",
|
tooltip: "WGS84标准球体",
|
iconUrl: "images/basemaps/TerrainEllipsoid.png",
|
creationFunction: function () {
|
return new Cesium.EllipsoidTerrainProvider({
|
ellipsoid: Cesium.Ellipsoid.WGS84
|
})
|
}
|
}), new Cesium.ProviderViewModel({
|
name: "鄱阳湖地形",
|
tooltip: "由 普适科技 提供的鄱阳湖地区地形",
|
iconUrl: "images/basemaps/TerrainSTK.png",
|
creationFunction: function () {
|
return new Cesium.CesiumTerrainProvider({
|
url: "./dx/",
|
requestWaterMask: !0,
|
requestVertexNormals: !0,
|
// isSct: true,//因坡度坡向添加
|
})
|
}
|
})];
|
// var terrainProviderViewModels = mapconfig.map.terrainProviderViewModels;
|
// for (var i = 0; i < terrainProviderViewModels.length; i++) {
|
// var tp = null;
|
// if(terrainProviderViewModels[i].url==""){
|
// tp = new Cesium.EllipsoidTerrainProvider({
|
// ellipsoid: Cesium.Ellipsoid.WGS84
|
// })
|
// }
|
// else{
|
// tp = new Cesium.CesiumTerrainProvider({url:terrainProviderViewModels[i].url,requestVertexNormals:true});
|
// }
|
// var pvm = new Cesium.ProviderViewModel({
|
// name: terrainProviderViewModels[i].name,
|
// tooltip: terrainProviderViewModels[i].tooltip,
|
// iconUrl: terrainProviderViewModels[i].iconUrl,
|
// creationFunction: function() {
|
// return tp;
|
// }
|
// });
|
// terrainProviderViewModelsArr.push(pvm);
|
// }
|
|
return terrainProviderViewModelsArr;
|
|
},
|
|
flyTo: function (item) {
|
window.viewer.camera.flyTo({
|
destination: Cesium.Cartesian3.fromDegrees(Number(item.longitude), Number(item.latitude), Number(item.height)),
|
orientation: {
|
heading: Cesium.Math.toRadians(Number(item.heading)),
|
pitch: Cesium.Math.toRadians(Number(item.pitch)),
|
roll: Cesium.Math.toRadians(Number(item.roll))
|
},
|
duration: 5,
|
pitchAdjustHeight: 10000
|
});
|
},
|
centerAt: function (item) {
|
if (item.lgtd) {
|
window.viewer.camera.flyTo({
|
destination: Cesium.Cartesian3.fromDegrees(Number(item.lgtd), Number(item.lttd), 800.0),
|
duration: 5
|
});
|
}
|
|
},
|
createLayer: function (map, maptype, layerConfig) {
|
var layMap = {
|
'arcgis': 'ArcGisMapServerImageryProvider',
|
'wmts': 'WebMapTileServiceImageryProvider',
|
'ctms': 'SingleTileImageryProvider',
|
'wms': 'WebMapServiceImageryProvider',
|
'url': 'UrlTemplateImageryProvider',
|
'mapbox': 'MapboxImageryProvider'
|
};
|
|
var layer;
|
if (false) {
|
|
} else {
|
var layer = new Cesium[layMap[layerConfig.type]](layerConfig);
|
var imageryLayers = this.map.imageryLayers;
|
var olayer = imageryLayers.addImageryProvider(layer);
|
olayer.show = layerConfig.show;
|
olayer.label = layerConfig.label;
|
}
|
|
},
|
_publishMapEvent: function (map) {
|
window._viewerMap = map;
|
if (this.loading) {
|
this.loading.destroy();
|
}
|
|
if (this.map) {
|
this.map = map;
|
topic.publish('mapChanged', this.map);
|
} else {
|
this.map = map;
|
topic.publish('mapLoaded', this.map);
|
}
|
},
|
_processMapOptions: function (mapOptions) {
|
if (!mapOptions) {
|
return;
|
}
|
if (mapOptions.positionInfo) {
|
var west = mapOptions.positionInfo.xmin;
|
|
var south = mapOptions.positionInfo.ymin;
|
|
var east = mapOptions.positionInfo.xmax;
|
|
var north = mapOptions.positionInfo.ymax;
|
var heading = mapOptions.positionInfo.heading;
|
var pitch = mapOptions.positionInfo.pitch;
|
var roll = mapOptions.positionInfo.roll;
|
|
setTimeout(lang.hitch(this, function () {
|
this.map.camera.setView({
|
destination: Cesium.Rectangle.fromDegrees(west, south, east, north)
|
});
|
}), 100);
|
|
|
Cesium.Camera.DEFAULT_VIEW_RECTANGLE = Cesium.Rectangle.fromDegrees(west, south, east, north);
|
Cesium.Camera.DEFAULT_VIEW_FACTOR = 0;
|
}
|
},
|
|
onBeforeUnload: function () {
|
|
},
|
|
onWindowResize: function () {
|
if (this.map && this.map.resize) {
|
this.map.resize();
|
}
|
},
|
|
|
onAppConfigChanged: function (appConfig, reason, changedJson) {
|
|
},
|
|
onMapContentModified: function () {
|
this._recreateMap(this.appConfig);
|
},
|
|
_recreateMap: function (appConfig) {
|
if (this.map) {
|
topic.publish('beforeMapDestory', this.map);
|
this.map.destroy();
|
}
|
this._showMap(appConfig);
|
},
|
|
});
|
|
|
clazz.getInstance = function (options, mapDivId) {
|
if (instance === null) {
|
instance = new clazz(options, mapDivId);
|
}
|
return instance;
|
};
|
|
return clazz;
|
});
|