LayerManage.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704
  1. <template>
  2. <div class="sm-panel" v-show="LayerManageShow">
  3. <div class="sm-panel-header">
  4. <span>{{ Resource.LayerManage }}</span>
  5. <span class="closeBtn" @click="toggleVisibility">&times;</span>
  6. </div>
  7. <Tabs value="">
  8. <TabPane :label="Resource.Resource" name="zyml">
  9. <div class="zyml">
  10. <el-input
  11. :placeholder="Resource.InputPlaceholder"
  12. prefix-icon="el-icon-search"
  13. v-model="treeSearchText"
  14. size="small"
  15. >
  16. </el-input>
  17. <div class="treeDiv">
  18. <el-tree
  19. @check="handleCheckChange"
  20. class="filter-tree"
  21. :data="TreeDatas"
  22. show-checkbox
  23. :props="defaultProps"
  24. :filter-node-method="filterNode"
  25. ref="tree"
  26. >
  27. <span class="custom-tree-node" slot-scope="{ node, data }">
  28. <span>{{ node.label }}</span>
  29. <span>
  30. <Icon
  31. :type="!data.favorite ? 'ios-star-outline' : 'ios-star'"
  32. color="green"
  33. size="18"
  34. class="opBtn"
  35. :title="
  36. data.favorite ? Resource.DelCollect : Resource.AddCollect
  37. "
  38. @click="favoriteHandle(data)"
  39. v-if="data.url != ''"
  40. />
  41. </span>
  42. </span>
  43. </el-tree>
  44. </div>
  45. </div>
  46. </TabPane>
  47. <TabPane :label="Resource.LayerOptions" name="tckz">
  48. <div class="tckz">
  49. <List split size="large">
  50. <ListItem v-for="(item, index) in addlayerdata" :key="index">
  51. {{ item.title }}
  52. <div class="listBtn">
  53. <i-switch
  54. v-model="item.visible"
  55. size="small"
  56. @on-change="visibleChange(item, $event)"
  57. >
  58. <template #open>
  59. <span></span>
  60. </template>
  61. <template #close>
  62. <span></span>
  63. </template>
  64. </i-switch>
  65. <Icon
  66. type="md-arrow-round-up"
  67. color="green"
  68. size="18"
  69. class="opBtn"
  70. :title="Resource.MoveUpOneLevel"
  71. @click="raise(item)"
  72. v-if="
  73. index > 0 && (item.type == 'Vector' || item.type == 'IMG')
  74. "
  75. />
  76. <Icon
  77. type="md-arrow-round-down"
  78. color="green"
  79. size="18"
  80. class="opBtn"
  81. :title="Resource.MoveDownOneLevel"
  82. @click="lower(item)"
  83. v-if="
  84. index < addlayerdata.length - 1 &&
  85. (item.type == 'Vector' || item.type == 'IMG')
  86. "
  87. />
  88. <Icon
  89. type="md-locate"
  90. color="green"
  91. size="18"
  92. class="opBtn"
  93. :title="Resource.location"
  94. @click="location(item)"
  95. />
  96. </div>
  97. <div class="sliderBtn" v-if="item.type != 'Terrain'">
  98. <Slider
  99. v-model="item.trans"
  100. @on-change="transSliderChange(item, $event)"
  101. ></Slider>
  102. </div>
  103. </ListItem>
  104. </List>
  105. </div>
  106. </TabPane>
  107. <TabPane :label="Resource.Favorite" name="collect">
  108. <div class="collect">
  109. <List split>
  110. <ListItem
  111. v-for="(item, index) in favoriteLayerList"
  112. :key="index"
  113. class="layerlist"
  114. >
  115. <Checkbox @on-change="checkboxChange(item, $event)">{{
  116. item.title
  117. }}</Checkbox>
  118. <div class="listBtn">
  119. <Icon
  120. type="ios-star"
  121. color="green"
  122. size="18"
  123. class="opBtn"
  124. :title="Resource.DelCollect"
  125. @click="favoriteHandle(item)"
  126. />
  127. </div>
  128. </ListItem>
  129. </List>
  130. </div>
  131. </TabPane>
  132. </Tabs>
  133. </div>
  134. </template>
  135. <script>
  136. import { Collect, GetResourceTree, GetMyCollect } from "@/api/map";
  137. export default {
  138. name: "LayerManage",
  139. data() {
  140. return {
  141. defaultProps: {
  142. children: "children",
  143. label: "label",
  144. },
  145. modellayerlist: [],
  146. vectorlayerlist: [],
  147. username: "admin",
  148. treeSearchText: "",
  149. addlayerdata: [],
  150. sceneLayers: {},
  151. favoriteLayerList: [],
  152. sharedState: store.state,
  153. // flag: false,
  154. // s3mLen: 0,
  155. hid: true,
  156. layerparams: {},
  157. ImgHid: false, //影响图层移动默认不显示
  158. S3MLayersObj: {
  159. title: Resource.s3mLayer,
  160. expand: true,
  161. checked: true,
  162. type: "S3M",
  163. children: [],
  164. },
  165. imgLayersObj: {
  166. title: Resource.imageryLayer,
  167. expand: true,
  168. checked: true,
  169. type: "IMG",
  170. children: [],
  171. },
  172. TerrainLayersObj: {
  173. title: Resource.terrainLayer,
  174. expand: true,
  175. checked: true,
  176. type: "TERRAIN",
  177. children: [],
  178. },
  179. TreeDatas: [
  180. {
  181. title: Resource.layerList,
  182. expand: true,
  183. // selected: true,
  184. // contextmenu: true,
  185. children: [],
  186. type: "ROOT",
  187. },
  188. ],
  189. contextData: null,
  190. hideS3mNames: [],
  191. hideImgNames: [],
  192. hideTerrainNames: [],
  193. S3MList:[],
  194. };
  195. },
  196. computed: {
  197. LayerManageShow: function () {
  198. return this.sharedState.toolBar[0];
  199. },
  200. imgLayers: function () {
  201. return this.sharedState.imgLayerManage;
  202. },
  203. terrainLayers: function () {
  204. return this.sharedState.terrainLayerManage;
  205. },
  206. S3MLayers: function () {
  207. return this.sharedState.S3MLayerManage;
  208. },
  209. },
  210. methods: {
  211. toggleVisibility() {
  212. store.setToolBarAction(0);
  213. },
  214. filterNode(value, data) {
  215. if (!value) return true;
  216. return data.label.indexOf(value) !== -1;
  217. },
  218. favoriteHandle(data) {
  219. if (data.favorite) {
  220. data.favorite = null;
  221. for (let i = 0; i < this.favoriteLayerList.length; i++) {
  222. if (this.favoriteLayerList[i].id == data.id) {
  223. this.favoriteLayerList.splice(i, 1);
  224. }
  225. }
  226. } else {
  227. data.favorite = this.username;
  228. this.favoriteLayerList.push(data);
  229. }
  230. Collect(this.username, data.id)
  231. .then((res) => {
  232. if (res.statuscode == 200) {
  233. this.$message({
  234. message: "操作成功",
  235. type: "success",
  236. });
  237. } else {
  238. this.$message.error(res.message);
  239. }
  240. })
  241. .catch((e) => {
  242. this.$message.error(e);
  243. });
  244. },
  245. favorite(data) {
  246. console.log(data);
  247. },
  248. checkboxChange(obj, checked, a) {
  249. obj.checked = checked;
  250. this.handleCheckChange(obj, checked);
  251. },
  252. visibleChange(obj, visible, a) {
  253. console.log(obj, visible, a);
  254. switch (obj.type) {
  255. case "S3M": //场景
  256. if (this.sceneLayers[obj.title]) {
  257. this.sceneLayers[obj.title][0][0].visible = visible;
  258. }
  259. break;
  260. case "3DTiles": //场景
  261. if (this.sceneLayers[obj.title]) {
  262. this.sceneLayers[obj.title].show = visible;
  263. }
  264. break;
  265. case "S3MDATA": //scp
  266. if (this.sceneLayers[obj.title]) {
  267. this.sceneLayers[obj.title][0][0].visible = visible;
  268. }
  269. break;
  270. case "IMG": //影像
  271. this.layerparams[obj.id].show = visible;
  272. break;
  273. case "Vector": //矢量
  274. this.layerparams[obj.id].show = visible;
  275. break;
  276. case "Terrain": //地形
  277. if (visible) {
  278. viewer.terrainProvider = new Cesium.CesiumTerrainProvider({
  279. url: obj.url,
  280. isSct: true,
  281. requestVertexNormals: true,
  282. });
  283. } else {
  284. viewer.scene.terrainProvider = new Cesium.EllipsoidTerrainProvider(
  285. {}
  286. );
  287. }
  288. break;
  289. default:
  290. null;
  291. }
  292. },
  293. transSliderChange(obj, v, a) {
  294. if (typeof v == undefined) {
  295. return;
  296. }
  297. let value = v / 100;
  298. let imageryLayers = viewer.imageryLayers;
  299. switch (obj.type) {
  300. case "S3M": //场景
  301. if (this.sceneLayers[obj.title]) {
  302. this.sceneLayers[obj.title][0][0].style3D.fillForeColor =
  303. new Cesium.Color(1.0, 1.0, 1.0, value);
  304. }
  305. break;
  306. case "S3MDATA": //scp
  307. if (this.sceneLayers[obj.title]) {
  308. this.sceneLayers[obj.title][0][0].style3D.fillForeColor =
  309. new Cesium.Color(1.0, 1.0, 1.0, value);
  310. }
  311. break;
  312. case "3DTiles": //tileset
  313. if (this.sceneLayers[obj.title]) {
  314. this.sceneLayers[obj.title].style = new Cesium.Cesium3DTileStyle({
  315. color: "color('rgba(255,255,255," + value + ")')",
  316. });
  317. }
  318. break;
  319. case "IMG": //影像
  320. for (let i = 0; i < imageryLayers._layers.length; i++) {
  321. let element = imageryLayers._layers[i];
  322. if (element._imageryProvider._name == obj.title) {
  323. element.alpha = value;
  324. break;
  325. }
  326. }
  327. break;
  328. case "Vector": //矢量
  329. for (let i = 0; i < imageryLayers._layers.length; i++) {
  330. let element = imageryLayers._layers[i];
  331. if (element._imageryProvider._name == obj.title) {
  332. element.alpha = value;
  333. break;
  334. }
  335. }
  336. break;
  337. case "Terrain": //地形
  338. break;
  339. default:
  340. null;
  341. }
  342. },
  343. addS3M(LayerURL) {
  344. let promiseArray = [];
  345. promiseArray.push(viewer.scene.addS3MTilesLayerByScp(LayerURL));
  346. this.promiseWhen(promiseArray, true);
  347. },
  348. addTerrain(LayerURL) {
  349. viewer.terrainProvider = new Cesium.CesiumTerrainProvider({
  350. url: LayerURL,
  351. isSct: true,
  352. requestVertexNormals: true,
  353. });
  354. },
  355. add3DTiles(obj) {
  356. let tileset = new Cesium.Cesium3DTileset({
  357. url: obj.url + "?id=" + obj.id,
  358. skipLevelOfDetail: true
  359. });
  360. this.sceneLayers[obj.title] = tileset;
  361. let thisLayer = viewer.scene.primitives.add(tileset);
  362. viewer.flyTo(thisLayer);
  363. },
  364. addImage(LayerURL) {
  365. var layer = viewer.imageryLayers.addImageryProvider(
  366. new Cesium.SuperMapImageryProvider({
  367. url: LayerURL,
  368. })
  369. );
  370. viewer.flyTo(layer);
  371. },
  372. promiseWhen(promiseArray, sceneName, obj) {
  373. let this_ = this;
  374. Cesium.when.all(
  375. promiseArray,
  376. (layers) => {
  377. this_.sceneLayers[obj.title] = layers;
  378. if (sceneName) {
  379. this.flyTo(sceneName);
  380. }
  381. if (obj.title == "分层分户") {
  382. store.setLayerList(layers[0][0])
  383. layers[0][0].setQueryParameter({
  384. url: "https://www.supermapol.com/realspace/services/data-HeBing8HaoLou/rest/data",
  385. dataSourceName: "Model_8_old",
  386. dataSetName: "属性表",
  387. keyWord: "SmID",
  388. });
  389. }
  390. store.state.S3MList.push(layers[0])
  391. store.state.tempLatData=layers[0]
  392. // for (var i = 0; i < layers.length; i++) {
  393. // let style = new Cesium.Style3D();
  394. // style.bottomAltitude = window.modelBottomAltitude; //底部高度
  395. // if (layers[i].length > 0) {
  396. // for (var j = 0; j < layers[i].length; j++) {
  397. // layers[i][j].style3D = style;
  398. // layers[i][j].refresh();
  399. // layers[i][j].isOverlapDisplayed = true; //开启避让
  400. // }
  401. // } else {
  402. // layers[i].style3D = style;
  403. // layers[i].refresh();
  404. // layers[i].isOverlapDisplayed = true; //开启避让
  405. // }
  406. // }
  407. },
  408. function (e) {
  409. if (widget._showRenderLoopErrors) {
  410. let title = Resource.scpUrlErrorMsg;
  411. widget.showErrorPanel(title, undefined, e);
  412. }
  413. }
  414. );
  415. },
  416. handleSelectChange(selectedList, obj) {
  417. obj ? (obj.expand = !obj.expand) : null;
  418. },
  419. // 复选框改变
  420. handleCheckChange(obj, checked) {
  421. // console.log(obj, checked ,);
  422. if (typeof checked == "boolean") {
  423. obj.checked = checked;
  424. } else {
  425. obj.checked = !obj.checked;
  426. }
  427. if (obj.children && obj.children.length > 0) {
  428. for (let i = 0; i < obj.children.length; i++) {
  429. this.handleCheckChange(obj.children[i], checked);
  430. }
  431. } else {
  432. let imageryLayers = viewer.imageryLayers;
  433. if (obj.checked) {
  434. obj.trans = 100;
  435. obj.visible = true;
  436. this.addlayerdata.push(obj);
  437. switch (obj.type) {
  438. case "S3M": //场景
  439. let s = viewer.scene.open(obj.url);
  440. this.vectorlayerlist.push(obj);
  441. this.promiseWhen([s], undefined, obj);
  442. // store.setModelLayerList(this.vectorlayerlist);
  443. // console.log(store.state.modellayerlist,'vvvvv');
  444. // store.state.S3MList.push(obj)
  445. break;
  446. case "S3MDATA": //scp
  447. viewer.scene.addS3MTilesLayerByScp(obj.url, {
  448. name: obj.title,
  449. });
  450. break;
  451. case "3DTiles": //tileset
  452. this.add3DTiles(obj);
  453. this.vectorlayerlist.push(obj);
  454. break;
  455. case "IMG": //影像
  456. let layer = viewer.imageryLayers.addImageryProvider(
  457. new Cesium.SuperMapImageryProvider({
  458. url: obj.url,
  459. name: obj.title,
  460. })
  461. );
  462. this.layerparams[obj.id] = layer;
  463. // viewer.flyTo(layer);
  464. break;
  465. case "Vector": //矢量
  466. let layer2 = viewer.imageryLayers.addImageryProvider(
  467. new Cesium.SuperMapImageryProvider({
  468. url: obj.url,
  469. name: obj.title,
  470. })
  471. );
  472. this.vectorlayerlist.push(obj);
  473. this.layerparams[obj.id] = layer2;
  474. // viewer.flyTo(layer2);
  475. break;
  476. case "Terrain": //地形
  477. this.addTerrain(obj.url);
  478. break;
  479. default:
  480. null;
  481. }
  482. } else {
  483. for (let i = 0; i < this.addlayerdata.length; i++) {
  484. if (this.addlayerdata[i].title == obj.title) {
  485. this.addlayerdata.splice(i, 1);
  486. break;
  487. }
  488. }
  489. for (let i = 0; i < this.vectorlayerlist.length; i++) {
  490. if (this.vectorlayerlist[i].title == obj.title) {
  491. this.vectorlayerlist.splice(i, 1);
  492. break;
  493. }
  494. }
  495. for (let i = 0; i < this.modellayerlist.length; i++) {
  496. if (this.modellayerlist[i].title == obj.title) {
  497. this.modellayerlist.splice(i, 1);
  498. break;
  499. }
  500. }
  501. delete this.layerparams[obj.id];
  502. switch (obj.type) {
  503. case "S3M": //场景
  504. if (this.sceneLayers[obj.title]) {
  505. for (let i = 0; i < this.sceneLayers[obj.title].length; i++) {
  506. if (this.sceneLayers[obj.title][i].length > 0) {
  507. for (
  508. let u = 0;
  509. u < this.sceneLayers[obj.title][i].length;
  510. u++
  511. ) {
  512. viewer.scene.layers.remove(
  513. this.sceneLayers[obj.title][i][u]._name
  514. );
  515. }
  516. } else {
  517. viewer.scene.layers.remove(
  518. this.sceneLayers[obj.title][i]._name
  519. );
  520. }
  521. }
  522. }
  523. break;
  524. case "S3MDATA": //scp
  525. viewer.scene.layers.remove(obj.title);
  526. break;
  527. case "3DTiles": //tileset
  528. viewer.scene.primitives.remove(this.sceneLayers[obj.title]);
  529. break;
  530. case "IMG": //影像
  531. for (let i = 0; i < imageryLayers._layers.length; i++) {
  532. let element = imageryLayers._layers[i];
  533. if (element._imageryProvider._name == obj.title) {
  534. imageryLayers.remove(element);
  535. break;
  536. }
  537. }
  538. break;
  539. case "Vector": //矢量
  540. for (let i = 0; i < imageryLayers._layers.length; i++) {
  541. let element = imageryLayers._layers[i];
  542. if (element._imageryProvider._name == obj.title) {
  543. imageryLayers.remove(element);
  544. break;
  545. }
  546. }
  547. break;
  548. case "Terrain": //地形
  549. viewer.scene.terrainProvider =
  550. new Cesium.EllipsoidTerrainProvider({});
  551. break;
  552. default:
  553. null;
  554. }
  555. }
  556. }
  557. store.setVectorLayerList(this.vectorlayerlist);
  558. store.setModelLayerList(this.modellayerlist);
  559. },
  560. //获取后台资源目录树结构
  561. getResourceTree() {
  562. GetResourceTree().then((res) => {
  563. if (res.statuscode == 200) {
  564. this.TreeDatas = res.data;
  565. store.state.tempResourceTree = res.data
  566. } else {
  567. console.log(e);
  568. }
  569. });
  570. },
  571. //获取后台资源目录树结构
  572. getFavoriteLayers() {
  573. GetMyCollect().then((res) => {
  574. if (res.statuscode == 200) {
  575. this.favoriteLayerList = res.data;
  576. } else {
  577. console.log(e);
  578. }
  579. });
  580. },
  581. //图层定位
  582. location(obj) {
  583. let imageryLayers = viewer.imageryLayers;
  584. switch (obj.type) {
  585. case "S3M": //场景
  586. if (this.sceneLayers[obj.title]) {
  587. viewer.flyTo(this.sceneLayers[obj.title][0][0]);
  588. }
  589. break;
  590. case "S3MDATA": //scp
  591. viewer.flyTo(this.sceneLayers[obj.title][0][0]);
  592. break;
  593. case "3DTiles": //tileset
  594. viewer.flyTo(this.sceneLayers[obj.title]);
  595. break;
  596. case "IMG": //影像
  597. for (let i = 0; i < imageryLayers._layers.length; i++) {
  598. let element = imageryLayers._layers[i];
  599. if (element._imageryProvider._name == obj.title) {
  600. viewer.flyTo(element);
  601. break;
  602. }
  603. }
  604. break;
  605. case "Vector": //矢量
  606. for (let i = 0; i < imageryLayers._layers.length; i++) {
  607. let element = imageryLayers._layers[i];
  608. if (element._imageryProvider._name == obj.title) {
  609. viewer.flyTo(element);
  610. break;
  611. }
  612. }
  613. break;
  614. case "Terrain": //地形
  615. viewer.scene.terrainProvider = new Cesium.EllipsoidTerrainProvider(
  616. {}
  617. );
  618. break;
  619. default:
  620. null;
  621. }
  622. },
  623. //影像图层操作
  624. raise(obj) {
  625. viewer.imageryLayers.raise(this.layerparams[obj.id]);
  626. for (let i = 0; i < this.addlayerdata.length; i++) {
  627. if (this.addlayerdata[i].title == obj.title) {
  628. let arr = Array.from(this.addlayerdata);
  629. this.addlayerdata = [];
  630. this.addlayerdata = this.moveUp(arr, i);
  631. break;
  632. }
  633. }
  634. },
  635. lower(obj) {
  636. viewer.imageryLayers.lower(this.layerparams[obj.id]);
  637. for (let i = 0; i < this.addlayerdata.length; i++) {
  638. if (this.addlayerdata[i].title == obj.title) {
  639. let arr = Array.from(this.addlayerdata);
  640. this.addlayerdata = [];
  641. this.addlayerdata = this.moveDown(arr, i);
  642. break;
  643. }
  644. }
  645. },
  646. raiseToTop() {
  647. let imageryLayers = viewer.imageryLayers._layers;
  648. let ly = imageryLayers[this.contextData.id];
  649. viewer.imageryLayers.raiseToTop(ly);
  650. this.updataImgLayers();
  651. },
  652. lowerToBottom() {
  653. let imageryLayers = viewer.imageryLayers._layers;
  654. let ly = imageryLayers[this.contextData.id];
  655. viewer.imageryLayers.lowerToBottom(ly);
  656. this.updataImgLayers();
  657. },
  658. // 上移操作
  659. moveUp(array, index) {
  660. if (index > 0 && index < array.length) {
  661. let temp = array[index];
  662. array[index] = array[index - 1];
  663. array[index - 1] = temp;
  664. }
  665. return array;
  666. },
  667. // 下移操作
  668. moveDown(array, index) {
  669. if (index >= 0 && index < array.length - 1) {
  670. let temp = array[index];
  671. array[index] = array[index + 1];
  672. array[index + 1] = temp;
  673. }
  674. return array;
  675. },
  676. },
  677. mounted() {
  678. this.getResourceTree();
  679. this.getFavoriteLayers();
  680. },
  681. watch: {
  682. treeSearchText(val) {
  683. this.$refs.tree.filter(val);
  684. },
  685. },
  686. };
  687. </script>
  688. <style lang="scss">
  689. @import "./LayerManage.scss";
  690. </style>