| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301 |
- import { actions, storeDate } from '../store/store.js' //局部状态管理
- // 添加s3m
- function addS3mLayers(scps, callback) { //scps:[{ url, options:{name}]} 无返回值
- let promiseArray = [];
- try {
- if (scps) {
- //加载scps
- scps.forEach(scp => {
- promiseArray.push(
- viewer.scene.addS3MTilesLayerByScp(scp.url, scp.options)
- );
- });
- }
- promiseWhen(promiseArray, callback, 'S3M')
- } catch (e) {
- let widget = viewer.cesiumWidget;
- if (widget._showRenderLoopErrors) {
- let title = "渲染时发生错误,已停止渲染。";
- widget.showErrorPanel(title, undefined, e);
- }
- }
- };
- // 添加场景
- function addScene(url, options, callback) { //无返回值options:{SceneToken,autoSetView}
- if (options && options.SceneToken) {
- Cesium.Credential.CREDENTIAL = new Cesium.Credential(options.SceneToken);
- }
- let flag = true;
- if (options && options.autoSetView !== undefined) {
- flag = options.autoSetView
- }
- if (checkURL(url)) {
- try {
- let s = [viewer.scene.open(url, undefined, { 'autoSetView': flag })];
- promiseWhen(s, callback, 'SCENE');
- } catch (e) {
- let widget = viewer.cesiumWidget;
- if (widget._showRenderLoopErrors) {
- let title = "渲染时发生错误,已停止渲染。";
- widget.showErrorPanel(title, undefined, e);
- }
- }
- }
- };
- // 添加地形
- function addTerrainLayer(LayerURL, isSct) {
- try {
- const terrainProvider = new Cesium.CesiumTerrainProvider({
- url: LayerURL,
- isSct: isSct, //地形服务源自SuperMap iServer发布时需设置isSct为true
- });
- viewer.terrainProvider = terrainProvider;
- return terrainProvider;
- } catch (e) {
- let widget = viewer.cesiumWidget;
- if (widget._showRenderLoopErrors) {
- let title = "渲染时发生错误,已停止渲染。";
- widget.showErrorPanel(title, undefined, e);
- }
- return null;
- }
- };
- // 添加影像
- function addImageLayer(LayerURL) { // 返回img图层layer
- try {
- let layer = viewer.imageryLayers.addImageryProvider(
- new Cesium.SuperMapImageryProvider({
- url: LayerURL,
- })
- );
- return layer
- } catch (e) {
- let widget = viewer.cesiumWidget;
- if (widget._showRenderLoopErrors) {
- let title = "渲染时发生错误,已停止渲染。";
- widget.showErrorPanel(title, undefined, e);
- }
- }
- };
- // 添加mvt
- function addMvtLayer(LayerURL, name, callback) { // 返回img图层layer
- try {
- let mvtMap = viewer.scene.addVectorTilesMap({
- url: LayerURL,
- canvasWidth: 512,
- name: name || 'mvt',
- viewer: viewer
- });
- Cesium.when(mvtMap.readyPromise, function (data) {
- var bounds = mvtMap.rectangle;
- viewer.scene.camera.flyTo({
- destination: new Cesium.Cartesian3.fromRadians(
- (bounds.east + bounds.west) * 0.5,
- (bounds.north + bounds.south) * 0.5,
- 10000
- ),
- duration:0,
- orientation: {
- heading: 0,
- roll: 0
- }
- });
- actions.setChangeLayers();
- callback(mvtMap)
- });
- return mvtMap
- } catch (e) {
- let widget = viewer.cesiumWidget;
- if (widget._showRenderLoopErrors) {
- let title = "渲染时发生错误,已停止渲染。";
- widget.showErrorPanel(title, undefined, e);
- }
- }
- };
- function addGeoJsonLayer(url, name, callback) {
- try {
- const loadPromise = Cesium.GeoJsonDataSource.load(url, {
- stroke: Cesium.Color.fromCssColorString('#00FF00').withAlpha(1),
- fill: Cesium.Color.fromCssColorString('#00FF00').withAlpha(0.3),
- strokeWidth: 3
- });
-
- Cesium.when(loadPromise, function(dataSource) {
- viewer.dataSources.add(dataSource);
- let entities = dataSource.entities.values;
-
- let boundingSphere = new Cesium.BoundingSphere();
- let entitiesLength = entities.length;
-
- for (let i = 0; i < entitiesLength; i++) {
- let entity = entities[i];
- entity.name = name || 'GeoJSON';
-
- if (entity.boundingSphere) {
- if (i === 0) {
- boundingSphere = entity.boundingSphere;
- } else {
- boundingSphere = Cesium.BoundingSphere.union(boundingSphere, entity.boundingSphere);
- }
- }
- }
-
- viewer.flyTo(dataSource, { duration: 2 });
-
- actions.setChangeLayers();
- if (callback) callback(dataSource);
- }, function(error) {
- console.error("加载GeoJSON失败:", error);
- let widget = viewer.cesiumWidget;
- if (widget && widget._showRenderLoopErrors) {
- let title = "加载GeoJSON失败,请检查URL是否正确";
- widget.showErrorPanel(title, undefined, error);
- }
- });
- } catch (e) {
- console.error("加载GeoJSON异常:", e);
- let widget = viewer.cesiumWidget;
- if (widget && widget._showRenderLoopErrors) {
- let title = "渲染时发生错误,已停止渲染。";
- widget.showErrorPanel(title, undefined, e);
- }
- }
- };
- // 加载s3m和场景函数
- function promiseWhen(promiseArray, callback, type) {
- Cesium.when.all(
- promiseArray,
- function (layers) {
- console.log("layers:",layers)
- storeDate.layers = viewer.scene.layers.layerQueue;
- actions.setChangeLayers();
- callback(layers, type);
- storeDate.layers.forEach((s3mlayer) => {
- if (!s3mlayer.visibleDistanceMax || s3mlayer.visibleDistanceMax > 12000) {
- s3mlayer.visibleDistanceMax = 12000 //设置模型最可见距离
- }
- })
- },
- function (e) {
- let widget = viewer.cesiumWidget;
- if (widget._showRenderLoopErrors) {
- let title = '请检查url地址是否正确?';
- widget.showErrorPanel(title, undefined, e);
- }
- }
- );
- };
- // 检验url地址
- function checkURL(url) {
- if (url === null || url === "") {
- return false;
- }
- if (url.charAt(0) == '"' || url.charAt(0) == "'") {
- let reg = /^['|"](.*)['|"]$/;
- url = url.replace(reg, "$1");
- }
- return true
- };
- // 删除图层
- function layersDelete(type, id_name, callback) {
- switch (type) {
- case "SCENE":
- console.log('开始删除SCENE图层, id_name:', id_name);
- if (viewer.scene.layers && viewer.scene.layers.layerQueue) {
- const layers = viewer.scene.layers.layerQueue;
- console.log('场景中的图层数量:', layers.length);
- for (let i = layers.length - 1; i >= 0; i--) {
- const layer = layers[i];
- console.log('删除图层:', i, layer.name);
- viewer.scene.layers.remove(layer);
- }
- }
- actions.setChangeLayers();
- if (callback) callback();
- break;
- case "S3M":
- viewer.scene.layers.remove(id_name);
- actions.setChangeLayers();
- if (callback) callback();
- break;
- case "IMG":
- let img_layer;
- if (typeof (id_name) === 'nunber') {
- img_layer = viewer.imageryLayers.get(id_name);
- } else {
- let img_layers = viewer.imageryLayers._layers
- for (let i = 0; i < img_layers.length; i++) {
- if (img_layers[i].imageryProvider.tablename && img_layers[i].imageryProvider.tablename === id_name) {
- img_layer = img_layers[i];
- }
- };
- }
- if (img_layer) {
- viewer.imageryLayers.remove(img_layer);
- actions.setChangeLayers();
- if (callback) callback();
- }
- break;
- case "TERRAIN":
- viewer.terrainProvider = new Cesium.EllipsoidTerrainProvider();
- actions.setChangeLayers();
- if (callback) callback();
- break;
- case "MVT":
- viewer.scene.removeVectorTilesMap(id_name);
- actions.setChangeLayers();
- if (callback) callback();
- break;
- case "GEOJSON":
- case "SHP":
- if (viewer.dataSources) {
- const dataSources = viewer.dataSources._dataSources;
- for (let i = dataSources.length - 1; i >= 0; i--) {
- const ds = dataSources[i];
- if (ds.name === id_name || ds._name === id_name) {
- viewer.dataSources.remove(ds);
- break;
- }
- }
- }
- actions.setChangeLayers();
- if (callback) callback();
- break;
- default:
- if (callback) callback();
- }
- }
- export default {
- addS3mLayers,
- addScene,
- addTerrainLayer,
- addImageLayer,
- layersDelete,
- addMvtLayer,
- addGeoJsonLayer
- };
- export {
- addS3mLayers,
- addScene,
- addTerrainLayer,
- addImageLayer,
- layersDelete,
- addMvtLayer,
- addGeoJsonLayer
- };
|