map.vue 10 KB

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