ProjectMap.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. <template>
  2. <div class="ProjectMap" id="ProjectMap" v-if="show">
  3. <ComInfoBox />
  4. </div>
  5. </template>
  6. <script>
  7. import Vue from 'vue'
  8. import ComInfoBox from '@/views/groupPage/components/ComInfoBox.vue'
  9. import monitorTree from '@/views/groupPage/districtPageModules/customTools/monitorTree.vue'
  10. import pbsTree from '@/views/groupPage/districtPageModules/customTools/pbsTree.vue'
  11. import trailJson from './mapJson/TF_PC_PSYS_GHPIPE_B.json'
  12. import { PolylineTrailLinkMaterialProperty } from '@/views/groupPage/util'
  13. const layer_lx = [
  14. {
  15. layerName: 'NETWORK_SJ_PSWS_Node@sxgk#1',
  16. sceneName: 'hnyy_sj_lx',
  17. key: 'geometry',
  18. value: 'lxfxfw'
  19. },
  20. {
  21. layerName: 'NETWORK_SJ_PSWS@sxgk#1',
  22. sceneName: 'hnyy_sj_lx',
  23. key: 'geometry',
  24. value: 'lxfxfw'
  25. },
  26. {
  27. layerName: 'NETWORK_SJ_PSYS_Node@sxgk#1',
  28. sceneName: 'hnyy_sj_lx',
  29. key: 'geometry',
  30. value: 'lxfxfw'
  31. },
  32. {
  33. layerName: 'NETWORK_SJ_PSYS@sxgk#1',
  34. sceneName: 'hnyy_sj_lx',
  35. key: 'geometry',
  36. value: 'lxfxfw'
  37. },
  38. {
  39. layerName: 'NETWORK_SJ_PSHS_Node@sxgk#1',
  40. sceneName: 'hnyy_sj_lx',
  41. key: 'geometry',
  42. value: 'lxfxfw'
  43. },
  44. {
  45. layerName: 'NETWORK_SJ_PSHS@sxgk#1',
  46. sceneName: 'hnyy_sj_lx',
  47. key: 'geometry',
  48. value: 'lxfxfw'
  49. }
  50. ]
  51. const gLayerList = [
  52. 'NETWORK_SJ_PSWS@sxgk#1',
  53. 'NETWORK_SJ_PSYS@sxgk#1',
  54. 'NETWORK_SJ_PSWS_Node@sxgk#1',
  55. 'NETWORK_SJ_PSYS_Node@sxgk#1',
  56. 'TF_SJ_PSYS_JG_B_3D@sxgk#1',
  57. 'TF_SJ_PSYS_JG_B_3D@sxgk#2',
  58. 'TF_SJ_PSWS_JG_B_3D@sxgk#2',
  59. 'TF_SJ_PSWS_JG_B_3D@sxgk#1'
  60. ]
  61. export default {
  62. name: 'ProjectMap', //三维底图
  63. components: {
  64. ComInfoBox
  65. },
  66. props: {
  67. show: {}
  68. },
  69. data() {
  70. return {
  71. baselayer: [],
  72. baseScene: 'scenes',
  73. baseTerrain: 'terrain',
  74. terrain: 'dixing',
  75. mapService: ['img', 'theme'],
  76. //
  77. monitorTreeInfo: null
  78. }
  79. },
  80. watch: {
  81. show(val) {
  82. if (val) {
  83. this.$nextTick(() => {
  84. this.initData().then((result) => {
  85. this.addToMap()
  86. })
  87. })
  88. } else {
  89. this.resetData()
  90. }
  91. }
  92. },
  93. computed: {
  94. mapConfig() {
  95. return this.$store.state.bigScreen.mapConfig
  96. }
  97. },
  98. methods: {
  99. initData() {
  100. return this.$store.dispatch('bigScreen/initGISResource')
  101. },
  102. //加载地图
  103. addToMap() {
  104. var viewer = new Cesium.Viewer('ProjectMap', {
  105. navigation: false,
  106. contextOptions: {
  107. webgl: {
  108. alpha: false,
  109. depth: true,
  110. stencil: true,
  111. antialias: true,
  112. premultipliedAlpha: true,
  113. preserveDrawingBuffer: true, //通过canvas.toDataURL()实现截图需要将该项设置为true
  114. failIfMajorPerformanceCaveat: false
  115. },
  116. allowTextureFilterAnisotropic: true
  117. },
  118. // skyAtmosphere: false,
  119. timeline: false,
  120. animation: false,
  121. infoBox: false,
  122. selectionIndicator: false //设置绿色框框不可见
  123. })
  124. this.viewer = viewer
  125. window.viewer = viewer
  126. this.$store.state.bigScreen.isInitViewer = true
  127. this.$store.state.bigScreen.mapContainerId = 'ProjectMap'
  128. //去掉logo
  129. viewer._cesiumWidget._creditContainer.style.display = 'none'
  130. //地图配置
  131. this.sceneSetting(viewer)
  132. this.addRoad()
  133. this.addTrail()
  134. this.initBaseMap()
  135. //当前项目位置
  136. const initPosition = this.mapConfig.initPosition
  137. const carto = Cesium.Cartographic.fromDegrees(
  138. parseFloat(initPosition.lon),
  139. parseFloat(initPosition.lat),
  140. parseFloat(initPosition.height)
  141. )
  142. const cartes3 = Cesium.Cartographic.toCartesian(carto)
  143. const camera = cartes3
  144. viewer.camera.setView({
  145. //倾斜设置
  146. //new Cesium.Cartesian3(camera.x, camera.y, camera.z)
  147. destination: { x: -2002099.8064685483, y: 5125053.48587751, z: 3240386.7848629407 },
  148. orientation: {
  149. heading: 6.241173904929705,
  150. pitch: -0.3248275425737035,
  151. roll: 6.283185307179586
  152. // heading: 0,
  153. // pitch: Cesium.Math.toRadians(-90),
  154. // roll: 0
  155. }
  156. })
  157. this.addInitScene()
  158. this.addTerrain()
  159. this.initModulesContentShow()
  160. },
  161. addRoad() {
  162. let viewer = this.viewer
  163. let promise = Cesium.GeoJsonDataSource.load(trailJson, {
  164. clampToGround: true //贴地设置
  165. }) //geojson面数据
  166. promise.then(function (dataSource) {
  167. viewer.dataSources.add(dataSource)
  168. var entities = dataSource.entities.values
  169. for (var o = 0; o < entities.length; o++) {
  170. var r = entities[o]
  171. r.polyline.width = 10 //添加默认样式
  172. ;(r.polyline.material = new Cesium.PolylineGlowMaterialProperty({
  173. glowPower: 0.1, //一个数字属性,指定发光强度,占总线宽的百分比。
  174. color: Cesium.Color.DARKBLUE.withAlpha(0.5)
  175. })),
  176. 10
  177. }
  178. })
  179. },
  180. //添加尾迹线
  181. addTrail() {
  182. let viewer = this.viewer
  183. let trailLineColor = null
  184. trailLineColor = new Cesium.Color(0, 2.88, 23.9, 1.0) //初始化尾迹线颜色
  185. Cesium.Math.setRandomNumberSeed(0) //设置随机数种子
  186. let promise2 = Cesium.GeoJsonDataSource.load(trailJson, {
  187. clampToGround: true //贴地设置
  188. }) //geojson面数据
  189. promise2.then(function (dataSource) {
  190. viewer.dataSources.add(dataSource)
  191. var entities = dataSource.entities.values
  192. for (var o = 0; o < entities.length; o++) {
  193. var r = entities[o]
  194. r.polyline.width = 4 //添加默认样式
  195. r.polyline.material = new PolylineTrailLinkMaterialProperty(
  196. trailLineColor,
  197. require('@/views/groupPage/images/trail.png'),
  198. 2000
  199. )
  200. }
  201. })
  202. },
  203. //场景设置
  204. sceneSetting(viewer) {
  205. var scene = viewer.scene
  206. // //开启泛光
  207. // viewer.scene.bloomEffect.show = true
  208. // scene.bloomEffect.threshold = '1'
  209. // scene.bloomEffect.bloomIntensity = '0.3'
  210. // // 开启hdr
  211. // scene.hdrEnabled = true
  212. // //开启抗锯齿
  213. // scene.postProcessStages.fxaa.enabled = true
  214. // //显示天空
  215. // scene.skyBox.show = false
  216. // // scene.shadowMap.darkness = 1.275 //设置第二重烘焙纹理的效果(明暗程度)
  217. // scene.sun.show = true //关闭太阳
  218. // scene.fog.enabled = false //关闭雾气
  219. // //隐藏大气圈
  220. // scene.skyAtmosphere.show = false
  221. //地形深度测试
  222. scene.globe.depthTestAgainstTerrain = true
  223. // //当 Cesium 单个模型过长时,会遇到某些视角模型显示不完整的问题
  224. // // scene.logarithmicDepthBuffer = false;
  225. // //高动态范围渲染
  226. // scene.highDynamicRange = true
  227. // //关闭灯光
  228. // this.viewer.scene.globe.enableLighting = false
  229. // //globeAlpha导致月球始终可见
  230. // this.viewer.scene.moon.show = false
  231. // //地球表面双面显示
  232. // this.viewer.scene.globe.backFaceCulling = false
  233. // //开启地下模式
  234. // this.viewer.scene.undergroundMode = true
  235. // this.viewer.scene.screenSpaceCameraController.minimumZoomDistance = -1000
  236. // this.viewer.terrainProvider.isCreateSkirt = false //关闭地形裙边
  237. // //设置地球表面颜色
  238. // this.viewer.scene.globe.baseColor = new Cesium.Color(0, 0, 0, 1)
  239. //帧率工具
  240. this.viewer.scene.debugShowFramesPerSecond = false
  241. const nowDate = new Date(Date.now())
  242. nowDate.setHours(16) //设置系统时间为12点,时差12小时
  243. nowDate.setMinutes(0)
  244. this.viewer.clock.currentTime = Cesium.JulianDate.fromDate(nowDate)
  245. this.viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK)
  246. },
  247. //地图服务配置
  248. baseMapConfig() {
  249. const source = this.mapConfig.gisResource
  250. const mapList = this.mapService
  251. const baseLayer = []
  252. for (let name in source) {
  253. if (mapList.indexOf(name) > -1) {
  254. const config = source[name].config
  255. for (let key in config) {
  256. const item = config[key]
  257. baseLayer.push({
  258. name: key,
  259. type: name,
  260. show: item.isDisplay === '0' ? false : true
  261. })
  262. }
  263. }
  264. }
  265. this.baselayer = baseLayer
  266. },
  267. //初始化基础底图
  268. initBaseMap() {
  269. this.baseMapConfig()
  270. let layerInfo = this.baselayer
  271. layerInfo.forEach((item) => {
  272. if (item.show) {
  273. const gisItem = this.mapConfig.gisResource[item.type].config[item.name]
  274. if (!gisItem) {
  275. return true
  276. }
  277. const url = gisItem.url
  278. if (this.mapService.indexOf(item.type) > -1) {
  279. this.viewer.imageryLayers.addImageryProvider(
  280. new Cesium.SuperMapImageryProvider({
  281. url: url,
  282. credit: item.name
  283. })
  284. )
  285. } else if ((item.type = 'mvt')) {
  286. this.viewer.scene.addVectorTilesMap({
  287. url: url,
  288. name: item.name
  289. })
  290. }
  291. }
  292. })
  293. },
  294. //加载初始化场景
  295. addInitScene() {
  296. var scenes = this.mapConfig.gisResource[this.baseScene]
  297. if (scenes && scenes.config) {
  298. this.scenesIndex = 0
  299. Object.keys(scenes.config).forEach(
  300. function (keyName, index) {
  301. const item = scenes.config[keyName]
  302. var promise = this.viewer.scene.open(item.url, undefined, {
  303. autoSetView: false
  304. })
  305. Cesium.when(
  306. promise,
  307. function (layers) {
  308. this.scenesIndex += 1
  309. this.addPipeDirection()
  310. for (var i = 0; i < layers.length; i++) {
  311. var ly = layers[i]
  312. ly.selectEnabled = true
  313. ly.clearMemoryImmediately = false
  314. ly.cullEnabled = false
  315. //ly.lodRangeScale=0.01
  316. if (ly.name === 'TF_PAPN_BUILD@sxgk_base') {
  317. ly.visible = false
  318. }
  319. ly.refresh()
  320. }
  321. // if (!this.AppX.runtimeConfig.activeView.scene.pickPositionSupported) {
  322. // console.error('不支持深度纹理,无法拾取位置!')
  323. // }
  324. }.bind(this),
  325. function (e) {
  326. console.error('加载SCP失败,请检查网络连接状态或者url地址是否正确?')
  327. }
  328. )
  329. }.bind(this)
  330. )
  331. }
  332. // setTimeout(() => {
  333. // this.defaultUpdepth()
  334. // }, 5000)
  335. },
  336. //地形加载
  337. addTerrain() {
  338. var viewer = this.viewer
  339. var configItem = this.mapConfig.gisResource[this.baseTerrain]
  340. var type = configItem.type
  341. var url = configItem.config[this.terrain].url
  342. var layerTitle = configItem.config[this.terrain].name
  343. switch (type) {
  344. case 'ext_terrain':
  345. viewer.terrainProvider = new Cesium.CesiumTerrainProvider({
  346. url: url,
  347. requestWaterMask: true,
  348. requestVertexNormals: true,
  349. credit: layerTitle
  350. })
  351. viewer.terrainProvider.isCreateSkirt = false //关闭地表透明后出现的网格
  352. break
  353. case 'terrain':
  354. viewer.terrainProvider = new Cesium.CesiumTerrainProvider({
  355. url: url,
  356. requestWaterMask: true,
  357. requestVertexNormals: true,
  358. credit: layerTitle,
  359. isSct: true
  360. })
  361. viewer.terrainProvider.isCreateSkirt = false //关闭地表透明后出现的网格
  362. break
  363. }
  364. },
  365. //初始化流向显示
  366. addPipeDirection() {
  367. const layers = window.viewer.scene.layers
  368. //打开流向
  369. layer_lx.forEach((item) => {
  370. if (layers.find(item.layerName)) {
  371. window.viewer.scene.layers.remove(item.layerName, true)
  372. let lxUrl = this.mapConfig.gisResource.scenes.config['gcgdcj'].url
  373. //lxUrl场景地址;sceneName场景名称;layerName场景中图层的名称
  374. const promise = window.viewer.scene.addLayerService(lxUrl, item.sceneName, item.layerName)
  375. promise.then((layer) => {
  376. layer.textureUVSpeed = new Cesium.Cartesian2(-1.0, 0)
  377. })
  378. }
  379. })
  380. },
  381. //默认抬升
  382. defaultUpdepth() {
  383. const layers = window.viewer.scene.layers
  384. //默认抬升
  385. const style3D = new Cesium.Style3D()
  386. style3D.altitudeMode = 0
  387. style3D.bottomAltitude = this.mapConfig.downDepth
  388. gLayerList.forEach((item) => {
  389. var layer = layers.find(item)
  390. if (layer) {
  391. layer.style3D = style3D
  392. layer.refresh()
  393. }
  394. })
  395. },
  396. //初始化显示模块内容
  397. initModulesContentShow() {
  398. const monitorTreeConstructor = Vue.extend(monitorTree)
  399. this.monitorTreeInfo = new monitorTreeConstructor({
  400. store: this.$store
  401. }).$mount()
  402. //
  403. const pbsTreeConstructor = Vue.extend(pbsTree)
  404. const pbsTreeInfo = new pbsTreeConstructor({
  405. store: this.$store
  406. }).$mount()
  407. pbsTreeInfo.externalInit()
  408. },
  409. resetData() {
  410. window.viewer = null
  411. this.$store.state.bigScreen.isInitViewer = false
  412. this.monitorTreeInfo.clearDataSource()
  413. }
  414. }
  415. }
  416. </script>
  417. <style lang='scss' scoped>
  418. .ProjectMap {
  419. width: 100%;
  420. height: 100%;
  421. position: relative;
  422. background: #000;
  423. }
  424. </style>