LayerManage.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629
  1. <template>
  2. <div>
  3. <layer-manage-split
  4. :addlayerdata="addlayerdata"
  5. @visibleChange="visibleChange"
  6. @transSliderChange="transSliderChange"
  7. @handleCheckChange="handleCheckChange"
  8. @location="location"
  9. @raise="raise"
  10. @lower="lower"
  11. ></layer-manage-split>
  12. <LayerLegend></LayerLegend>
  13. </div>
  14. </template>
  15. <script>
  16. import { Collect, GetResourceTree, GetMyCollect } from "@/api/map";
  17. import LayerLegend from "./LayerLegend.vue";
  18. export default {
  19. name: "LayerManage",
  20. components: { LayerLegend },
  21. data() {
  22. return {
  23. modellayerlist: [],
  24. vectorlayerlist: [],
  25. username: "admin",
  26. // treeSearchText: "",
  27. addlayerdata: [],
  28. sceneLayers: {},
  29. // favoriteLayerList: [],
  30. sharedState: store.state,
  31. // flag: false,
  32. // s3mLen: 0,
  33. // hid: true,
  34. layerparams: {},
  35. // ImgHid: false, //影响图层移动默认不显示
  36. // S3MLayersObj: {
  37. // title: Resource.s3mLayer,
  38. // expand: true,
  39. // checked: true,
  40. // type: "S3M",
  41. // children: [],
  42. // },
  43. // imgLayersObj: {
  44. // title: Resource.imageryLayer,
  45. // expand: true,
  46. // checked: true,
  47. // type: "IMG",
  48. // children: [],
  49. // },
  50. // TerrainLayersObj: {
  51. // title: Resource.terrainLayer,
  52. // expand: true,
  53. // checked: true,
  54. // type: "TERRAIN",
  55. // children: [],
  56. // },
  57. contextData: null,
  58. S3MList: [],
  59. };
  60. },
  61. computed: {
  62. imgLayers: function () {
  63. return this.sharedState.imgLayerManage;
  64. },
  65. terrainLayers: function () {
  66. return this.sharedState.terrainLayerManage;
  67. },
  68. S3MLayers: function () {
  69. return this.sharedState.S3MLayerManage;
  70. },
  71. },
  72. methods: {
  73. toggleVisibility() {
  74. store.setToolBarAction(0);
  75. },
  76. filterNode(value, data) {
  77. if (!value) return true;
  78. return data.label.indexOf(value) !== -1;
  79. },
  80. favorite(data) {
  81. console.log(data);
  82. },
  83. visibleChange(obj, visible, a) {
  84. console.log(obj, visible, a);
  85. switch (obj.type) {
  86. case "S3M": //场景
  87. if (this.sceneLayers[obj.title]) {
  88. for (let i = 0; i < this.sceneLayers[obj.title][0].length; i++) {
  89. this.sceneLayers[obj.title][0][i].visible = visible;
  90. }
  91. }
  92. break;
  93. case "3DTiles": //场景
  94. if (this.sceneLayers[obj.title]) {
  95. this.sceneLayers[obj.title].show = visible;
  96. }
  97. break;
  98. case "S3MDATA": //scp
  99. if (this.sceneLayers[obj.title]) {
  100. this.sceneLayers[obj.title][0][0].visible = visible;
  101. }
  102. break;
  103. case "IMG": //影像
  104. this.layerparams[obj.id].show = visible;
  105. break;
  106. case "Vector": //矢量
  107. this.layerparams[obj.id].show = visible;
  108. break;
  109. case "Terrain": //地形
  110. if (visible) {
  111. viewer.terrainProvider = new Cesium.CesiumTerrainProvider({
  112. url: obj.url,
  113. isSct: true,
  114. requestVertexNormals: true,
  115. });
  116. } else {
  117. viewer.scene.terrainProvider = new Cesium.EllipsoidTerrainProvider(
  118. {}
  119. );
  120. }
  121. break;
  122. default:
  123. null;
  124. }
  125. },
  126. transSliderChange(obj, v, a) {
  127. if (typeof v == undefined) {
  128. return;
  129. }
  130. let value = v / 100;
  131. let imageryLayers = viewer.imageryLayers;
  132. switch (obj.type) {
  133. case "S3M": //场景
  134. if (this.sceneLayers[obj.title]) {
  135. this.sceneLayers[obj.title][0][0].style3D.fillForeColor =
  136. new Cesium.Color(1.0, 1.0, 1.0, value);
  137. }
  138. break;
  139. case "S3MDATA": //scp
  140. if (this.sceneLayers[obj.title]) {
  141. this.sceneLayers[obj.title][0][0].style3D.fillForeColor =
  142. new Cesium.Color(1.0, 1.0, 1.0, value);
  143. }
  144. break;
  145. case "3DTiles": //tileset
  146. if (this.sceneLayers[obj.title]) {
  147. this.sceneLayers[obj.title].style = new Cesium.Cesium3DTileStyle({
  148. color: "color('rgba(255,255,255," + value + ")')",
  149. });
  150. }
  151. break;
  152. case "IMG": //影像
  153. for (let i = 0; i < imageryLayers._layers.length; i++) {
  154. let element = imageryLayers._layers[i];
  155. if (element._imageryProvider._name == obj.title) {
  156. element.alpha = value;
  157. break;
  158. }
  159. }
  160. break;
  161. case "Vector": //矢量
  162. for (let i = 0; i < imageryLayers._layers.length; i++) {
  163. let element = imageryLayers._layers[i];
  164. if (element._imageryProvider._name == obj.title) {
  165. element.alpha = value;
  166. break;
  167. }
  168. }
  169. break;
  170. case "Terrain": //地形
  171. break;
  172. default:
  173. null;
  174. }
  175. },
  176. addS3M(LayerURL) {
  177. let promiseArray = [];
  178. promiseArray.push(viewer.scene.addS3MTilesLayerByScp(LayerURL));
  179. this.promiseWhen(promiseArray, true);
  180. },
  181. addTerrain(LayerURL) {
  182. viewer.terrainProvider = new Cesium.CesiumTerrainProvider({
  183. url: LayerURL,
  184. isSct: true,
  185. requestVertexNormals: true,
  186. });
  187. this.bus.$emit("setDepthAgainst", true);
  188. },
  189. add3DTiles(obj) {
  190. let tileset = new Cesium.Cesium3DTileset({
  191. url: obj.url + "?id=" + obj.id,
  192. skipLevelOfDetail: true,
  193. });
  194. this.sceneLayers[obj.title] = tileset;
  195. store.setSceneLayersList(this.sceneLayers);
  196. let thisLayer = viewer.scene.primitives.add(tileset);
  197. viewer.flyTo(thisLayer);
  198. },
  199. addImage(LayerURL) {
  200. var layer = viewer.imageryLayers.addImageryProvider(
  201. new Cesium.SuperMapImageryProvider({
  202. url: LayerURL,
  203. })
  204. );
  205. viewer.flyTo(layer);
  206. },
  207. addWMS(obj) {
  208. let layer = viewer.imageryLayers.addImageryProvider(
  209. new Cesium.WebMapServiceImageryProvider({
  210. url: obj.url, // "http://192.168.60.52:28085/geoserver/wms",
  211. layers: "demo:yzq_czkfbj", //"demo:Ahtq_czkfbj",
  212. parameters: {
  213. service: "WMS",
  214. format: "image/png",
  215. transparent: true,
  216. // srs: "EPSG:4326", // 坐标参考系统,可以根据需要更改
  217. },
  218. })
  219. );
  220. return layer;
  221. },
  222. addWMTS(obj) {
  223. return viewer.imageryLayers.addImageryProvider(
  224. new Cesium.WebMapTileServiceImageryProvider({
  225. url: obj.url, //"http://192.168.60.52:28085/geoserver/gwc/service/wmts";
  226. layer: "demo:dltbgroup", // 替换为你的WMTS图层名称
  227. style: "", // 替换为你的WMTS图层风格
  228. tileMatrixSetID: "WebMercatorQuadx2", // 或者其他的EPSG代码
  229. format: "image/png",
  230. tilingScheme: new Cesium.WebMercatorTilingScheme(), // 当想要加载EPSG:4326瓦片服务时,只需要创建一个GeographicTilingScheme对象即可
  231. maximumLevel: 18, // 根据实际情况设置最大级别
  232. })
  233. );
  234. },
  235. addArcGis(obj) {
  236. let layer = viewer.imageryLayers.addImageryProvider(
  237. new Cesium.ArcGisMapServerImageryProvider({
  238. url: "http://192.168.60.20:6080/arcgis/rest/services/150500/DLTB00_2019/MapServer?f=jsapi",
  239. })
  240. );
  241. viewer.flyTo(layer);
  242. },
  243. promiseWhen(promiseArray, sceneName, obj) {
  244. let this_ = this;
  245. Cesium.when.all(
  246. promiseArray,
  247. (layers) => {
  248. console.log(layers, "layerslayers");
  249. this_.sceneLayers[obj.title] = layers;
  250. // if (sceneName) {
  251. // this.flyTo(sceneName);
  252. // }
  253. if (obj.url.indexOf("3D-HeBing8HaoLou") > 0) {
  254. store.setLayerList(layers[0][0]);
  255. layers[0][0].setQueryParameter({
  256. url: "https://www.supermapol.com/realspace/services/data-HeBing8HaoLou/rest/data",
  257. dataSourceName: "Model_8_old",
  258. dataSetName: "属性表",
  259. keyWord: "SmID",
  260. });
  261. } else if (obj.title == "分层分户_白膜") {
  262. store.setLayerList(layers[0][0]);
  263. }
  264. // store.state.S3MList.push(layers[0]);
  265. store.state.tempLatData = layers;
  266. layers[0].forEach((item) => {
  267. item.RGBTOBGR = true;
  268. if (obj.title == "倾斜摄影") {
  269. let style = new Cesium.Style3D();
  270. style.bottomAltitude = window.modelBottomAltitude; //底部高度
  271. item.style3D = style;
  272. item.brightness = 1.2;
  273. item.contrast = 1.2;
  274. item.saturation = 1.2;
  275. item.gamma = 1.1;
  276. }
  277. if (
  278. item.name.indexOf("雨水") > -1 ||
  279. item.name.indexOf("管线") > -1
  280. ) {
  281. item._baseUri.query = obj.id;
  282. }
  283. });
  284. // store.state.tempLatData = layers[0];
  285. store.setSceneLayersList(this_.sceneLayers);
  286. // for (var i = 0; i < layers.length; i++) {
  287. // let style = new Cesium.Style3D();
  288. // style.bottomAltitude = window.modelBottomAltitude; //底部高度
  289. // if (layers[i].length > 0) {
  290. // for (var j = 0; j < layers[i].length; j++) {
  291. // layers[i][j].style3D = style;
  292. // layers[i][j].refresh();
  293. // layers[i][j].isOverlapDisplayed = true; //开启避让
  294. // }
  295. // } else {
  296. // layers[i].style3D = style;
  297. // layers[i].refresh();
  298. // layers[i].isOverlapDisplayed = true; //开启避让
  299. // }
  300. // }
  301. },
  302. function (e) {
  303. if (widget._showRenderLoopErrors) {
  304. let title = Resource.scpUrlErrorMsg;
  305. widget.showErrorPanel(title, undefined, e);
  306. }
  307. }
  308. );
  309. },
  310. handleSelectChange(selectedList, obj) {
  311. obj ? (obj.expand = !obj.expand) : null;
  312. },
  313. // 复选框改变
  314. handleCheckChange(obj, checked) {
  315. // console.log(obj, checked ,);
  316. if (obj.children && obj.children.length > 0) {
  317. for (let i = 0; i < obj.children.length; i++) {
  318. this.handleCheckChange(obj.children[i], checked);
  319. }
  320. } else {
  321. this.checkedChange(obj);
  322. if (checked) store.setCheckedData(obj);
  323. }
  324. store.setVectorLayerList(this.vectorlayerlist);
  325. store.setModelLayerList(this.modellayerlist);
  326. },
  327. //type roller 卷帘 split分屏splitId
  328. checkedChange(obj, type, splitId) {
  329. let imageryLayers = viewer.imageryLayers;
  330. if (obj.checked) {
  331. obj.trans = 100;
  332. obj.visible = true;
  333. this.addlayerdata.push(obj);
  334. if (obj.title == "测试WMS") {
  335. this.layerparams[obj.id] = this.addWMS(obj);
  336. store.setlayerparamsList(this.layerparams);
  337. } else if (obj.title == "测试WMTS") {
  338. this.addWMTS(obj);
  339. } else {
  340. switch (obj.type) {
  341. case "S3M": //场景
  342. let s = viewer.scene.open(obj.url, undefined, {
  343. autoSetView: false, // obj.title != "倾斜摄影",
  344. });
  345. this.vectorlayerlist.push(obj);
  346. this.promiseWhen([s], undefined, obj);
  347. this.bus.$emit("setDepthAgainst", true);
  348. if (
  349. obj.title.indexOf("雨水") > -1 ||
  350. obj.title.indexOf("管线") > -1
  351. ) {
  352. console.log(obj.checked, "obj.checked");
  353. this.bus.$emit("setnUderground", obj.checked);
  354. }
  355. // store.setModelLayerList(this.vectorlayerlist);
  356. // console.log(store.state.modellayerlist,'vvvvv');
  357. // store.state.S3MList.push(obj)
  358. break;
  359. case "S3MDATA": //scp
  360. viewer.scene.addS3MTilesLayerByScp(obj.url, {
  361. name: obj.title,
  362. });
  363. break;
  364. case "3DTiles": //tileset
  365. this.add3DTiles(obj);
  366. this.vectorlayerlist.push(obj);
  367. break;
  368. case "IMG": //影像
  369. let layer = viewer.imageryLayers.addImageryProvider(
  370. new Cesium.SuperMapImageryProvider({
  371. url: obj.url,
  372. name: obj.title,
  373. })
  374. );
  375. this.layerparams[obj.id] = layer;
  376. store.setlayerparamsList(this.layerparams);
  377. if (type == "roller")
  378. this.bus.$emit("setImageryRoller", layer, splitId);
  379. // viewer.flyTo(layer);
  380. break;
  381. case "Vector": //矢量
  382. // let provider = new Cesium.SuperMapImageryProvider({
  383. // url: obj.url,
  384. // name: obj.title,
  385. // })
  386. // let layer2 = viewer.imageryLayers.addImageryProvider(
  387. // provider
  388. // );
  389. // var params = [{
  390. // layerName: 'YJJBNTBHTB@YJJBNTBH',
  391. // isVisible: true,
  392. // displayFilter: "xzqdm='460205000003'"
  393. // }
  394. // ]
  395. // provider.setLayerStatusParameters(params)
  396. // let layer2 = viewer.imageryLayers.addImageryProvider(
  397. // new Cesium.SuperMapImageryProvider({
  398. // url: obj.url,
  399. // name: obj.title,
  400. // })
  401. // );
  402. // var provider = new Cesium.SuperMapImageryProvider({ url: 'http://192.168.60.3:8099/iserver/services/map-GuiHuaDiKuai/rest/maps/GHDK%40%E8%A7%84%E5%88%92%E5%9C%B0%E5%9D%97' });
  403. // var layer2 = viewer.imageryLayers.addImageryProvider(provider);
  404. // var params = [
  405. // {
  406. // layerName: 'GHDK@规划地块',
  407. // isVisible: true,
  408. // displayFilter: "XZQDM LIKE '460203%' and PFSJ < '20190808'"
  409. // }
  410. // ]
  411. // provider.setLayerStatusParameters(params)
  412. let layer2 = viewer.imageryLayers.addImageryProvider(
  413. new Cesium.SuperMapImageryProvider({
  414. url: obj.url,
  415. name: obj.title,
  416. })
  417. );
  418. this.vectorlayerlist.push(obj);
  419. this.layerparams[obj.id] = layer2;
  420. store.setlayerparamsList(this.layerparams);
  421. if (type == "roller")
  422. this.bus.$emit("setImageryRoller", layer2, splitId);
  423. // viewer.flyTo(layer2);
  424. break;
  425. case "Terrain": //地形
  426. this.addTerrain(obj.url);
  427. break;
  428. default:
  429. null;
  430. }
  431. }
  432. if (type == "split")
  433. this.bus.$emit("setImagerySplit", obj, obj.checked, splitId, true);
  434. } else {
  435. if (obj.title.indexOf("雨水") > -1 || obj.title.indexOf("管线") > -1) {
  436. console.log(obj.checked, "obj.checked");
  437. this.bus.$emit("setnUderground", obj.checked);
  438. }
  439. for (let i = 0; i < this.addlayerdata.length; i++) {
  440. if (this.addlayerdata[i].title == obj.title) {
  441. this.addlayerdata.splice(i, 1);
  442. break;
  443. }
  444. }
  445. for (let i = 0; i < this.vectorlayerlist.length; i++) {
  446. if (this.vectorlayerlist[i].title == obj.title) {
  447. this.vectorlayerlist.splice(i, 1);
  448. break;
  449. }
  450. }
  451. for (let i = 0; i < this.modellayerlist.length; i++) {
  452. if (this.modellayerlist[i].title == obj.title) {
  453. this.modellayerlist.splice(i, 1);
  454. break;
  455. }
  456. }
  457. delete this.layerparams[obj.id];
  458. switch (obj.type) {
  459. case "S3M": //场景
  460. if (this.sceneLayers[obj.title]) {
  461. for (let i = 0; i < this.sceneLayers[obj.title].length; i++) {
  462. if (this.sceneLayers[obj.title][i].length > 0) {
  463. for (
  464. let u = 0;
  465. u < this.sceneLayers[obj.title][i].length;
  466. u++
  467. ) {
  468. viewer.scene.layers.remove(
  469. this.sceneLayers[obj.title][i][u]._name
  470. );
  471. }
  472. } else {
  473. viewer.scene.layers.remove(
  474. this.sceneLayers[obj.title][i]._name
  475. );
  476. }
  477. }
  478. }
  479. break;
  480. case "S3MDATA": //scp
  481. viewer.scene.layers.remove(obj.title);
  482. break;
  483. case "3DTiles": //tileset
  484. viewer.scene.primitives.remove(this.sceneLayers[obj.title]);
  485. break;
  486. case "IMG": //影像
  487. for (let i = 0; i < imageryLayers._layers.length; i++) {
  488. let element = imageryLayers._layers[i];
  489. if (element._imageryProvider._name == obj.title) {
  490. imageryLayers.remove(element);
  491. break;
  492. }
  493. }
  494. break;
  495. case "Vector": //矢量
  496. for (let i = 0; i < imageryLayers._layers.length; i++) {
  497. let element = imageryLayers._layers[i];
  498. if (element._imageryProvider._name == obj.title) {
  499. imageryLayers.remove(element);
  500. break;
  501. }
  502. }
  503. break;
  504. case "Terrain": //地形
  505. viewer.scene.terrainProvider = new Cesium.EllipsoidTerrainProvider(
  506. {}
  507. );
  508. break;
  509. default:
  510. null;
  511. }
  512. }
  513. },
  514. //图层定位
  515. location(obj) {
  516. let imageryLayers = viewer.imageryLayers;
  517. switch (obj.type) {
  518. case "S3M": //场景
  519. if (this.sceneLayers[obj.title]) {
  520. viewer.flyTo(this.sceneLayers[obj.title][0][0]);
  521. }
  522. break;
  523. case "S3MDATA": //scp
  524. viewer.flyTo(this.sceneLayers[obj.title][0][0]);
  525. break;
  526. case "3DTiles": //tileset
  527. viewer.flyTo(this.sceneLayers[obj.title]);
  528. break;
  529. case "IMG": //影像
  530. case "Vector": //矢量
  531. viewer.flyTo(this.layerparams[obj.id]);
  532. // for (let i = 0; i < imageryLayers._layers.length; i++) {
  533. // let element = imageryLayers._layers[i];
  534. // if (element._imageryProvider._name == obj.title) {
  535. // viewer.flyTo(element);
  536. // break;
  537. // }
  538. // }
  539. break;
  540. case "Terrain": //地形
  541. viewer.scene.terrainProvider = new Cesium.EllipsoidTerrainProvider(
  542. {}
  543. );
  544. break;
  545. default:
  546. null;
  547. }
  548. },
  549. //影像图层操作
  550. raise(obj) {
  551. viewer.imageryLayers.raise(this.layerparams[obj.id]);
  552. for (let i = 0; i < this.addlayerdata.length; i++) {
  553. if (this.addlayerdata[i].title == obj.title) {
  554. let arr = Array.from(this.addlayerdata);
  555. this.addlayerdata = [];
  556. this.addlayerdata = this.moveUp(arr, i);
  557. break;
  558. }
  559. }
  560. },
  561. lower(obj) {
  562. viewer.imageryLayers.lower(this.layerparams[obj.id]);
  563. for (let i = 0; i < this.addlayerdata.length; i++) {
  564. if (this.addlayerdata[i].title == obj.title) {
  565. let arr = Array.from(this.addlayerdata);
  566. this.addlayerdata = [];
  567. this.addlayerdata = this.moveDown(arr, i);
  568. break;
  569. }
  570. }
  571. },
  572. raiseToTop() {
  573. let imageryLayers = viewer.imageryLayers._layers;
  574. let ly = imageryLayers[this.contextData.id];
  575. viewer.imageryLayers.raiseToTop(ly);
  576. this.updataImgLayers();
  577. },
  578. lowerToBottom() {
  579. let imageryLayers = viewer.imageryLayers._layers;
  580. let ly = imageryLayers[this.contextData.id];
  581. viewer.imageryLayers.lowerToBottom(ly);
  582. this.updataImgLayers();
  583. },
  584. // 上移操作
  585. moveUp(array, index) {
  586. if (index > 0 && index < array.length) {
  587. let temp = array[index];
  588. array[index] = array[index - 1];
  589. array[index - 1] = temp;
  590. }
  591. return array;
  592. },
  593. // 下移操作
  594. moveDown(array, index) {
  595. if (index >= 0 && index < array.length - 1) {
  596. let temp = array[index];
  597. array[index] = array[index + 1];
  598. array[index + 1] = temp;
  599. }
  600. return array;
  601. },
  602. },
  603. mounted() {
  604. this.bus.$on("checkedChange", this.checkedChange);
  605. },
  606. watch: {},
  607. };
  608. </script>
  609. <style lang="scss">
  610. @import "./LayerManage.scss";
  611. </style>