ViewerSplitScreen.vue 31 KB

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