map3d.vue 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. <script setup>
  2. </script>
  3. <template>
  4. <div id="cesiumContainer" class="jt-map"></div>
  5. <div id="cesiumContainer2" class="mapview" style="display: none;"></div>
  6. </template>
  7. <script>
  8. import jt3dNavigation from "cesium-navigation-es6";
  9. let jt3d = undefined;
  10. export default {
  11. /* 数据 */
  12. data() {
  13. return {
  14. name: "jt-map3d",
  15. }
  16. },
  17. /* 方法 */
  18. methods: {
  19. /**
  20. * 初始化
  21. */
  22. init(el) {
  23. //初始化大球
  24. this.initMap3d(el);
  25. //设置默认视图
  26. this.setView(jt3d);
  27. // 初始化项目区域范围视角
  28. this.fullMap(jt3d);
  29. //加载天空盒子
  30. // this.addSkybox(jt3d);
  31. // 比例尺、指南针
  32. this.initNavigation();
  33. //单击事件
  34. // this.clickEntity(jt3d);
  35. //调用父组件的方法,onload是在父组件的的动态组件component上面的方法,并将jt3d传过去
  36. this.$emit("onload", jt3d);
  37. // console.log('this.$parent',this.$parent)
  38. // this.$parent.jtMap3DOnload(jt3d);
  39. },
  40. /**
  41. * 单击事件
  42. */
  43. clickEntity() {
  44. let _self = this;
  45. if (jt3d.handlerLeftClick) {
  46. jt3d.handlerLeftClick.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK); //移除事件
  47. }
  48. jt3d.handlerLeftClick = new Cesium.ScreenSpaceEventHandler(
  49. window.viewer.scene.canvas
  50. );
  51. //注册大球单机事件
  52. jt3d.handlerLeftClick.setInputAction(function(e) {
  53. var pick = window.viewer.scene.pick(e.position); //拾取当前的entity对象
  54. var cartesian = window.viewer.scene.pickPosition(e.position); //获取当前点坐标
  55. if (Cesium.defined(cartesian)) {
  56. //将笛卡尔坐标转换为地理坐标
  57. let cartographic = Cesium.Cartographic.fromCartesian(cartesian);
  58. //将弧度转为度的十进制度表示
  59. let lng = Cesium.Math.toDegrees(cartographic.longitude);
  60. let lat = Cesium.Math.toDegrees(cartographic.latitude);
  61. let alt = cartographic.height; //高度
  62. _self.$parent.$refs._refQueryGraphics.initQuery({
  63. spatialType: '点',
  64. coordinate: lng + " " + lat,
  65. buffer: ''
  66. });
  67. }
  68. }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
  69. },
  70. /**
  71. * 创建大球
  72. */
  73. initMap3d(el) {
  74. jt3d = new jt3dSDK.jtMap3d({
  75. container: el,
  76. });
  77. jt3d.statusBar.show = true;
  78. window.viewer = jt3d._viewer;
  79. // this.statusBar = new jt3dSDK.StatusBar(window.viewer);
  80. // this.statusBar.show = true;
  81. },
  82. /**
  83. * 设置默认视图-初始化中国区域范围视角
  84. */
  85. setView(jt3d) {
  86. // jt3d.flytoChina();
  87. //初始化中国区域范围视角
  88. jt3d.setViewChina();
  89. // jt3d.setView({
  90. // longitude: 103.84, //经度
  91. // latitude: 31.15, // 维度
  92. // height: 24000000, // 高度
  93. // heading: 0, // 偏航
  94. // pitch: -90, // 俯仰,人如果在赤道上空,俯仰角为0可见地球。如果在北纬,俯仰角为负才能见地球
  95. // roll: 0.0 // 翻滚
  96. // });
  97. },
  98. /**
  99. * 全图-飞行到项目区域范围视角
  100. */
  101. fullMap(jt3d) {
  102. // 初始化项目区域范围视角
  103. let optionsS = {
  104. west: 121.563298,
  105. south: 37.284514,
  106. east: 121.565298,
  107. north: 37.286514,
  108. isRemove: false, //定位完成后是否删除
  109. duration: 3, //飞行时间
  110. heading: 0,
  111. pitch: -90,
  112. range: 115000
  113. };
  114. let optionsE = {
  115. west: 121.563298,
  116. south: 37.284514,
  117. east: 121.565298,
  118. north: 37.286514,
  119. isRemove: true, //定位完成后是否删除
  120. duration: 3, //飞行时间
  121. heading: 0,
  122. pitch: -60,
  123. range: 115000
  124. };
  125. var fullMapPromise = jt3d.fullMap(optionsS);
  126. fullMapPromise.then(function(flyPromise) {
  127. jt3d.fullMap(optionsE);
  128. });
  129. },
  130. /**
  131. * 设置天空盒子
  132. */
  133. addSkybox(jt3d) {
  134. //设置天空盒子,默认蓝天
  135. this.SceneEffects = new jt3dSDK.SceneEffects.SkyBox(window.viewer);
  136. this.SceneEffects.setGroundSkyBox();
  137. },
  138. /**
  139. * 比例尺、指南针
  140. * @param {Object} options 具有以下属性:
  141. * @param {Number} options.longitude 经度,以度为单位
  142. * @param {Number} options.latitude 纬度,以度为单位
  143. * @param {Number} [options.height=0.0] 椭球的高度,以米为单位
  144. * @param {Number} [options.heading=0.0] 指向,默认值0.0(北)
  145. * @param {Number} [options.pitch=-90] 视角,默认值-90(向下看)。俯仰,人如果在赤道上空,俯仰角为0可见地球。如果在北纬,俯仰角为负才能见地球
  146. * @param {Number} [options.roll=0.0] 翻滚
  147. * @param {Number} [options.enableCompass=true] 用于启用或禁用罗盘。true是启用罗盘,false是禁用罗盘。默认值为true。如果将选项设置为false,则罗盘将不会添加到地图中。
  148. * @param {Number} [options.enableZoomControls=true] 用于启用或禁用缩放控件。true是启用,false是禁用。默认值为true。如果将选项设置为false,则缩放控件将不会添加到地图中。
  149. * @param {Number} [options.enableDistanceLegend=true] 用于启用或禁用距离图例。true是启用,false是禁用。默认值为true。如果将选项设置为false,距离图例将不会添加到地图中。
  150. * @param {Number} [options.enableCompassOuterRing=true] 用于启用或禁用指南针外环。true是启用,false是禁用。默认值为true。如果将选项设置为false,则该环将可见但无效。
  151. */
  152. initNavigation() {
  153. let options = {};
  154. // 用于在使用重置导航重置地图视图时设置默认视图控制。接受的值是Cesium.Cartographic 和 Cesium.Rectangle.
  155. options.defaultResetView = Cesium.Rectangle.fromDegrees(121.13766, 36.99670, 121.94984, 37.55286);
  156. // options.defaultResetView = Cesium.Cartographic(103.84,31.15,24000000);
  157. // options.defaultResetView = Cesium.Cartographic.fromDegrees(jtMap3dBase.Math.toRadians(103.84), Cesium.Math.toRadians(31.15), 24000000);
  158. options.orientation = {
  159. heading: Cesium.Math.toRadians(0),
  160. pitch: Cesium.Math.toRadians(-90),
  161. roll: 0,
  162. }
  163. //相机延时
  164. options.duration = 4 //默认为3s
  165. // 用于启用或禁用罗盘。
  166. options.enableCompass = true;
  167. // 用于启用或禁用指南针外环。
  168. options.enableCompassOuterRing = true;
  169. // 用于启用或禁用缩放控件。
  170. options.enableZoomControls = true;
  171. // 用于启用或禁用距离图例。
  172. options.enableDistanceLegend = false;
  173. //修改重置视图的tooltip
  174. options.resetTooltip = "重置视图";
  175. //修改放大按钮的tooltip
  176. options.zoomInTooltip = "放大";
  177. //修改缩小按钮的tooltip
  178. options.zoomOutTooltip = "缩小";
  179. //如需自定义罗盘控件,请看下面的自定义罗盘控件
  180. new jt3dNavigation(window.viewer, options);
  181. },
  182. /**
  183. * 地图绕点自旋
  184. */
  185. setMapSpin() {
  186. //移除左键单击事件
  187. if (jt3d.handlerLeftClick) {
  188. jt3d.handlerLeftClick.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
  189. }
  190. let SketchViewModel = new jt3dSDK.SketchViewModel(window.viewer, {
  191. isClear: true,
  192. isDrawPoint: false, //是否标记参考点
  193. isRetainDrawPoint: false, //绘制完成是否保留绘制点
  194. iconType: 'blue',
  195. }, );
  196. SketchViewModel.sketchTools('point', {
  197. onComplete(cPoint, gPoint) {
  198. jt3d.setMapSpinByPoint(cPoint, {
  199. // height: 100000
  200. });
  201. },
  202. onError(message) {}
  203. });
  204. },
  205. /**
  206. * 地图指北
  207. */
  208. setMapNorth() {
  209. jt3d.setMapNorth();
  210. jt3d.isSpan = false;
  211. },
  212. },
  213. mounted() {
  214. this.init("cesiumContainer");
  215. let mapView1 = document.getElementById("cesiumContainer");
  216. var canvas = window.viewer.canvas; // 获取画布
  217. console.log('画布', canvas.width)
  218. }
  219. };
  220. </script>
  221. <style scoped>
  222. #cesiumContainer {
  223. height: 100vh;
  224. margin: 0;
  225. padding: 0;
  226. border: 0px solid red;
  227. }
  228. </style>