LayerManage.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511
  1. <template>
  2. <layer-manage-split
  3. @visibleChange="visibleChange"
  4. @transSliderChange="transSliderChange"
  5. @handleCheckChange="handleCheckChange"
  6. @location="location"
  7. @raise="raise"
  8. @lower="lower"
  9. ></layer-manage-split>
  10. </template>
  11. <script>
  12. import { Collect, GetResourceTree, GetMyCollect } from "@/api/map";
  13. export default {
  14. name: "LayerManage",
  15. data() {
  16. return {
  17. modellayerlist: [],
  18. vectorlayerlist: [],
  19. username: "admin",
  20. // treeSearchText: "",
  21. addlayerdata: [],
  22. sceneLayers: {},
  23. // favoriteLayerList: [],
  24. sharedState: store.state,
  25. // flag: false,
  26. // s3mLen: 0,
  27. // hid: true,
  28. layerparams: {},
  29. // ImgHid: false, //影响图层移动默认不显示
  30. // S3MLayersObj: {
  31. // title: Resource.s3mLayer,
  32. // expand: true,
  33. // checked: true,
  34. // type: "S3M",
  35. // children: [],
  36. // },
  37. // imgLayersObj: {
  38. // title: Resource.imageryLayer,
  39. // expand: true,
  40. // checked: true,
  41. // type: "IMG",
  42. // children: [],
  43. // },
  44. // TerrainLayersObj: {
  45. // title: Resource.terrainLayer,
  46. // expand: true,
  47. // checked: true,
  48. // type: "TERRAIN",
  49. // children: [],
  50. // },
  51. contextData: null,
  52. S3MList: [],
  53. };
  54. },
  55. computed: {
  56. imgLayers: function () {
  57. return this.sharedState.imgLayerManage;
  58. },
  59. terrainLayers: function () {
  60. return this.sharedState.terrainLayerManage;
  61. },
  62. S3MLayers: function () {
  63. return this.sharedState.S3MLayerManage;
  64. },
  65. },
  66. methods: {
  67. toggleVisibility() {
  68. store.setToolBarAction(0);
  69. },
  70. filterNode(value, data) {
  71. if (!value) return true;
  72. return data.label.indexOf(value) !== -1;
  73. },
  74. favorite(data) {
  75. console.log(data);
  76. },
  77. visibleChange(obj, visible, a) {
  78. console.log(obj, visible, a);
  79. switch (obj.type) {
  80. case "S3M": //场景
  81. if (this.sceneLayers[obj.title]) {
  82. this.sceneLayers[obj.title][0][0].visible = visible;
  83. }
  84. break;
  85. case "3DTiles": //场景
  86. if (this.sceneLayers[obj.title]) {
  87. this.sceneLayers[obj.title].show = visible;
  88. }
  89. break;
  90. case "S3MDATA": //scp
  91. if (this.sceneLayers[obj.title]) {
  92. this.sceneLayers[obj.title][0][0].visible = visible;
  93. }
  94. break;
  95. case "IMG": //影像
  96. this.layerparams[obj.id].show = visible;
  97. break;
  98. case "Vector": //矢量
  99. this.layerparams[obj.id].show = visible;
  100. break;
  101. case "Terrain": //地形
  102. if (visible) {
  103. viewer.terrainProvider = new Cesium.CesiumTerrainProvider({
  104. url: obj.url,
  105. isSct: true,
  106. requestVertexNormals: true,
  107. });
  108. } else {
  109. viewer.scene.terrainProvider = new Cesium.EllipsoidTerrainProvider(
  110. {}
  111. );
  112. }
  113. break;
  114. default:
  115. null;
  116. }
  117. },
  118. transSliderChange(obj, v, a) {
  119. if (typeof v == undefined) {
  120. return;
  121. }
  122. let value = v / 100;
  123. let imageryLayers = viewer.imageryLayers;
  124. switch (obj.type) {
  125. case "S3M": //场景
  126. if (this.sceneLayers[obj.title]) {
  127. this.sceneLayers[obj.title][0][0].style3D.fillForeColor =
  128. new Cesium.Color(1.0, 1.0, 1.0, value);
  129. }
  130. break;
  131. case "S3MDATA": //scp
  132. if (this.sceneLayers[obj.title]) {
  133. this.sceneLayers[obj.title][0][0].style3D.fillForeColor =
  134. new Cesium.Color(1.0, 1.0, 1.0, value);
  135. }
  136. break;
  137. case "3DTiles": //tileset
  138. if (this.sceneLayers[obj.title]) {
  139. this.sceneLayers[obj.title].style = new Cesium.Cesium3DTileStyle({
  140. color: "color('rgba(255,255,255," + value + ")')",
  141. });
  142. }
  143. break;
  144. case "IMG": //影像
  145. for (let i = 0; i < imageryLayers._layers.length; i++) {
  146. let element = imageryLayers._layers[i];
  147. if (element._imageryProvider._name == obj.title) {
  148. element.alpha = value;
  149. break;
  150. }
  151. }
  152. break;
  153. case "Vector": //矢量
  154. for (let i = 0; i < imageryLayers._layers.length; i++) {
  155. let element = imageryLayers._layers[i];
  156. if (element._imageryProvider._name == obj.title) {
  157. element.alpha = value;
  158. break;
  159. }
  160. }
  161. break;
  162. case "Terrain": //地形
  163. break;
  164. default:
  165. null;
  166. }
  167. },
  168. addS3M(LayerURL) {
  169. let promiseArray = [];
  170. promiseArray.push(viewer.scene.addS3MTilesLayerByScp(LayerURL));
  171. this.promiseWhen(promiseArray, true);
  172. },
  173. addTerrain(LayerURL) {
  174. viewer.terrainProvider = new Cesium.CesiumTerrainProvider({
  175. url: LayerURL,
  176. isSct: true,
  177. requestVertexNormals: true,
  178. });
  179. },
  180. add3DTiles(obj) {
  181. let tileset = new Cesium.Cesium3DTileset({
  182. url: obj.url + "?id=" + obj.id,
  183. skipLevelOfDetail: true,
  184. });
  185. this.sceneLayers[obj.title] = tileset;
  186. store.setSceneLayersList(this.sceneLayers);
  187. let thisLayer = viewer.scene.primitives.add(tileset);
  188. viewer.flyTo(thisLayer);
  189. },
  190. addImage(LayerURL) {
  191. var layer = viewer.imageryLayers.addImageryProvider(
  192. new Cesium.SuperMapImageryProvider({
  193. url: LayerURL,
  194. })
  195. );
  196. viewer.flyTo(layer);
  197. },
  198. promiseWhen(promiseArray, sceneName, obj) {
  199. let this_ = this;
  200. Cesium.when.all(
  201. promiseArray,
  202. (layers) => {
  203. this_.sceneLayers[obj.title] = layers;
  204. if (sceneName) {
  205. this.flyTo(sceneName);
  206. }
  207. if (obj.title == "分层分户") {
  208. store.setLayerList(layers[0][0]);
  209. layers[0][0].setQueryParameter({
  210. url: "https://www.supermapol.com/realspace/services/data-HeBing8HaoLou/rest/data",
  211. dataSourceName: "Model_8_old",
  212. dataSetName: "属性表",
  213. keyWord: "SmID",
  214. });
  215. } else if (obj.title == "分层分户_白膜") {
  216. store.setLayerList(layers[0][0]);
  217. }
  218. store.state.S3MList.push(layers[0]);
  219. store.state.tempLatData = layers[0];
  220. store.setSceneLayersList(this_.sceneLayers);
  221. // for (var i = 0; i < layers.length; i++) {
  222. // let style = new Cesium.Style3D();
  223. // style.bottomAltitude = window.modelBottomAltitude; //底部高度
  224. // if (layers[i].length > 0) {
  225. // for (var j = 0; j < layers[i].length; j++) {
  226. // layers[i][j].style3D = style;
  227. // layers[i][j].refresh();
  228. // layers[i][j].isOverlapDisplayed = true; //开启避让
  229. // }
  230. // } else {
  231. // layers[i].style3D = style;
  232. // layers[i].refresh();
  233. // layers[i].isOverlapDisplayed = true; //开启避让
  234. // }
  235. // }
  236. },
  237. function (e) {
  238. if (widget._showRenderLoopErrors) {
  239. let title = Resource.scpUrlErrorMsg;
  240. widget.showErrorPanel(title, undefined, e);
  241. }
  242. }
  243. );
  244. },
  245. handleSelectChange(selectedList, obj) {
  246. obj ? (obj.expand = !obj.expand) : null;
  247. },
  248. // 复选框改变
  249. handleCheckChange(obj, checked) {
  250. // console.log(obj, checked ,);
  251. if (obj.children && obj.children.length > 0) {
  252. for (let i = 0; i < obj.children.length; i++) {
  253. this.handleCheckChange(obj.children[i], checked);
  254. }
  255. } else {
  256. this.checkedChange(obj);
  257. if (checked) store.setCheckedData(obj);
  258. }
  259. store.setVectorLayerList(this.vectorlayerlist);
  260. store.setModelLayerList(this.modellayerlist);
  261. },
  262. //type roller 卷帘 split分屏splitId
  263. checkedChange(obj, type, splitId) {
  264. let imageryLayers = viewer.imageryLayers;
  265. if (obj.checked) {
  266. obj.trans = 100;
  267. obj.visible = true;
  268. this.addlayerdata.push(obj);
  269. switch (obj.type) {
  270. case "S3M": //场景
  271. let s = viewer.scene.open(obj.url);
  272. this.vectorlayerlist.push(obj);
  273. this.promiseWhen([s], undefined, obj);
  274. // store.setModelLayerList(this.vectorlayerlist);
  275. // console.log(store.state.modellayerlist,'vvvvv');
  276. // store.state.S3MList.push(obj)
  277. break;
  278. case "S3MDATA": //scp
  279. viewer.scene.addS3MTilesLayerByScp(obj.url, {
  280. name: obj.title,
  281. });
  282. break;
  283. case "3DTiles": //tileset
  284. this.add3DTiles(obj);
  285. this.vectorlayerlist.push(obj);
  286. break;
  287. case "IMG": //影像
  288. let layer = viewer.imageryLayers.addImageryProvider(
  289. new Cesium.SuperMapImageryProvider({
  290. url: obj.url,
  291. name: obj.title,
  292. })
  293. );
  294. this.layerparams[obj.id] = layer;
  295. store.setlayerparamsList(this.layerparams);
  296. if (type == "roller") this.bus.$emit("setImageryRoller", layer);
  297. // viewer.flyTo(layer);
  298. break;
  299. case "Vector": //矢量
  300. let layer2 = viewer.imageryLayers.addImageryProvider(
  301. new Cesium.SuperMapImageryProvider({
  302. url: obj.url,
  303. name: obj.title,
  304. })
  305. );
  306. this.vectorlayerlist.push(obj);
  307. this.layerparams[obj.id] = layer2;
  308. store.setlayerparamsList(this.layerparams);
  309. if (type == "roller") this.bus.$emit("setImageryRoller", layer2);
  310. // viewer.flyTo(layer2);
  311. break;
  312. case "Terrain": //地形
  313. this.addTerrain(obj.url);
  314. break;
  315. default:
  316. null;
  317. }
  318. if (type == "split")
  319. this.bus.$emit("setImagerySplit", obj, obj.checked, splitId);
  320. } else {
  321. for (let i = 0; i < this.addlayerdata.length; i++) {
  322. if (this.addlayerdata[i].title == obj.title) {
  323. this.addlayerdata.splice(i, 1);
  324. break;
  325. }
  326. }
  327. for (let i = 0; i < this.vectorlayerlist.length; i++) {
  328. if (this.vectorlayerlist[i].title == obj.title) {
  329. this.vectorlayerlist.splice(i, 1);
  330. break;
  331. }
  332. }
  333. for (let i = 0; i < this.modellayerlist.length; i++) {
  334. if (this.modellayerlist[i].title == obj.title) {
  335. this.modellayerlist.splice(i, 1);
  336. break;
  337. }
  338. }
  339. delete this.layerparams[obj.id];
  340. switch (obj.type) {
  341. case "S3M": //场景
  342. if (this.sceneLayers[obj.title]) {
  343. for (let i = 0; i < this.sceneLayers[obj.title].length; i++) {
  344. if (this.sceneLayers[obj.title][i].length > 0) {
  345. for (
  346. let u = 0;
  347. u < this.sceneLayers[obj.title][i].length;
  348. u++
  349. ) {
  350. viewer.scene.layers.remove(
  351. this.sceneLayers[obj.title][i][u]._name
  352. );
  353. }
  354. } else {
  355. viewer.scene.layers.remove(
  356. this.sceneLayers[obj.title][i]._name
  357. );
  358. }
  359. }
  360. }
  361. break;
  362. case "S3MDATA": //scp
  363. viewer.scene.layers.remove(obj.title);
  364. break;
  365. case "3DTiles": //tileset
  366. viewer.scene.primitives.remove(this.sceneLayers[obj.title]);
  367. break;
  368. case "IMG": //影像
  369. for (let i = 0; i < imageryLayers._layers.length; i++) {
  370. let element = imageryLayers._layers[i];
  371. if (element._imageryProvider._name == obj.title) {
  372. imageryLayers.remove(element);
  373. break;
  374. }
  375. }
  376. break;
  377. case "Vector": //矢量
  378. for (let i = 0; i < imageryLayers._layers.length; i++) {
  379. let element = imageryLayers._layers[i];
  380. if (element._imageryProvider._name == obj.title) {
  381. imageryLayers.remove(element);
  382. break;
  383. }
  384. }
  385. break;
  386. case "Terrain": //地形
  387. viewer.scene.terrainProvider = new Cesium.EllipsoidTerrainProvider(
  388. {}
  389. );
  390. break;
  391. default:
  392. null;
  393. }
  394. }
  395. },
  396. //图层定位
  397. location(obj) {
  398. let imageryLayers = viewer.imageryLayers;
  399. switch (obj.type) {
  400. case "S3M": //场景
  401. if (this.sceneLayers[obj.title]) {
  402. viewer.flyTo(this.sceneLayers[obj.title][0][0]);
  403. }
  404. break;
  405. case "S3MDATA": //scp
  406. viewer.flyTo(this.sceneLayers[obj.title][0][0]);
  407. break;
  408. case "3DTiles": //tileset
  409. viewer.flyTo(this.sceneLayers[obj.title]);
  410. break;
  411. case "IMG": //影像
  412. for (let i = 0; i < imageryLayers._layers.length; i++) {
  413. let element = imageryLayers._layers[i];
  414. if (element._imageryProvider._name == obj.title) {
  415. viewer.flyTo(element);
  416. break;
  417. }
  418. }
  419. break;
  420. case "Vector": //矢量
  421. for (let i = 0; i < imageryLayers._layers.length; i++) {
  422. let element = imageryLayers._layers[i];
  423. if (element._imageryProvider._name == obj.title) {
  424. viewer.flyTo(element);
  425. break;
  426. }
  427. }
  428. break;
  429. case "Terrain": //地形
  430. viewer.scene.terrainProvider = new Cesium.EllipsoidTerrainProvider(
  431. {}
  432. );
  433. break;
  434. default:
  435. null;
  436. }
  437. },
  438. //影像图层操作
  439. raise(obj) {
  440. viewer.imageryLayers.raise(this.layerparams[obj.id]);
  441. for (let i = 0; i < this.addlayerdata.length; i++) {
  442. if (this.addlayerdata[i].title == obj.title) {
  443. let arr = Array.from(this.addlayerdata);
  444. this.addlayerdata = [];
  445. this.addlayerdata = this.moveUp(arr, i);
  446. break;
  447. }
  448. }
  449. },
  450. lower(obj) {
  451. viewer.imageryLayers.lower(this.layerparams[obj.id]);
  452. for (let i = 0; i < this.addlayerdata.length; i++) {
  453. if (this.addlayerdata[i].title == obj.title) {
  454. let arr = Array.from(this.addlayerdata);
  455. this.addlayerdata = [];
  456. this.addlayerdata = this.moveDown(arr, i);
  457. break;
  458. }
  459. }
  460. },
  461. raiseToTop() {
  462. let imageryLayers = viewer.imageryLayers._layers;
  463. let ly = imageryLayers[this.contextData.id];
  464. viewer.imageryLayers.raiseToTop(ly);
  465. this.updataImgLayers();
  466. },
  467. lowerToBottom() {
  468. let imageryLayers = viewer.imageryLayers._layers;
  469. let ly = imageryLayers[this.contextData.id];
  470. viewer.imageryLayers.lowerToBottom(ly);
  471. this.updataImgLayers();
  472. },
  473. // 上移操作
  474. moveUp(array, index) {
  475. if (index > 0 && index < array.length) {
  476. let temp = array[index];
  477. array[index] = array[index - 1];
  478. array[index - 1] = temp;
  479. }
  480. return array;
  481. },
  482. // 下移操作
  483. moveDown(array, index) {
  484. if (index >= 0 && index < array.length - 1) {
  485. let temp = array[index];
  486. array[index] = array[index + 1];
  487. array[index + 1] = temp;
  488. }
  489. return array;
  490. },
  491. },
  492. mounted() {
  493. this.bus.$on("checkedChange", this.checkedChange);
  494. },
  495. watch: {},
  496. };
  497. </script>
  498. <style lang="scss">
  499. @import "./LayerManage.scss";
  500. </style>