Map3DMain.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  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 ggsbtj from "./components/ggsbtj.vue";
  49. import ysltj from "./components/ysltj.vue";
  50. import sbyxjc from "./components/sbyxjc.vue";
  51. import qtnhzb from "./components/qtnhzb.vue";
  52. import nhtbtj from "./components/nhtbtj.vue";
  53. import znjk from "./components/znjk.vue";
  54. import {
  55. provide
  56. } from "vue";
  57. import {
  58. Store
  59. } from '@/store/index'
  60. store = Store()
  61. /**
  62. * 通过provide/inject可以轻松实现跨级访问父组件的数据
  63. * provide和inject是成对出现的
  64. * 必须放在setup内
  65. * 简单的来说就是在父组件中通过provider来提供变量,然后在子组件中通过inject来注入变量
  66. * provide 和 inject 绑定并不是可响应的。这是刻意为之的。
  67. * 代码执行顺序data->provide->created->mounted
  68. */
  69. provide("getMapInstance", () => {
  70. return jt3d;
  71. });
  72. </script>
  73. <template>
  74. <div class="jt-mapMain">
  75. <!-- 地图组件 -->
  76. <!-- 地图加载完成后,在加载其他组件 -->
  77. <!-- 底图组件 -->
  78. <basicLayer v-show="showbasicLayer" ref="basicLayers"></basicLayer>
  79. <!-- 弹出框组件,tabs组件测试 -->
  80. <jt-popup title="地区导航" ref="refmapNavigate" :isEmit="true" @closeJTPopup="closeMapNavigate">
  81. <mapNavigate ref="_refmapNavigate"></mapNavigate>
  82. </jt-popup>
  83. <!-- 关键字查询组件 -->
  84. <!-- <queryKeyword ref="queryword" /> -->
  85. <jt-popup2 title="灌溉设备统计" ref="ggsbtj">
  86. <ggsbtj ref="_ggsbtj"></ggsbtj>
  87. </jt-popup2>
  88. <jt-popup2 title="设备运行监测" top="calc(calc(100% - 115rem) / 3 + 90rem)" ref="sbyxjc">
  89. <sbyxjc ref="_sbyxjc"></sbyxjc>
  90. </jt-popup2>
  91. <jt-popup2 title="灌溉水位监测" top="calc(calc(100% - 115rem) / 3 + calc(100% - 115rem) / 3 + 90rem)" ref="qtnhzb">
  92. <qtnhzb ref="_qtnhzb"></qtnhzb>
  93. </jt-popup2>
  94. <jt-popup3 title="用水量统计" ref="ysltj">
  95. <ysltj ref="_ysltj"></ysltj>
  96. </jt-popup3>
  97. <jt-popup3 title="能耗同比统计" top="calc(calc(100% - 115rem) / 3 + 90rem)" ref="nhtbtj">
  98. <nhtbtj ref="_nhtbtj"></nhtbtj>
  99. </jt-popup3>
  100. <jt-popup3 title="智能监控" top="calc(calc(100% - 115rem) / 3 + calc(100% - 115rem) / 3 + 90rem)" ref="znjk">
  101. <znjk ref="_znjk"></znjk>
  102. </jt-popup3>
  103. </div>
  104. </template>
  105. <script>
  106. import * as echarts from "echarts";
  107. let store = undefined
  108. let jt3d = undefined;
  109. let tipEntity = undefined;
  110. export default {
  111. name: "Map3DMain",
  112. /**
  113. * 数据
  114. */
  115. data() {
  116. return {
  117. isshowfooter: false,
  118. mapLoaded: false,
  119. showbasicLayer: false, //控制地图组件显示隐藏
  120. ChartTestData: {}, //剖面分析结果chart
  121. }
  122. },
  123. /**
  124. * 方法
  125. */
  126. methods: {
  127. /**
  128. * 关闭分屏对比
  129. */
  130. closeViewerSplitScreen() {
  131. this.$refs._refViewerSplitScreen.removeSplitScreen();
  132. },
  133. /**
  134. * 关闭卷帘对比
  135. */
  136. closeImageLayerSplit() {
  137. this.$refs._refImageLayerSplit.removeSplitLayer();
  138. },
  139. /**
  140. * 关闭地形分析弹窗
  141. */
  142. closeAnalysisTerrain() {
  143. //工具初始化
  144. this.$refs._refAnalysisTerrain.init();
  145. //还原左键单击事件
  146. this.$refs.refMap3d.clickEntity(jt3d);
  147. window["viewer"].scene.screenSpaceCameraController.enableCollisionDetection = true; //相机与地形的碰撞检测
  148. },
  149. /**
  150. * 关闭地区导航
  151. */
  152. closeMapNavigate() {
  153. this.$refs._refmapNavigate.remove();
  154. },
  155. /**
  156. * 清除测量结果
  157. */
  158. closeMeasure() {
  159. this.$refs._refMeasure.clearMeasurementData();
  160. },
  161. /**
  162. * 清除查询结果
  163. */
  164. closeQuery() {
  165. this.$refs._refQueryGraphics.clearQuery();
  166. },
  167. /**
  168. * 关闭查询结果
  169. */
  170. closeQueryResult() {
  171. //清除高亮显示
  172. let list = jt3d._dataSources.getByName("单击高亮显示")
  173. list.forEach(res => {
  174. jt3d._dataSources.remove(res)
  175. })
  176. //清除定位样式
  177. if (jt3d.LocateUtil._locationEntity) {
  178. window["viewer"].entities.remove(jt3d.LocateUtil._locationEntity);
  179. }
  180. },
  181. /**
  182. * 关闭剖面分析结果
  183. */
  184. closeDrawerSectionAnalysis() {
  185. this.$refs.refDrawerSectionAnalysis.drawerVisible = true;
  186. if (tipEntity) {
  187. window.viewer.entities.remove(tipEntity);
  188. tipEntity = undefined;
  189. }
  190. jt3d.SpatialAnalysis.Profile.removeProfileAnalysis();
  191. jt3d.DrawTools.Clear();
  192. //还原左键单击事件
  193. this.$refs.refMap3d.clickEntity(jt3d);
  194. },
  195. /**
  196. * 构建剖面分析结果chart
  197. */
  198. initEchartsData(sectionAnalysisData) {
  199. if (tipEntity) {
  200. window.viewer.entities.remove(tipEntity);
  201. tipEntity = undefined;
  202. }
  203. // jt3d.SpatialAnalysis.Profile.removeProfileAnalysis();
  204. let datas = [],
  205. coords = [];
  206. let pointsData = sectionAnalysisData;
  207. let maxDistance = pointsData[pointsData.length - 1].distance;
  208. let xAixMax = Math.ceil(maxDistance);
  209. for (let index = 0; index < pointsData.length; index++) {
  210. let element = pointsData[index];
  211. let curData = [
  212. parseFloat(element.distance.toFixed(2)),
  213. parseFloat(element.position.height.toFixed(2))
  214. ];
  215. datas.push(curData);
  216. let curCoords = [element.position.lon, element.position.lat];
  217. coords.push(curCoords);
  218. }
  219. let ChartTestData = {
  220. tooltip: {
  221. show: true,
  222. trigger: 'item',
  223. formatter(params) {
  224. let xy = coords[params.dataIndex];
  225. let tipData = params["data"];
  226. if (params.name === "Max" || params.name === "Min") {
  227. tipData = params["data"].coord;
  228. }
  229. if (!tipEntity) {
  230. tipEntity = window.viewer.entities.add({
  231. position: Cesium.Cartesian3.fromDegrees(xy[0], xy[1], Number(tipData[1])),
  232. billboard: {
  233. image: '/jt3dSDK/imgs/point/point.png',
  234. horizontalOrigin: Cesium.HorizontalOrigin.center,
  235. verticalOrigin: Cesium.VerticalOrigin.bottom,
  236. scale: 1,
  237. pixelOffset: new Cesium.Cartesian2(0, 0),
  238. disableDepthTestDistance: Number.POSITIVE_INFINITY,
  239. },
  240. });
  241. } else {
  242. tipEntity.position = Cesium.Cartesian3.fromDegrees(xy[0], xy[1], Number(tipData[1]));
  243. }
  244. //定位到点
  245. // jt3d.LocateUtil.flyToPoint({
  246. // longitude: xy[0],
  247. // latitude: xy[1],
  248. // height: Number(tipData[1])
  249. // });
  250. return "距离:" + tipData[0] + "m<br>" + "高度:" + tipData[1] + "m<br>" + "坐标:" + xy[0].toFixed(
  251. 5) + "," + xy[1].toFixed(5);
  252. }
  253. },
  254. grid: {
  255. bottom: '10%',
  256. left: '5%',
  257. right: '5%',
  258. },
  259. xAxis: {
  260. type: "value",
  261. max: xAixMax,
  262. axisLabel: { //文字属性
  263. textStyle: {
  264. color: 'rgb(216 240 255)'
  265. },
  266. formatter: '{value} m'
  267. },
  268. axisLine: { //轴线属性
  269. lineStyle: {
  270. color: 'rgb(216 240 255)',
  271. width: 2
  272. },
  273. },
  274. splitLine: { //分割线属性
  275. lineStyle: {
  276. type: 'dashed'
  277. }
  278. }
  279. },
  280. yAxis: {
  281. type: "value",
  282. axisLabel: { //文字属性
  283. textStyle: {
  284. color: 'rgb(216 240 255)'
  285. },
  286. formatter: '{value} m'
  287. },
  288. axisLine: { //轴线属性
  289. lineStyle: {
  290. color: 'rgb(216 240 255)',
  291. width: 2
  292. },
  293. },
  294. splitLine: { //分割线属性
  295. lineStyle: {
  296. type: 'dashed'
  297. }
  298. }
  299. },
  300. series: [{
  301. type: "line",
  302. data: datas,
  303. markPoint: {
  304. 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
  305. symbolSize: [60, 60], // 容器大小
  306. symbolOffset: ['34%', '-50%'], //位置偏移
  307. symbolKeepAspect: true, // 如果 symbol 是 path:// 的形式,是否在缩放时保持该图形的长宽比。
  308. label: {
  309. textStyle: {
  310. color: 'rgb(216,240,255)'
  311. },
  312. position: "insideTop",
  313. distance: 7,
  314. },
  315. data: [{
  316. type: 'max',
  317. name: '最大值',
  318. itemStyle: { //背景色
  319. color: 'rgb(255, 70, 131)',
  320. }
  321. },
  322. {
  323. type: 'min',
  324. name: '最小值',
  325. itemStyle: { //背景色
  326. color: 'rgb(255, 70, 131)',
  327. }
  328. }
  329. ]
  330. },
  331. itemStyle: {
  332. color: 'rgba(85,254,139,1)',
  333. },
  334. areaStyle: {
  335. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
  336. offset: 0,
  337. color: 'rgba(85,254,139,0.8)'
  338. },
  339. {
  340. offset: 1,
  341. color: 'rgba(14,245,210,0.2)'
  342. }
  343. ])
  344. },
  345. }]
  346. };
  347. this.ChartTestData = ChartTestData;
  348. },
  349. /**
  350. * 地图初始化
  351. * @param {Object} map
  352. */
  353. // jtMap3DOnload(map) {
  354. // jt3d = map;
  355. // this.mapLoaded = true;
  356. // },
  357. },
  358. created() {
  359. store.markID = ''
  360. store.queryMapTables = []
  361. jt3d = store.jt3d
  362. console.log('地图3d', jt3d)
  363. },
  364. mounted() {
  365. }
  366. };
  367. </script>
  368. <style lang="scss" scoped>
  369. .jt-mapMain {
  370. z-index: 15;
  371. // position: absolute;
  372. width: 100%;
  373. height: 100%;
  374. top: 0;
  375. pointer-events: none;
  376. }
  377. </style>