map.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. <template>
  2. <div id="cesiumContainer2" class="ViewerSplitScreen" style="display: none; border-right: 5rem solid #fff"></div>
  3. <div id="cesiumContainer" class="jt-map" ref="cesiumContainer">
  4. <div class="back"></div>
  5. </div>
  6. </template>
  7. <script>
  8. import {
  9. Store
  10. } from '@/store/index'
  11. let store = Store();
  12. import map_xzqh_zj from '@/assets/dataFile/map_xzqh_zj.json';
  13. let jt3d = undefined;
  14. export default {
  15. watch: {
  16. isflyto: {
  17. handler(newVal, oldVal) {
  18. console.log('监听', newVal, oldVal)
  19. if (newVal) {
  20. this.flyto()
  21. }
  22. },
  23. immediate: true,
  24. deep: true // 可以深度检测到 person 对象的属性值的变化
  25. }
  26. },
  27. /* 数据 */
  28. data() {
  29. return {
  30. LocateId: 'locate_ID_remove', //标记定位所用ID
  31. entity1: '',
  32. entity: '',
  33. isflyto: false
  34. }
  35. },
  36. /* 方法 */
  37. methods: {
  38. //定位方法
  39. startLocation() {
  40. let that = this
  41. plusGPSListenerOn(function(lat, lon) {
  42. console.log('位置坐标', lat, lon)
  43. let terrainProvider = jt3d._viewer.terrainProvider;
  44. //异步函数
  45. return new Promise((resolve, reject) => {
  46. lon = Number(lon)
  47. lat = Number(lat)
  48. let promise = new Cesium.sampleTerrainMostDetailed(terrainProvider, [Cesium
  49. .Cartographic.fromDegrees(lon, lat)
  50. ]);
  51. promise.then(function(updatedPositions) {
  52. if (that.entity) {
  53. jt3d._viewer.entities.remove(that.entity)
  54. }
  55. // if that.entity && jt3d._viewer.entities.remove(that.entity)
  56. console.log('高度', updatedPositions[0].height)
  57. let height = 1000
  58. that.entity = new Cesium.Entity({
  59. name: "add billboard",
  60. //位置
  61. position: Cesium.Cartesian3.fromDegrees(lon, lat, height),
  62. //图片标签
  63. billboard: {
  64. image: 'jt3dSDK/imgs/point/point.png',
  65. horizontalOrigin: Cesium.HorizontalOrigin.CENTER, //水平
  66. verticalOrigin: Cesium.VerticalOrigin.BOTTOM, //垂直位置
  67. // scale: billboard.scale, //尺寸
  68. // pixelOffset: new Cesium.Cartesian2(0, billboard.pixelOffset),
  69. disableDepthTestDistance: Number.POSITIVE_INFINITY,
  70. scale: 1,
  71. scaleByDistance: new Cesium.NearFarScalar(1.5e2, 1,
  72. 2400, 0
  73. ) //按距离缩放,即距离大于180米时,图标不显示 Cesium.NearFarScalar(near, nearValue, far, farValue)相机范围的下界。相机范围下界的值。相机范围的上限。该值位于摄像机范围的上界。
  74. }
  75. });
  76. jt3d._viewer.entities.add(that.entity, {
  77. range: 1000
  78. });
  79. // let LocateNowTime = jt3d.PointObject.addBillboard([lon, lat,height], {
  80. // // id: that.LocateId
  81. // })
  82. // LocateNowTime.then(entity => {
  83. // that.entity = entity
  84. // })
  85. resolve(updatedPositions);
  86. });
  87. })
  88. // let getHeight = new that.jt3dSDK.common.getHeigthByPointsMostDetailed(jt3d._viewer,[[lon,lat]])
  89. // getHeight.then(height=>{
  90. // // if that.entity && jt3d._viewer.entities.remove(that.entity)
  91. // console.log('高度',height)
  92. // let LocateNowTime = jt3d.PointObject.addBillboard([lon,lat,height],{
  93. // id:that.LocateId
  94. // })
  95. // LocateNowTime.then(entity=>{
  96. // that.entity = entity
  97. // })
  98. // })
  99. });
  100. },
  101. /**
  102. * 初始化
  103. */
  104. init(el) {
  105. let that = this
  106. //初始化大球
  107. this.initMap3d(el);
  108. //设置默认视图
  109. this.setView(jt3d);
  110. // 初始化项目区域范围视角
  111. this.fullMap(jt3d);
  112. //加载天空盒子
  113. this.addSkybox(jt3d);
  114. //调用父组件的方法,onload是在父组件的的动态组件component上面的方法,并将jt3d传过去
  115. this.$emit("onload", jt3d);
  116. // console.log(this.$parent)
  117. this.$parent.jtMap3DOnload(jt3d);
  118. //单击事件
  119. // this.clickEntity(jt3d);
  120. //添加镇街边界线——精灵线
  121. // this.addBoundaryLine(jt3d);
  122. },
  123. /**
  124. * 添加镇街边界线——精灵线
  125. */
  126. addBoundaryLine(jt3d) {
  127. jt3d.PolylineObject.drawPolylineByGeoJson(map_xzqh_zj, {
  128. width: 5,
  129. color: '#04FFFF',
  130. isImageAlpha: true, //用图片自带颜色
  131. duration: 3000,
  132. imgUrl: "/jt3dSDK/imgs/polylinematerial/spriteline1.png"
  133. });
  134. },
  135. /* flyto定位 */
  136. flyto() {
  137. let that = this
  138. if (!that.entity) {
  139. that.entity = jt3d._viewer.entities.add(that.entity1, {
  140. range: 1000,
  141. });
  142. }
  143. // that.entity = jt3d._viewer.entities.add(that.entity1, {
  144. // range: 1000,
  145. // });
  146. jt3d.LocateUtil.flyToEntity(that.entity1,{
  147. range:400
  148. }).then(res1 => {
  149. console.log('定位成功?' + JSON.stringify(res1))
  150. })
  151. },
  152. /**
  153. * 单击事件
  154. */
  155. clickEntity(jt3d) {
  156. let _self = this;
  157. if (jt3d.handlerLeftClick) {
  158. jt3d.handlerLeftClick.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK); //移除事件
  159. }
  160. jt3d.handlerLeftClick = new Cesium.ScreenSpaceEventHandler(
  161. jt3d._viewer.scene.canvas
  162. );
  163. //注册大球单机事件
  164. jt3d.handlerLeftClick.setInputAction(function(e) {
  165. var pick = jt3d._viewer.scene.pick(e.position); //拾取当前的entity对象
  166. var cartesian = jt3d._viewer.scene.pickPosition(e.position); //获取当前点坐标
  167. if (Cesium.defined(cartesian)) {
  168. //将笛卡尔坐标转换为地理坐标
  169. let cartographic = Cesium.Cartographic.fromCartesian(cartesian);
  170. //将弧度转为度的十进制度表示
  171. let lng = Cesium.Math.toDegrees(cartographic.longitude);
  172. let lat = Cesium.Math.toDegrees(cartographic.latitude);
  173. let alt = cartographic.height; //高度
  174. _self.$parent.$refs._refQueryGraphics.initQuery({
  175. spatialType: '点',
  176. coordinate: lng + " " + lat,
  177. buffer: ''
  178. });
  179. }
  180. }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
  181. },
  182. /**
  183. * 创建大球
  184. */
  185. initMap3d(el) {
  186. jt3d = new this.jt3dSDK.jtMap3d({
  187. container: el,
  188. });
  189. jt3d.statusBar.show = true;
  190. jt3d.layer = new this.jt3dSDK.layer(jt3d._viewer);
  191. jt3d.CommonTools = new this.jt3dSDK.CommonTools(jt3d._viewer, {
  192. isClear: false,
  193. isDrawPoint: true,
  194. isRetainDrawPoint: false,
  195. iconType: 'blue',
  196. });
  197. jt3d.SketchViewModel = new this.jt3dSDK.SketchViewModel(jt3d._viewer, {
  198. isClear: true,
  199. isDrawPoint: false,
  200. isRetainDrawPoint: false,
  201. iconType: 'blue',
  202. });
  203. jt3d.DrawTools = new this.jt3dSDK.DrawTools(jt3d._viewer, {
  204. isDrawPoint: true, //是否标记参考点
  205. isRetainDrawPoint: false, //绘制完成是否保留绘制点
  206. iconType: 'blue',
  207. });
  208. jt3d.DrawToolsEdit = new this.jt3dSDK.DrawTools(jt3d._viewer, {
  209. isDrawPoint: true, //是否标记参考点
  210. isRetainDrawPoint: true, //绘制完成是否保留绘制点
  211. iconType: 'blue',
  212. });
  213. jt3d.DrawMilitaryPlot = new this.jt3dSDK.DrawMilitaryPlot(jt3d._viewer);
  214. jt3d.LocateUtil = new this.jt3dSDK.LocateUtil(jt3d._viewer);
  215. // jt3d.getHeigthByLngLat = new this.jt3dSDK.getHeigthByLngLat(jt3d._viewer) //获取高度
  216. jt3d.SpatialAnalysis = {};
  217. jt3d.SpatialAnalysis.SightLine = new this.jt3dSDK.SpatialAnalysis.SightLine(jt3d._viewer);
  218. jt3d.SpatialAnalysis.ViewShed = new this.jt3dSDK.SpatialAnalysis.ViewShed(jt3d._viewer);
  219. jt3d.SpatialAnalysis.SunshineShadow = new this.jt3dSDK.SpatialAnalysis.SunshineShadow(jt3d._viewer);
  220. jt3d.SpatialAnalysis.Profile = new this.jt3dSDK.SpatialAnalysis.Profile(jt3d._viewer);
  221. jt3d.SpatialAnalysis.CutFill = new this.jt3dSDK.SpatialAnalysis.CutFill(jt3d._viewer);
  222. jt3d.SpatialAnalysis.HeightLimit = new this.jt3dSDK.SpatialAnalysis.HeightLimit(jt3d._viewer);
  223. jt3d.SpatialAnalysis.Cutting = new this.jt3dSDK.SpatialAnalysis.Cutting(jt3d._viewer);
  224. jt3d.SpatialAnalysis.GeologyClipPlan = new this.jt3dSDK.SpatialAnalysis.GeologyClipPlan(jt3d._viewer);
  225. jt3d.TerrainAnalysis = {};
  226. jt3d.TerrainAnalysis.TerrainExcavation = new this.jt3dSDK.TerrainAnalysis.TerrainExcavation(jt3d._viewer);
  227. jt3d.TerrainAnalysis.SlopeAspect = new this.jt3dSDK.TerrainAnalysis.SlopeAspect(jt3d._viewer);
  228. jt3d.SceneEffects = {};
  229. jt3d.SceneEffects.Weather = new this.jt3dSDK.SceneEffects.Weather(jt3d._viewer);
  230. jt3d.SceneEffects.SkyBox = new this.jt3dSDK.SceneEffects.SkyBox(jt3d._viewer);
  231. jt3d.SceneEffects.ParticleSystem = new this.jt3dSDK.SceneEffects.ParticleSystem(jt3d._viewer);
  232. jt3d.TrackRoam = new this.jt3dSDK.TrackRoam(jt3d._viewer);
  233. jt3d.PolylineObject = new this.jt3dSDK.PolylineObject(jt3d._viewer);
  234. jt3d.PointObject = new this.jt3dSDK.PointObject(jt3d._viewer);
  235. jt3d.PolygonObject = new this.jt3dSDK.PolygonObject(jt3d._viewer);
  236. window["viewer"] = jt3d._viewer;
  237. window["viewer"].scene.terrainExaggeration = 100;
  238. //显示帧率
  239. window["viewer"].scene.debugShowFramesPerSecond = true;
  240. },
  241. /**
  242. * 设置默认视图-初始化中国区域范围视角
  243. */
  244. setView(jt3d) {
  245. // jt3d.flytoChina();
  246. //初始化中国区域范围视角
  247. jt3d.setViewChina();
  248. // jt3d.setView({
  249. // longitude: 103.84, //经度
  250. // latitude: 31.15, // 维度
  251. // height: 24000000, // 高度
  252. // heading: 0, // 偏航
  253. // pitch: -90, // 俯仰,人如果在赤道上空,俯仰角为0可见地球。如果在北纬,俯仰角为负才能见地球
  254. // roll: 0.0 // 翻滚
  255. // });
  256. },
  257. /**
  258. * 全图-飞行到项目区域范围视角
  259. */
  260. fullMap(jt3d) {
  261. // 初始化项目区域范围视角
  262. let optionsS = {
  263. west: 118.69586,
  264. south: 35.91360,
  265. east: 122.70061,
  266. north: 38.65489,
  267. isRemove: false, //定位完成后是否删除
  268. duration: 3, //飞行时间
  269. heading: 0,
  270. pitch: -90,
  271. range: 315000
  272. };
  273. let optionsE = {
  274. west: 118.69586,
  275. south: 35.91360,
  276. east: 122.70061,
  277. north: 38.65489,
  278. isRemove: true, //定位完成后是否删除
  279. duration: 3, //飞行时间
  280. heading: 0,
  281. pitch: -60,
  282. range: 315000
  283. };
  284. var fullMapPromise = jt3d.fullMap(optionsS);
  285. fullMapPromise.then(function(flyPromise) {
  286. jt3d.fullMap(optionsE);
  287. });
  288. },
  289. /**
  290. * 设置天空盒子
  291. */
  292. addSkybox(jt3d) {
  293. //设置天空盒子,默认蓝天
  294. jt3d.SceneEffects.SkyBox.setGroundSkyBox();
  295. },
  296. },
  297. mounted() {
  298. let that = this
  299. that.entity1 = new Cesium.Entity({
  300. name: "add billboard",
  301. //位置
  302. position: Cesium.Cartesian3.fromDegrees(120.623, 36.9157, 100),
  303. //图片标签
  304. billboard: {
  305. image: 'jt3dSDK/imgs/point/point.png',
  306. horizontalOrigin: Cesium.HorizontalOrigin.CENTER, //水平
  307. verticalOrigin: Cesium.VerticalOrigin.BOTTOM, //垂直位置
  308. // scale: billboard.scale, //尺寸
  309. // pixelOffset: new Cesium.Cartesian2(0, billboard.pixelOffset),
  310. disableDepthTestDistance: Number.POSITIVE_INFINITY,
  311. scale: 1,
  312. scaleByDistance: new Cesium.NearFarScalar(1.5e2, 1, 2400,
  313. 1
  314. ) //按距离缩放,即距离大于180米时,图标不显示 Cesium.NearFarScalar(near, nearValue, far, farValue)相机范围的下界。相机范围下界的值。相机范围的上限。该值位于摄像机范围的上界。
  315. }
  316. });
  317. setInterval(res => {
  318. this.isflyto = store.isflyto
  319. if (this.isflyto) {
  320. setTimeout(res => {
  321. this.isflyto = false
  322. store.isflyto = false
  323. })
  324. }
  325. }, 1000)
  326. this.init("cesiumContainer");
  327. // if (store.userport == 'APP') {
  328. // setTimeout(res => {
  329. // this.startLocation()
  330. // }, 100)
  331. // setTimeout(res => {
  332. // jt3d.LocateUtil.flyToEntity(this.entity)
  333. // }, 10000)
  334. // }
  335. }
  336. };
  337. </script>
  338. <style lang="scss" scoped>
  339. .lk-status-bar {
  340. font-size: 16rem !important;
  341. }
  342. .back {
  343. background: url('@/assets/images/backImgshort.png') no-repeat;
  344. background-size: 100% 100%;
  345. height: 100%;
  346. width: 100%;
  347. pointer-events: none;
  348. position: absolute;
  349. z-index: 10;
  350. // background-color: rgba(0,0,0,0);
  351. // opacity: 0.1;
  352. }
  353. .jt-map {
  354. // width: calc(100% - 0rem);
  355. // height: calc(100vh - 70rem);
  356. height: 100vh;
  357. margin: 0;
  358. padding: 0;
  359. overflow: hidden;
  360. background-color: blue;
  361. border: 0rem solid red;
  362. }
  363. //分屏样式
  364. .ViewerSplitScreen {
  365. float: left;
  366. width: calc(50% - 2.5rem);
  367. // height: calc(100vh - 70rem);
  368. height: 100vh;
  369. margin: 0;
  370. .lk-status-bar {
  371. width: calc(50% - 0rem) !important;
  372. }
  373. }
  374. </style>