Map3DMain.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505
  1. <script setup>
  2. /**
  3. * 业务组件,在components中进行注册
  4. */
  5. //组件异步加载
  6. import {
  7. defineAsyncComponent
  8. } from 'vue';
  9. // const TrackRoam = defineAsyncComponent(() => import('./components/TrackRoam.vue'));
  10. // const ImageLayerSplit = defineAsyncComponent(() => import('./components/ImageLayerSplit.vue'));
  11. // const ViewerSplitScreen = defineAsyncComponent(() => import('./components/ViewerSplitScreen.vue'));
  12. // const viewerlabel = defineAsyncComponent(() => import('./components/viewerlabel.vue'));
  13. // const printmap = defineAsyncComponent(() => import('./components/printmap.vue'));
  14. // const dialogEdit = defineAsyncComponent(() => import('./components/drawEdit.vue'));
  15. // const queryResult = defineAsyncComponent(() => import('./components/queryResult.vue'));
  16. // const analysisSpace = defineAsyncComponent(() => import('./components/analysis-space.vue'));
  17. // const analysisTerrain = defineAsyncComponent(() => import('./components/analysis-terrain.vue'));
  18. // const analysisData = defineAsyncComponent(() => import('./components/analysis-data.vue'));
  19. // const layer = defineAsyncComponent(() => import('./components/layer.vue'));
  20. // const measure = defineAsyncComponent(() => import('./components/measure.vue'));
  21. // const queryGraphics = defineAsyncComponent(() => import('./components/query-graphics.vue'));
  22. // const SpecialEffects = defineAsyncComponent(() => import('./components/special-effects.vue'));
  23. // const coordsTool = defineAsyncComponent(() => import('./components/coordsTool.vue'));
  24. // const basicLayer = defineAsyncComponent(() => import('./components/basicLayer.vue'));
  25. const queryKeyword = defineAsyncComponent(() => import('./components/query-keyword.vue'));
  26. // const toolbars = defineAsyncComponent(() => import('./components/toolbars.vue'));
  27. // const map3d = defineAsyncComponent(() => import('./components/map.vue'));
  28. import map3d from './components/map.vue';
  29. // import queryKeyword from './components/query-keyword.vue';
  30. import toolbars from './components/toolbars.vue';
  31. import layer from './components/layer.vue';
  32. import measure from './components/measure.vue';
  33. import queryGraphics from './components/query-graphics.vue';
  34. import SpecialEffects from './components/special-effects.vue';
  35. import coordsTool from './components/coordsTool.vue';
  36. import basicLayer from './components/basicLayer.vue'
  37. import analysisSpace from './components/analysis-space.vue';
  38. import analysisTerrain from './components/analysis-terrain.vue';
  39. import analysisData from './components/analysis-data.vue';
  40. import mapNavigate from './components/mapNavigate.vue';
  41. import TrackRoam from './components/TrackRoam.vue';
  42. import ImageLayerSplit from './components/ImageLayerSplit.vue';
  43. import ViewerSplitScreen from './components/ViewerSplitScreen.vue';
  44. import viewerlabel from './components/viewerlabel.vue';
  45. import printmap from './components/printmap.vue';
  46. import dialogEdit from "./components/drawEdit.vue";
  47. import queryResult from "./components/queryResult.vue";
  48. import RightHeading from "./components/RightHeading.vue";
  49. import ggsbtj from "./components/ggsbtj.vue";
  50. import ysltj from "./components/ysltj.vue";
  51. import sbyxjc from "./components/sbyxjc.vue";
  52. import qtnhzb from "./components/qtnhzb.vue";
  53. import nhtbtj from "./components/nhtbtj.vue";
  54. import znjk from "./components/znjk.vue";
  55. import {
  56. provide
  57. } from "vue";
  58. import {
  59. Store
  60. } from '@/store/index'
  61. store = Store()
  62. /**
  63. * 通过provide/inject可以轻松实现跨级访问父组件的数据
  64. * provide和inject是成对出现的
  65. * 必须放在setup内
  66. * 简单的来说就是在父组件中通过provider来提供变量,然后在子组件中通过inject来注入变量
  67. * provide 和 inject 绑定并不是可响应的。这是刻意为之的。
  68. * 代码执行顺序data->provide->created->mounted
  69. */
  70. provide("getMapInstance", () => {
  71. return jt3d;
  72. });
  73. </script>
  74. <template>
  75. <div class="jt-mapMain">
  76. <!-- 地图组件 -->
  77. <map3d @onload="jtMap3DOnload" ref="refMap3d" />
  78. <!-- 地图加载完成后,在加载其他组件 -->
  79. <template v-if="mapLoaded">
  80. <!-- 底图组件 -->
  81. <basicLayer v-show="showbasicLayer" ref="basicLayers"></basicLayer>
  82. <!-- 弹出框组件,tabs组件测试 -->
  83. <jt-popup title="地区导航" ref="refmapNavigate" :isEmit="true" @closeJTPopup="closeMapNavigate">
  84. <mapNavigate ref="_refmapNavigate"></mapNavigate>
  85. </jt-popup>
  86. <!-- 关键字查询组件 -->
  87. <!-- <queryKeyword ref="queryword" /> -->
  88. <jt-popup2 title="灌溉设备统计" ref="ggsbtj">
  89. <ggsbtj ref="_ggsbtj"></ggsbtj>
  90. </jt-popup2>
  91. <jt-popup2 title="设备运行检测" top="calc(calc(100% - 115rem) / 3 + 90rem)" ref="sbyxjc">
  92. <sbyxjc ref="_sbyxjc"></sbyxjc>
  93. </jt-popup2>
  94. <jt-popup2 title="灌溉水位监测" top="calc(calc(100% - 115rem) / 3 + calc(100% - 115rem) / 3 + 90rem)" ref="qtnhzb">
  95. <qtnhzb ref="_qtnhzb"></qtnhzb>
  96. </jt-popup2>
  97. <jt-popup3 title="用水量统计" ref="ysltj">
  98. <ysltj ref="_ysltj"></ysltj>
  99. </jt-popup3>
  100. <jt-popup3 title="能耗同比统计" top="calc(calc(100% - 115rem) / 3 + 90rem)" ref="nhtbtj">
  101. <nhtbtj ref="_nhtbtj"></nhtbtj>
  102. </jt-popup3>
  103. <jt-popup3 title="智能监控" top="calc(calc(100% - 115rem) / 3 + calc(100% - 115rem) / 3 + 90rem)" ref="znjk">
  104. <znjk ref="_znjk"></znjk>
  105. </jt-popup3>
  106. <!-- 视角标签 -->
  107. <jt-popup title="视角标签" ref="refviewerlabel">
  108. <viewerlabel ref="_refviewerlabel"></viewerlabel>
  109. </jt-popup>
  110. <!-- 打印地图 -->
  111. <jt-popup :showfooter="isshowfooter" longheader="1" right="calc(50% - 480rem)" width="960rem" top="calc(50% - 270rem)" height="600rem" title="打印地图" ref="refprintmap">
  112. <printmap ref="_refprintmap"></printmap>
  113. </jt-popup>
  114. <!-- 工具栏组件 -->
  115. <!-- <toolbars /> -->
  116. <!-- 图上量算组件 -->
  117. <jt-popup title="图上量算" ref="refMeasure" :isEmit="true" @closeJTPopup="closeMeasure">
  118. <measure ref="_refMeasure" />
  119. </jt-popup>
  120. <!-- 数据分析组件 -->
  121. <jt-popup title="数据分析" ref="refAnalysisData">
  122. <analysisData />
  123. </jt-popup>
  124. <!-- 空间分析组件 -->
  125. <jt-popup title="空间分析" ref="refAnalysisSpace">
  126. <analysisSpace />
  127. </jt-popup>
  128. <!-- 剖面分析结果组件 -->
  129. <jt-drawer ref="refDrawerSectionAnalysis" title="剖面分析结果" direction="btt" size="30vh" @closeJTDrawer="closeDrawerSectionAnalysis">
  130. <jt-charts id="sectionAnalysisChart" width='98vw' height="20vh" :option='ChartTestData' />
  131. </jt-drawer>
  132. <!-- 图形查询组件 -->
  133. <jt-popup title="图形查询" ref="refQueryGraphics" :isEmit="true" @closeJTPopup="closeQuery">
  134. <queryGraphics ref="_refQueryGraphics" />
  135. </jt-popup>
  136. <!-- 特效组件 -->
  137. <jt-popup title="特效效果" ref="refSpecialEffects">
  138. <SpecialEffects />
  139. </jt-popup>
  140. <!-- 坐标定位拾取组件 -->
  141. <jt-popup title="坐标定位拾取" ref="refCoordsTool">
  142. <coordsTool />
  143. </jt-popup>
  144. <!-- 地形分析组件 -->
  145. <jt-popup title="地形分析" ref="refAnalysisTerrain" :isEmit="true" @closeJTPopup="closeAnalysisTerrain">
  146. <analysisTerrain ref="_refAnalysisTerrain" />
  147. </jt-popup>
  148. <!-- 跟踪漫游组件 -->
  149. <jt-popup minWidth="294rem" title="跟踪漫游" ref="refTrackRoam">
  150. <TrackRoam />
  151. </jt-popup>
  152. <!-- 卷帘对比组件 -->
  153. <jt-popup :showfooter="isshowfooter" height="150rem" width="520rem" title="卷帘对比" ref="refImageLayerSplit" :isEmit="true" @closeJTPopup="closeImageLayerSplit">
  154. <ImageLayerSplit ref="_refImageLayerSplit" />
  155. </jt-popup>
  156. <!-- 分屏对比组件 -->
  157. <jt-popup title="分屏对比" animationClass="fadein-left" ref="refViewerSplitScreen" :isEmit="true" @closeJTPopup="closeViewerSplitScreen">
  158. <ViewerSplitScreen ref="_refViewerSplitScreen" />
  159. </jt-popup>
  160. <!-- 图层控jt-popup制组件 -->
  161. <jt-popup title="图层控制" ref="refLayer">
  162. <layer />
  163. </jt-popup>
  164. <!--图上绘制组件-->
  165. <jt-popup title="图上绘制" ref="refDialogEdit">
  166. <dialogEdit />
  167. </jt-popup>
  168. <!-- 查询结果 -->
  169. <jt-popup :showfooter='isshowfooter' animationClass="fadein-left" height="400rem" width="800rem" title="信息展示" ref="refQueryResultPopup" :isEmit="true" @closeJTPopup="closeQueryResult">
  170. <queryResult ref="refQueryResult" />
  171. </jt-popup>
  172. <!-- <RightHeading></RightHeading> -->
  173. <!-- <video id="trailer" style="display: none;" autoplay loop crossorigin controls>
  174. <source src="@/assets/dataFile/jt.mp4" type="video/mp4">
  175. </video> -->
  176. </template>
  177. </div>
  178. </template>
  179. <script>
  180. import * as echarts from "echarts";
  181. let store = undefined
  182. let jt3d = undefined;
  183. let tipEntity = undefined;
  184. export default {
  185. name: "Map3DMain",
  186. /**
  187. * 数据
  188. */
  189. data() {
  190. return {
  191. isshowfooter:false,
  192. mapLoaded: false,
  193. showbasicLayer: false, //控制地图组件显示隐藏
  194. ChartTestData: {}, //剖面分析结果chart
  195. }
  196. },
  197. /**
  198. * 方法
  199. */
  200. methods: {
  201. /**
  202. * 关闭分屏对比
  203. */
  204. closeViewerSplitScreen() {
  205. this.$refs._refViewerSplitScreen.removeSplitScreen();
  206. },
  207. /**
  208. * 关闭卷帘对比
  209. */
  210. closeImageLayerSplit() {
  211. this.$refs._refImageLayerSplit.removeSplitLayer();
  212. },
  213. /**
  214. * 关闭地形分析弹窗
  215. */
  216. closeAnalysisTerrain() {
  217. //工具初始化
  218. this.$refs._refAnalysisTerrain.init();
  219. //还原左键单击事件
  220. this.$refs.refMap3d.clickEntity(jt3d);
  221. window["viewer"].scene.screenSpaceCameraController.enableCollisionDetection = true; //相机与地形的碰撞检测
  222. },
  223. /**
  224. * 关闭地区导航
  225. */
  226. closeMapNavigate() {
  227. this.$refs._refmapNavigate.remove();
  228. },
  229. /**
  230. * 清除测量结果
  231. */
  232. closeMeasure() {
  233. this.$refs._refMeasure.clearMeasurementData();
  234. },
  235. /**
  236. * 清除查询结果
  237. */
  238. closeQuery() {
  239. this.$refs._refQueryGraphics.clearQuery();
  240. },
  241. /**
  242. * 关闭查询结果
  243. */
  244. closeQueryResult() {
  245. //清除高亮显示
  246. let list = jt3d._dataSources.getByName("单击高亮显示")
  247. list.forEach(res => {
  248. jt3d._dataSources.remove(res)
  249. })
  250. //清除定位样式
  251. if (jt3d.LocateUtil._locationEntity) {
  252. window["viewer"].entities.remove(jt3d.LocateUtil._locationEntity);
  253. }
  254. },
  255. /**
  256. * 关闭剖面分析结果
  257. */
  258. closeDrawerSectionAnalysis() {
  259. this.$refs.refDrawerSectionAnalysis.drawerVisible = true;
  260. if (tipEntity) {
  261. window.viewer.entities.remove(tipEntity);
  262. tipEntity = undefined;
  263. }
  264. jt3d.SpatialAnalysis.Profile.removeProfileAnalysis();
  265. jt3d.DrawTools.Clear();
  266. //还原左键单击事件
  267. this.$refs.refMap3d.clickEntity(jt3d);
  268. },
  269. /**
  270. * 构建剖面分析结果chart
  271. */
  272. initEchartsData(sectionAnalysisData) {
  273. if (tipEntity) {
  274. window.viewer.entities.remove(tipEntity);
  275. tipEntity = undefined;
  276. }
  277. // jt3d.SpatialAnalysis.Profile.removeProfileAnalysis();
  278. let datas = [],
  279. coords = [];
  280. let pointsData = sectionAnalysisData;
  281. let maxDistance = pointsData[pointsData.length - 1].distance;
  282. let xAixMax = Math.ceil(maxDistance);
  283. for (let index = 0; index < pointsData.length; index++) {
  284. let element = pointsData[index];
  285. let curData = [
  286. parseFloat(element.distance.toFixed(2)),
  287. parseFloat(element.position.height.toFixed(2))
  288. ];
  289. datas.push(curData);
  290. let curCoords = [element.position.lon, element.position.lat];
  291. coords.push(curCoords);
  292. }
  293. let ChartTestData = {
  294. tooltip: {
  295. show: true,
  296. trigger: 'item',
  297. formatter(params) {
  298. let xy = coords[params.dataIndex];
  299. let tipData = params["data"];
  300. if (params.name === "Max" || params.name === "Min") {
  301. tipData = params["data"].coord;
  302. }
  303. if (!tipEntity) {
  304. tipEntity = window.viewer.entities.add({
  305. position: Cesium.Cartesian3.fromDegrees(xy[0], xy[1], Number(tipData[1])),
  306. billboard: {
  307. image: '/jt3dSDK/imgs/point/point.png',
  308. horizontalOrigin: Cesium.HorizontalOrigin.center,
  309. verticalOrigin: Cesium.VerticalOrigin.bottom,
  310. scale: 1,
  311. pixelOffset: new Cesium.Cartesian2(0, 0),
  312. disableDepthTestDistance: Number.POSITIVE_INFINITY,
  313. },
  314. });
  315. } else {
  316. tipEntity.position = Cesium.Cartesian3.fromDegrees(xy[0], xy[1], Number(tipData[1]));
  317. }
  318. //定位到点
  319. // jt3d.LocateUtil.flyToPoint({
  320. // longitude: xy[0],
  321. // latitude: xy[1],
  322. // height: Number(tipData[1])
  323. // });
  324. return "距离:" + tipData[0] + "m<br>" + "高度:" + tipData[1] + "m<br>" + "坐标:" + xy[0].toFixed(
  325. 5) + "," + xy[1].toFixed(5);
  326. }
  327. },
  328. grid: {
  329. bottom: '10%',
  330. left: '5%',
  331. right: '5%',
  332. },
  333. xAxis: {
  334. type: "value",
  335. max: xAixMax,
  336. axisLabel: { //文字属性
  337. textStyle: {
  338. color: 'rgb(216 240 255)'
  339. },
  340. formatter: '{value} m'
  341. },
  342. axisLine: { //轴线属性
  343. lineStyle: {
  344. color: 'rgb(216 240 255)',
  345. width: 2
  346. },
  347. },
  348. splitLine: { //分割线属性
  349. lineStyle: {
  350. type: 'dashed'
  351. }
  352. }
  353. },
  354. yAxis: {
  355. type: "value",
  356. axisLabel: { //文字属性
  357. textStyle: {
  358. color: 'rgb(216 240 255)'
  359. },
  360. formatter: '{value} m'
  361. },
  362. axisLine: { //轴线属性
  363. lineStyle: {
  364. color: 'rgb(216 240 255)',
  365. width: 2
  366. },
  367. },
  368. splitLine: { //分割线属性
  369. lineStyle: {
  370. type: 'dashed'
  371. }
  372. }
  373. },
  374. series: [{
  375. type: "line",
  376. data: datas,
  377. markPoint: {
  378. symbol: 'path://m 0,0 h 48 v 20 h -30 l -6,10 l -6,-10 h -6 z', // 'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow', path://m 0,0 h 48 v 20 h -30 l -6,10 l -6,-10 h -6 z, path://m 0,0 h 48 v 20 h -34 l -6,10 l -6,-10 h -2 z
  379. symbolSize: [60, 60], // 容器大小
  380. symbolOffset: ['34%', '-50%'], //位置偏移
  381. symbolKeepAspect: true, // 如果 symbol 是 path:// 的形式,是否在缩放时保持该图形的长宽比。
  382. label: {
  383. textStyle: {
  384. color: 'rgb(216,240,255)'
  385. },
  386. position: "insideTop",
  387. distance: 7,
  388. },
  389. data: [{
  390. type: 'max',
  391. name: '最大值',
  392. itemStyle: { //背景色
  393. color: 'rgb(255, 70, 131)',
  394. }
  395. },
  396. {
  397. type: 'min',
  398. name: '最小值',
  399. itemStyle: { //背景色
  400. color: 'rgb(255, 70, 131)',
  401. }
  402. }
  403. ]
  404. },
  405. itemStyle: {
  406. color: 'rgba(85,254,139,1)',
  407. },
  408. areaStyle: {
  409. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
  410. offset: 0,
  411. color: 'rgba(85,254,139,0.8)'
  412. },
  413. {
  414. offset: 1,
  415. color: 'rgba(14,245,210,0.2)'
  416. }
  417. ])
  418. },
  419. }]
  420. };
  421. this.ChartTestData = ChartTestData;
  422. },
  423. /**
  424. * 地图初始化
  425. * @param {Object} map
  426. */
  427. jtMap3DOnload(map) {
  428. jt3d = map;
  429. this.mapLoaded = true;
  430. },
  431. },
  432. created() {
  433. store.markID = ''
  434. store.queryMapTables=[]
  435. },
  436. mounted() {
  437. }
  438. };
  439. </script>
  440. <style lang="scss" scoped>
  441. .jt-mapMain{
  442. }
  443. </style>