ViewerSplitScreen.vue 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130
  1. <script setup>
  2. import {
  3. inject
  4. } from "vue";
  5. const getMapInstance = inject("getMapInstance");
  6. jt3dRight = getMapInstance();
  7. import {
  8. Store
  9. } from '@/store/index'
  10. store = Store()
  11. import {
  12. deepTree
  13. } from "@/utils/deepTree.js";
  14. </script>
  15. <template>
  16. <div class="jt-layer">
  17. <el-tree :data="treeData" :default-expanded-keys="expandedKeys" node-key="id" class="tree-line" :expand-on-click-node="false" ref="treeRef" @check-change="handleCheckChange" @node-click="handleClick">
  18. <template #default="{ node, data }">
  19. <!-- 复选框 -->
  20. <el-checkbox v-if="data.ischeck === '1' && store.userport == 'PC'" v-model="node.checked" :indeterminate="node.indeterminate" :disabled="!!node.disabled" @change="handleCheckBoxChange($event, data, node)">
  21. </el-checkbox>
  22. <el-switch v-else-if="data.ischeck == 1 && store.userport == 'APP'" width="30rem" size="small" v-model="node.checked" @change="handleCheckBoxChange($event, data, node)" />
  23. <span class="custom-tree-node">
  24. <!-- 字体、图标 -->
  25. <!-- <span>
  26. <img src="@/assets/images/logo16x16.ico" />
  27. </span> -->
  28. <span class="overflowtext">
  29. {{ data.layername }}
  30. </span>
  31. </span>
  32. <!-- 透明度 -->
  33. <template v-if="node.checked && data.opacity >0">
  34. <div style="width: 80rem; padding: 0 20rem; position: absolute; right: 0">
  35. <el-slider v-model="data.opacity" @input="handleSliderChange($event, data)" :max="1" :min="0.1" :step="0.1" />
  36. </div>
  37. </template>
  38. </template>
  39. </el-tree>
  40. </div>
  41. </template>
  42. <script>
  43. let store = undefined;
  44. let jt3dRight = undefined;
  45. let jt3dLeft = undefined;
  46. export default {
  47. /* 数据 */
  48. data() {
  49. return {
  50. treeData: [],
  51. inittree: [], //初始化图层数组
  52. expandedKeys: [], //对应要展开的节点id
  53. }
  54. },
  55. /* 方法 */
  56. methods: {
  57. /**
  58. * el-tree 当节点被点击的时候触发
  59. * 控制地图服务的显示及隐藏
  60. * @param {Object} data 传递给 data 属性的数组中该节点所对应的对象
  61. */
  62. async handleClick(data) {
  63. let _self = this;
  64. let _serviceId = "serviceLeft_" + data.layercode + data.layerorder;
  65. let layername = data.layername;
  66. //透明度
  67. let _opacity = null;
  68. if (data.opacity == null) {
  69. _opacity = 1;
  70. } else {
  71. _opacity = Number(data.opacity);
  72. data.opacity = _opacity;
  73. if (_opacity == 0) {
  74. _opacity = 1;
  75. }
  76. }
  77. //参数集
  78. let parameterset = data.parameterset;
  79. if (data.parameterset instanceof Object) {
  80. parameterset = data.parameterset;
  81. } else if (data.parameterset != "" && data.parameterset != null && data.parameterset != undefined) {
  82. parameterset = JSON.parse(data.parameterset);
  83. }
  84. if (data.isinit === '1') {
  85. await new Promise((resolve, reject) => {
  86. switch (data.loadtype) {
  87. case "GeoJsonPolyline": //GeoJsonPolyline
  88. break;
  89. case "entitiesGltf": //gltf/glb
  90. if (parameterset) {
  91. if (parameterset.points) { //模型位置
  92. let flyToEntity = jt3dLeft.LocateUtil.flyToEntityByPoints([
  93. parameterset.points,
  94. ], 'point', {
  95. heading: 0,
  96. pitch: -90,
  97. range: 8880
  98. });
  99. } else {
  100. ElMessage("请检测图层表parameterset字段是否设置points");
  101. }
  102. } else {
  103. ElMessage("请检测图层表parameterset字段是否设置points");
  104. }
  105. break;
  106. case "PolygonImageMaterial": //图片材质
  107. break;
  108. case "CrImageServerLayer": //地形服务(DEM)
  109. break;
  110. case "DEM": //地形服务(DEM)
  111. break;
  112. case "UrlTemplateImageryProvider": //加载URL模板服务
  113. break;
  114. case "WebMapTileServiceImageryProvider": // WMTS地图服务
  115. break;
  116. case "WebMapServiceImageryProvider": //WMS地图服务
  117. break;
  118. case "ArcGisMapServerImageryProvider": // ArcGIS Online和Server的相关服务
  119. break;
  120. case "TileMapServiceImageryProvider": // 2.5维度地图
  121. break;
  122. case "Cesium3DTileset": //加载3DTileset地图服务--实景
  123. break;
  124. case "Cesium3DTileset_BM": //加载3DTileset地图服务--白膜
  125. break;
  126. default:
  127. break;
  128. }
  129. })
  130. }
  131. },
  132. /**
  133. * el-tree 当复选框被点击的时候触发
  134. * 控制地图服务的显示及隐藏
  135. * @param {Object} data 传递给 data 属性的数组中该节点所对应的对象
  136. * @param {Object} checked 节点本身是否被选中
  137. */
  138. async handleCheckChange(data, checked) {
  139. let _self = this;
  140. let _serviceId = "serviceLeft_" + data.layercode + data.layerorder;
  141. let layername = data.layername;
  142. let layertype = data.layertype;
  143. //透明度
  144. let _opacity = null;
  145. if (data.opacity == null) {
  146. _opacity = 1;
  147. } else {
  148. _opacity = Number(data.opacity);
  149. data.opacity = _opacity;
  150. if (_opacity == 0) {
  151. _opacity = 1;
  152. }
  153. }
  154. //参数集
  155. let parameterset = data.parameterset;
  156. if (data.parameterset instanceof Object) {
  157. parameterset = data.parameterset;
  158. } else if (data.parameterset != "" && data.parameterset != null && data.parameterset != undefined) {
  159. parameterset = JSON.parse(data.parameterset);
  160. }
  161. //在显示的图层中,如果图层配置可以查询,则进行查询
  162. if (layertype === '矢量面' && data.querytable) {
  163. if (checked) {
  164. if (store.queryMapTables.indexOf(data.querytable) === -1) {
  165. store.queryMapTables.push(data.querytable);
  166. }
  167. } else {
  168. //过滤
  169. store.queryMapTables = store.queryMapTables.filter(tableName => {
  170. return tableName !== data.querytable
  171. })
  172. }
  173. }
  174. await new Promise((resolve, reject) => {
  175. switch (data.loadtype) {
  176. case "GeoJsonPoint": //GeoJsonPoint
  177. if (checked) {
  178. //设置参数
  179. let _options = {
  180. id: _serviceId,
  181. url: data.datasource,
  182. }
  183. if (parameterset) {
  184. if (parameterset.billboard instanceof Object) {
  185. let billboard = parameterset.billboard;
  186. _options.billboard = billboard;
  187. }
  188. if (parameterset.label instanceof Object) {
  189. let label = parameterset.label;
  190. _options.label = label;
  191. }
  192. }
  193. jt3dLeft.layer.addBillboardByGeoJson(_options, function(serviceId) {
  194. });
  195. } else {
  196. jt3dLeft.layer.removeDataSources({
  197. serviceId: _serviceId,
  198. });
  199. }
  200. break;
  201. case "GeoJsonPolyline": //GeoJsonPolyline
  202. if (checked) {
  203. //设置参数
  204. let _options = {
  205. id: _serviceId,
  206. url: data.datasource,
  207. }
  208. if (parameterset) {
  209. if (parameterset.clampToGround) { //是否贴地
  210. _options.clampToGround = parameterset.clampToGround;
  211. }
  212. if (parameterset.isImageAlpha) { //是否采用图片颜色
  213. _options.isImageAlpha = parameterset.isImageAlpha;
  214. }
  215. if (parameterset.imgUrl) { //精灵线图片
  216. _options.imgUrl = parameterset.imgUrl;
  217. }
  218. if (parameterset.color) { //指定线的颜色
  219. _options.color = parameterset.color;
  220. }
  221. if (parameterset.width) { //线宽
  222. _options.width = parameterset.width;
  223. }
  224. if (parameterset.duration) { //持续时间 毫秒,越小越快
  225. _options.duration = parameterset.duration;
  226. }
  227. if (parameterset.count) { //重复次数
  228. _options.count = parameterset.count;
  229. }
  230. if (parameterset.direction) { //direction=vertical 纵,order='-'(由下到上) , '+"(由上到下)
  231. _options.direction = parameterset.direction;
  232. }
  233. if (parameterset.order) { //direction=horizontal 横,order='-'(顺时针) , '+'(逆时针)
  234. _options.order = parameterset.order;
  235. }
  236. }
  237. jt3dLeft.layer.addPolylineByGeoJson(_options, function(serviceId) {
  238. });
  239. } else {
  240. jt3dLeft.layer.removeDataSources({
  241. serviceId: _serviceId,
  242. });
  243. }
  244. break;
  245. case "entitiesGltf": //gltf/glb
  246. if (checked) {
  247. //设置参数
  248. let _options = {
  249. id: _serviceId,
  250. url: data.datasource,
  251. points: [],
  252. }
  253. if (parameterset) {
  254. if (parameterset.points) { //模型位置
  255. _options.points = parameterset.points;
  256. if (parameterset.minimumPixelSize) { //模型最小刻度
  257. _options.minimumPixelSize = parameterset.minimumPixelSize;
  258. }
  259. if (parameterset.maximumScale) { //模型的最大比例尺大小,设置模型最大放大大小
  260. _options.maximumScale = parameterset.maximumScale;
  261. }
  262. if (parameterset.silhouetteColor) { //模型轮廓颜色
  263. _options.silhouetteColor = parameterset.silhouetteColor;
  264. }
  265. if (parameterset.alpha) { //模型透明度
  266. _options.alpha = parameterset.alpha;
  267. }
  268. if (parameterset.heading) { //以弧度为单位的航向分量
  269. _options.heading = parameterset.heading;
  270. }
  271. if (parameterset.pitch) { //以弧度为单位的航向分量
  272. _options.pitch = parameterset.pitch;
  273. }
  274. if (parameterset.roll) { //以弧度为单位的滚动分量
  275. _options.roll = parameterset.roll;
  276. }
  277. jt3dLeft.layer.addEntitiesGltf(_options, function(serviceId) {
  278. // let flyToEntity = jt3dLeft.LocateUtil.flyToEntityByPoints([
  279. // parameterset.points,
  280. // ], 'point');
  281. });
  282. } else {
  283. ElMessage("请检测图层表parameterset字段是否设置points");
  284. }
  285. } else {
  286. ElMessage("请检测图层表parameterset字段是否设置points");
  287. }
  288. } else {
  289. jt3dLeft.layer.removeEntity({
  290. serviceId: _serviceId,
  291. });
  292. }
  293. break;
  294. case "PolygonImageMaterial": //图片材质
  295. if (checked) {
  296. if (parameterset) {
  297. if (parameterset.points) {
  298. jt3dLeft.layer.addPolygonImageMaterial({
  299. id: _serviceId,
  300. points: parameterset.points,
  301. url: data.datasource,
  302. alpha: _opacity
  303. }, function(serviceId) {
  304. });
  305. } else {
  306. ElMessage("请检测图层表parameterset字段是否设置points");
  307. }
  308. } else {
  309. ElMessage("请检测图层表parameterset字段是否设置points");
  310. }
  311. } else {
  312. jt3dLeft.layer.removeEntity({
  313. serviceId: _serviceId,
  314. });
  315. }
  316. break;
  317. case "CrImageServerLayer": //贴地所有地形、模型的规划图、网格地图
  318. if (checked) {
  319. let floatLayer = new this.jt3dSDK.CrImageServerLayer({
  320. viewer: jt3dLeft._viewer,
  321. url: data.datasource,
  322. opacity: _opacity,
  323. show: true
  324. });
  325. window[_serviceId] = floatLayer;
  326. //添加网格地图
  327. // window[_serviceId].show();
  328. } else {
  329. window[_serviceId].hide();
  330. }
  331. break;
  332. case "DEM": //地形服务(DEM)
  333. if (checked) {
  334. //设置参数
  335. let _options = {
  336. url: data.datasource,
  337. }
  338. if (parameterset) {
  339. if (parameterset.terrainExaggeration) { //地形夸张系数
  340. _options.terrainExaggeration = parameterset.terrainExaggeration;
  341. }
  342. }
  343. jt3dLeft.layer.addTerrain(_options);
  344. } else {
  345. jt3dLeft.layer.removeTerrain();
  346. }
  347. break;
  348. case "UrlTemplateImageryProvider": //加载URL模板服务
  349. if (checked) {
  350. //设置参数
  351. let _options = {
  352. id: _serviceId,
  353. url: data.datasource,
  354. alpha: _opacity
  355. }
  356. if (parameterset) {
  357. if (parameterset.CRS) { //坐标系
  358. _options.CRS = parameterset.CRS;
  359. }
  360. if (parameterset.minimumLevel) { //最小层级
  361. _options.minimumLevel = parameterset.minimumLevel;
  362. }
  363. if (parameterset.maximumLevel) { //最大层级
  364. _options.maximumLevel = parameterset.maximumLevel;
  365. }
  366. }
  367. //加载服务
  368. jt3dLeft.layer.addUrlTemplateImagery(_options, function(serviceId) {
  369. //重置图层顺序
  370. _self.setLayerNumber(serviceId)
  371. if (layertype === '标注') {
  372. var imageryLayers = jt3dLeft._viewer.imageryLayers;
  373. imageryLayers.raiseToTop(window[serviceId]);
  374. }
  375. });
  376. } else {
  377. let removeLayer = jt3dLeft.layer.removeImageryProvider({
  378. serviceId: _serviceId
  379. });
  380. removeLayer.then(function() {
  381. console.log('成功移除')
  382. });
  383. }
  384. break;
  385. case "WebMapTileServiceImageryProvider": // WMTS地图服务
  386. if (checked) {
  387. //设置参数
  388. let _options = {
  389. id: _serviceId,
  390. url: data.datasource,
  391. layers: 'cia',
  392. style: 'default',
  393. tileMatrixSetID: 'w',
  394. alpha: _opacity
  395. }
  396. if (parameterset) {
  397. if (parameterset.layers) { //WMTS请求的层名
  398. _options.layers = parameterset.layers;
  399. if (parameterset.style) { //WMTS请求的样式名
  400. _options.style = parameterset.style;
  401. if (parameterset.tileMatrixSetID) { //用于WMTS请求的TileMatrixSet的标识符
  402. _options.tileMatrixSetID = parameterset.tileMatrixSetID;
  403. if (parameterset.tileMatrixLabels) { //TileMatrix中用于WMTS请求的标识符列表,每个TileMatrix级别一个标识符。
  404. _options.tileMatrixLabels = parameterset.tileMatrixLabels;
  405. }
  406. if (parameterset.minimumLevel) { //最小层级
  407. _options.minimumLevel = parameterset.minimumLevel;
  408. }
  409. if (parameterset.maximumLevel) { //最大层级
  410. _options.maximumLevel = parameterset.maximumLevel;
  411. }
  412. jt3dLeft.layer.addWebMapTileService(_options, function(serviceId) {
  413. //重置图层顺序
  414. _self.setLayerNumber(serviceId)
  415. if (layertype === '标注') {
  416. var imageryLayers = jt3dLeft._viewer.imageryLayers;
  417. imageryLayers.raiseToTop(window[serviceId]);
  418. }
  419. });
  420. } else {
  421. ElMessage("请检测图层表parameterset字段是否设置tileMatrixSetID");
  422. }
  423. } else {
  424. ElMessage("请检测图层表parameterset字段是否设置style");
  425. }
  426. } else {
  427. ElMessage("请检测图层表parameterset字段是否设置layers");
  428. }
  429. } else {
  430. ElMessage("请检测图层表parameterset字段是否设置layers,style,tileMatrixSetID");
  431. }
  432. } else {
  433. jt3dLeft.layer.removeImageryProvider({
  434. serviceId: _serviceId
  435. });
  436. }
  437. break;
  438. case "WebMapServiceImageryProvider": //WMS地图服务
  439. if (checked) {
  440. //设置参数
  441. let _options = {
  442. id: _serviceId,
  443. url: data.datasource,
  444. layers: "SDYTMP:map_zrzy_water_polylon",
  445. alpha: _opacity
  446. }
  447. if (parameterset) {
  448. if (parameterset.layers) { //WMTS请求的层名
  449. _options.layers = parameterset.layers;
  450. if (parameterset.minimumLevel) { //最小层级
  451. _options.minimumLevel = parameterset.minimumLevel;
  452. }
  453. if (parameterset.maximumLevel) { //最大层级
  454. _options.maximumLevel = parameterset.maximumLevel;
  455. }
  456. jt3dLeft.layer.addWebMapService(_options, function(serviceId) {
  457. //重置图层顺序
  458. _self.setLayerNumber(serviceId)
  459. if (layertype === '标注') {
  460. var imageryLayers = jt3dLeft._viewer.imageryLayers;
  461. imageryLayers.raiseToTop(window[serviceId]);
  462. }
  463. });
  464. } else {
  465. ElMessage("请检测图层表parameterset字段是否设置layers");
  466. }
  467. } else {
  468. ElMessage("请检测图层表parameterset字段是否设置layers");
  469. }
  470. } else {
  471. jt3dLeft.layer.removeImageryProvider({
  472. serviceId: _serviceId
  473. });
  474. }
  475. break;
  476. case "ArcGisMapServerImageryProvider": // ArcGIS Online和Server的相关服务
  477. if (checked) {
  478. //设置参数
  479. let _options = {
  480. id: _serviceId,
  481. url: data.datasource,
  482. alpha: _opacity
  483. }
  484. if (parameterset) {
  485. if (parameterset.layers) {
  486. _options.layers = parameterset.layers;
  487. }
  488. }
  489. //加载服务
  490. jt3dLeft.layer.addArcGisMapServer(_options, function(serviceId) {
  491. //重置图层顺序
  492. _self.setLayerNumber(serviceId)
  493. if (layertype === '标注') {
  494. var imageryLayers = jt3dLeft._viewer.imageryLayers;
  495. imageryLayers.raiseToTop(window[serviceId]);
  496. }
  497. })
  498. } else {
  499. jt3dLeft.layer.removeImageryProvider({
  500. serviceId: _serviceId
  501. });
  502. }
  503. break;
  504. case "TileMapServiceImageryProvider": // 2.5维度地图
  505. if (checked) {
  506. //设置参数
  507. let _options = {
  508. id: _serviceId,
  509. url: data.datasource,
  510. alpha: _opacity
  511. }
  512. if (parameterset) {
  513. if (parameterset.minimumLevel) { //最小层级
  514. _options.minimumLevel = parameterset.minimumLevel;
  515. }
  516. if (parameterset.maximumLevel) { //最大层级
  517. _options.maximumLevel = parameterset.maximumLevel;
  518. }
  519. }
  520. jt3dLeft.layer.addTileMapServiceImagery(_options, function(serviceId) {
  521. //重置图层顺序
  522. _self.setLayerNumber(serviceId)
  523. if (layertype === '标注') {
  524. var imageryLayers = jt3dLeft._viewer.imageryLayers;
  525. imageryLayers.raiseToTop(window[serviceId]);
  526. }
  527. });
  528. } else {
  529. jt3dLeft.layer.removeImageryProvider({
  530. serviceId: _serviceId
  531. });
  532. }
  533. break;
  534. case "Cesium3DTileset": //加载3DTileset地图服务--实景
  535. let datasource = data.datasource.split("#")
  536. console.log('datasource', datasource)
  537. if (checked) {
  538. //加载实景
  539. datasource.forEach((res, index) => {
  540. //设置参数
  541. let _options = {
  542. id: _serviceId + index,
  543. url: res,
  544. }
  545. if (parameterset) {
  546. if (parameterset.height) {
  547. _options.height = parameterset.height;
  548. }
  549. if (parameterset.alpha) {
  550. _options.alpha = parameterset.alpha;
  551. }
  552. }
  553. jt3dLeft.layer.addCesium3DTileset(_options, function(serviceId) {
  554. window[_serviceId + index] = window[serviceId];
  555. });
  556. })
  557. } else {
  558. datasource.forEach((res, index) => {
  559. jt3dLeft.layer.removeScenePrimitives({
  560. serviceId: _serviceId + index
  561. });
  562. })
  563. }
  564. break;
  565. case "Cesium3DTileset_BM": //加载3DTileset地图服务--白膜
  566. if (checked) {
  567. //设置参数
  568. let _options = {
  569. id: _serviceId,
  570. url: data.datasource,
  571. }
  572. if (parameterset) {
  573. if (parameterset.color) {
  574. _options.color = parameterset.color;
  575. }
  576. }
  577. //加载白膜
  578. jt3dLeft.layer.addCesium3DTilesetBm(_options, function(serviceId) {
  579. jt3dLeft.layer.set3DTileBMStyle(_options);
  580. });
  581. } else {
  582. jt3dLeft.layer.removeScenePrimitives({
  583. serviceId: _serviceId
  584. });
  585. }
  586. break;
  587. default:
  588. break;
  589. }
  590. })
  591. },
  592. /**
  593. * el-slider 值改变时触发(使用鼠标拖曳时,只在松开鼠标后触发)
  594. * 地图服务的透明度调整
  595. */
  596. handleSliderChange($event, data) {
  597. let _serviceId = "serviceLeft_" + data.layercode + data.layerorder;
  598. if (data.loadtype === "Cesium3DTileset") {
  599. let datasource = data.datasource.split("#")
  600. datasource.forEach((res, index) => {
  601. //设置实景透明度
  602. jt3d.layer.set3DTileStyle({
  603. serviceId: _serviceId + index,
  604. alpha: $event,
  605. });
  606. })
  607. } else if (data.loadtype === "CrImageServerLayer") {
  608. let floatLayer = window[_serviceId];
  609. floatLayer.setOpacity($event)
  610. } else if (data.loadtype === "PolygonImageMaterial") {
  611. //设置透明度
  612. jt3dLeft.layer.setPolygonImageMaterial({
  613. serviceId: _serviceId,
  614. alpha: $event,
  615. });
  616. } else if (data.loadtype === "entitiesGltf") {
  617. //设置透明度
  618. jt3dLeft.layer.setModelStyle({
  619. serviceId: _serviceId,
  620. alpha: $event,
  621. });
  622. } else {
  623. jt3dLeft.layer.setLayersStyle({
  624. serviceId: _serviceId,
  625. alpha: $event,
  626. });
  627. }
  628. },
  629. /**
  630. * el-checkbox 当绑定值变化时触发的事件
  631. * @param {Object} checked 复选框状态
  632. * @param {Object} data 对应于节点点击的节点对象
  633. * @param {Object} node TreeNode 的 node 属性
  634. */
  635. handleCheckBoxChange(checked, data, node) {
  636. let _node = this.$refs.treeRef.getNode(data);
  637. if (_node.isLeaf) {
  638. this.$refs.treeRef.setChecked(_node,
  639. checked); //是否设置子节点,默认为false,利用tree组件渲染后带有的isLeaf(是否为叶子节点)属性,如果为叶子节点就选中。利用tree的API就实现了正确的回显效果
  640. }
  641. //控制子节点
  642. this.childNodesChange(node, checked);
  643. },
  644. /**
  645. * 控制子节点
  646. * @param {Object} node
  647. * @param {Object} checked
  648. */
  649. childNodesChange(node, checked) {
  650. let _self = this;
  651. node.childNodes.forEach(item => {
  652. _self.$refs.treeRef.setChecked(item, checked);
  653. _self.childNodesChange(item, checked);
  654. });
  655. },
  656. /**
  657. * 初始化复选框选中状态
  658. * @param {Object} datas
  659. */
  660. setNodesChecked(datas) {
  661. let _self = this;
  662. datas.forEach((data, index) => {
  663. _self.$nextTick(() => {
  664. var node = _self.$refs.treeRef.getNode(data);
  665. //node.isLeaf是否是叶子节点
  666. if (node.isLeaf) {
  667. let checked = false;
  668. if (data.isinit === '1') {
  669. checked = true;
  670. }
  671. data.opacity = Number(data.opacity)
  672. _self.$refs.treeRef.setChecked(node, checked);
  673. }
  674. });
  675. if (data.children != undefined) {
  676. _self.setNodesChecked(data.children);
  677. }
  678. });
  679. },
  680. /**
  681. * 设置图层顺序
  682. * @param {Object} options
  683. */
  684. setLayerNumber(serviceId) {
  685. // let layerList = jt3dLeft._viewer.imageryLayers._layers
  686. var imageryLayers = jt3dLeft._viewer.imageryLayers;
  687. if (store.markID) {
  688. console.log('标注id', store.markID)
  689. imageryLayers.raiseToTop(window[store.markID]); //标注层置顶
  690. }
  691. imageryLayers.lowerToBottom(window[serviceId]); //设置图层初始顺序
  692. imageryLayers.raise(window[serviceId]);
  693. imageryLayers.raise(window[serviceId]);
  694. this.inittree.forEach(res => {
  695. if (res.layercode && res.layerorder) {
  696. let id = "service_" + res.layercode + res.layerorder
  697. let startid = Number(res.layercode + res.layerorder)
  698. let strid = Number(serviceId.substring(8))
  699. if (imageryLayers.contains(window[id])) {
  700. if (startid < strid) {
  701. imageryLayers.raise(window[serviceId])
  702. } else {
  703. // imageryLayers.raiseToTop(window[store.markID]);
  704. // break;
  705. }
  706. }
  707. }
  708. })
  709. },
  710. /**
  711. * 分屏对比初始化
  712. */
  713. initSplitScreen() {
  714. let _self = this;
  715. //这样做会跑偏
  716. // let cesiumContainerDiv = document.getElementById("cesiumContainer2");
  717. // if (cesiumContainerDiv == null) {
  718. // cesiumContainerDiv = document.createElement('div');
  719. // cesiumContainerDiv.id = "cesiumContainer2";
  720. // cesiumContainerDiv.classList.add("ViewerSplitScreen");
  721. // cesiumContainerDiv.style.float = "left";
  722. // cesiumContainerDiv.style.width = "calc(50% - 1rem)";
  723. // cesiumContainerDiv.style.height = "100vh";
  724. // cesiumContainerDiv.style.margin = "0";
  725. // cesiumContainerDiv.style.borderRight = "2rem solid red";
  726. // /* 加入到页面 */
  727. // document.body.appendChild(cesiumContainerDiv);
  728. // }
  729. let mapView1 = document.getElementById("cesiumContainer");
  730. let mapView2 = document.getElementById("cesiumContainer2");
  731. mapView1.className = "ViewerSplitScreen";
  732. mapView2.style.display = "block";
  733. //加载分屏左侧大球
  734. this.initMap3d();
  735. //同步相机状态
  736. this.syncViewer();
  737. //绑定图层控制
  738. this.initTree();
  739. },
  740. /**
  741. * 移除分屏对比
  742. */
  743. removeSplitScreen() {
  744. let mapView1 = document.getElementById("cesiumContainer");
  745. let mapView2 = document.getElementById("cesiumContainer2");
  746. mapView1.className = "jt-map";
  747. mapView2.style.display = "none";
  748. mapView2.innerHTML = "";
  749. if (jt3dLeft) {
  750. jt3dLeft._viewer.entities.removeAll(); // 删除全部
  751. jt3dLeft._viewer.imageryLayers.removeAll();
  752. jt3dLeft._viewer.scene.primitives.removeAll(); //谨慎使用,可能删除不必要的primitive
  753. // jt3dLeft._viewer.destroy();
  754. jt3dLeft = undefined;
  755. }
  756. },
  757. /**
  758. * 加载分屏左侧大球
  759. */
  760. initMap3d() {
  761. jt3dLeft = new this.jt3dSDK.jtMap3d({
  762. container: "cesiumContainer2",
  763. });
  764. //底部工具
  765. jt3dLeft.statusBar.show = true;
  766. //图层
  767. jt3dLeft.layer = new this.jt3dSDK.layer(jt3dLeft._viewer);
  768. //测量工具
  769. jt3dLeft.CommonTools = new this.jt3dSDK.CommonTools(jt3dLeft._viewer);
  770. //绘图工具
  771. jt3dLeft.SketchViewModel = new this.jt3dSDK.SketchViewModel(jt3dLeft._viewer, {
  772. isClear: false,
  773. isDrawPoint: true,
  774. isRetainDrawPoint: true,
  775. iconType: 'blue',
  776. });
  777. //定位工具
  778. jt3dLeft.LocateUtil = new this.jt3dSDK.LocateUtil(jt3dLeft._viewer);
  779. //二三维标绘
  780. jt3dLeft.DrawTools = new this.jt3dSDK.DrawTools(jt3dLeft._viewer);
  781. //军事标绘
  782. jt3dLeft.DrawMilitaryPlot = new this.jt3dSDK.DrawMilitaryPlot(jt3dLeft._viewer);
  783. //天空盒子
  784. jt3dLeft.SceneEffects = {};
  785. jt3dLeft.SceneEffects.SkyBox = new this.jt3dSDK.SceneEffects.SkyBox(jt3dLeft._viewer);
  786. //线对象
  787. jt3dLeft.PolylineObject = new this.jt3dSDK.PolylineObject(jt3dLeft._viewer);
  788. //比例尺、指南针
  789. this.$parent.$parent.$refs.queryword.initNavigation(jt3dLeft);
  790. //设置默认视图
  791. this.$parent.$parent.$refs.refMap3d.setView(jt3dLeft);
  792. // 初始化项目区域范围视角
  793. this.$parent.$parent.$refs.refMap3d.fullMap(jt3dLeft);
  794. //加载天空盒子
  795. this.$parent.$parent.$refs.refMap3d.addSkybox(jt3dLeft);
  796. //添加镇街边界线——精灵线
  797. this.$parent.$parent.$refs.refMap3d.addBoundaryLine(jt3dLeft);
  798. },
  799. /**
  800. * 同步相机状态
  801. */
  802. syncViewer() {
  803. let _self = this;
  804. let viewerL = jt3dLeft._viewer;
  805. let viewerR = jt3dRight._viewer;
  806. var sceneL = viewerL.scene;
  807. var sceneR = viewerR.scene;
  808. var handlerL = new Cesium.ScreenSpaceEventHandler(sceneL.canvas);
  809. var ellipsoidL = sceneL.globe.ellipsoid;
  810. var handlerR = new Cesium.ScreenSpaceEventHandler(sceneR.canvas);
  811. var ellipsoidR = sceneR.globe.ellipsoid;
  812. handlerL.setInputAction((movement) => {
  813. this.isLeftTrigger = true;
  814. this.isRightTrigger = false;
  815. }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
  816. handlerR.setInputAction((movement) => {
  817. this.isLeftTrigger = false;
  818. this.isRightTrigger = true;
  819. }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
  820. var syncViewerL = function() {
  821. if (_self.isLeftTrigger) {
  822. viewerR.camera.flyTo({
  823. destination: viewerL.camera.position,
  824. orientation: {
  825. heading: viewerL.camera.heading,
  826. pitch: viewerL.camera.pitch,
  827. roll: viewerL.camera.roll
  828. },
  829. duration: 0.0
  830. });
  831. }
  832. }
  833. viewerR.camera.changed.addEventListener(syncViewerL);
  834. viewerR.scene.preRender.addEventListener(syncViewerL);
  835. var syncViewerR = function() {
  836. if (_self.isRightTrigger) {
  837. viewerL.camera.flyTo({
  838. destination: viewerR.camera.position,
  839. orientation: {
  840. heading: viewerR.camera.heading,
  841. pitch: viewerR.camera.pitch,
  842. roll: viewerR.camera.roll
  843. },
  844. duration: 0.0
  845. });
  846. }
  847. }
  848. viewerR.camera.changed.addEventListener(syncViewerR);
  849. viewerR.scene.preRender.addEventListener(syncViewerR);
  850. },
  851. /**
  852. * 加载图层控制树
  853. */
  854. initTree() {
  855. //在这获取图层列表
  856. let _this = this
  857. //权限查询条件语句
  858. let atlasLayersSqlWhere = undefined
  859. //获取地图图集id
  860. let roleId = store.roleId
  861. atlasLayersSqlWhere = '"roleid"' + " = " + roleId + " "
  862. //Promise回调
  863. function init(data) {
  864. return new Promise((resolve, reject) => {
  865. _this.inittree.forEach(res => {
  866. let num = Number(res.layerorder)
  867. if (num < 10) {
  868. res.layerorder = '0' + res.layerorder
  869. }
  870. //显示2级
  871. if (res.parentid === null) {
  872. _this.expandedKeys.push(res.id);
  873. }
  874. //其它级别展开
  875. if (res.isExpand === '1') {
  876. _this.expandedKeys.push(res.id);
  877. }
  878. })
  879. _this.treeData = deepTree(_this.inittree)
  880. resolve(_this.treeData)
  881. })
  882. }
  883. //获取图集
  884. this.$http.get('/getTableList', {
  885. tableName: 'sys_map_atlas_layers', //表名
  886. sqlWhere: atlasLayersSqlWhere, //
  887. orderByField: ''
  888. }).then(res => {
  889. console.log('所有图层', res.data)
  890. //初始图层列表
  891. this.inittree = res.data
  892. init(res.data).then(item => {
  893. //图层初始化打开状态
  894. _this.setNodesChecked(item);
  895. console.log('图层控制树列表', _this.treeData)
  896. })
  897. })
  898. }
  899. },
  900. mounted() {
  901. },
  902. };
  903. </script>
  904. <style lang="scss">
  905. .el-switch--small .el-switch__core .el-switch__action{
  906. width: 12rem;
  907. height: 12rem;
  908. }
  909. .el-switch--small.is-checked .el-switch__core .el-switch__action{
  910. margin-left: calc(-1rem - 12rem);
  911. }
  912. .el-switch__core .el-switch__action{
  913. top:0;
  914. }
  915. .el-slider__button{
  916. width: 20rem;
  917. height: 20rem;
  918. }
  919. .el-tree-node__content{
  920. height: 26rem;
  921. }
  922. .el-switch--small .el-switch__core{
  923. height: 16rem;
  924. }
  925. .el-switch--small{
  926. padding: 0 5rem;
  927. }
  928. .jt-layer {
  929. padding-left: 10rem;
  930. .el-tree {
  931. background: none;
  932. color: #fff;
  933. --el-tree-node-hover-bg-color: #2a67c3;
  934. .overflowtext {
  935. width: auto !important;
  936. padding: 0;
  937. }
  938. }
  939. .tree-line {
  940. .el-tree-node {
  941. position: relative;
  942. // padding-left: 16rem; // 缩进量
  943. }
  944. .el-tree-node__children {
  945. padding-left: 16rem !important; // 缩进量
  946. .el-tree-node__content {
  947. padding-left: 18rem !important;
  948. }
  949. }
  950. // 竖线
  951. .el-tree-node::before {
  952. content: "";
  953. height: 100%;
  954. width: 1rem;
  955. position: absolute;
  956. left: -3rem;
  957. top: -26rem;
  958. border-width: 1rem;
  959. border-left: 1rem dashed rgba(255, 255, 255, .8);
  960. }
  961. // 当前层最后一个节点的竖线高度固定
  962. .el-tree-node:last-child::before {
  963. height: 38rem; // 可以自己调节到合适数值
  964. }
  965. // 横线
  966. .el-tree-node::after {
  967. content: "";
  968. width: 24rem;
  969. height: 20rem;
  970. position: absolute;
  971. left: -3rem;
  972. top: 12rem;
  973. border-width: 1rem;
  974. border-top: 1rem dashed rgba(255, 255, 255, .8);
  975. }
  976. // 去掉最顶层的虚线,放最下面样式才不会被上面的覆盖了
  977. &>.el-tree-node::after {
  978. border-top: none;
  979. }
  980. &>.el-tree-node::before {
  981. border-left: none;
  982. }
  983. // 展开关闭的icon
  984. .el-tree-node__expand-icon {
  985. font-size: 16rem;
  986. // 叶子节点(无子节点)
  987. &.is-leaf {
  988. color: transparent;
  989. display: none; // 也可以去掉
  990. }
  991. }
  992. }
  993. }
  994. </style>