ProjectMap.vue 15 KB

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