3DbigeMap.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. <template>
  2. <div>
  3. <div id='container'></div>
  4. <div id="mouse_state"></div>
  5. </div>
  6. </template>
  7. <script>
  8. import bigemap3d from '@/utils/bigemap/3dmap'
  9. export default {
  10. name: "bigeMap3D",
  11. props: {mapValue: Object},
  12. watch: {
  13. mapValue: {
  14. immediate: true,
  15. handler(value) {
  16. if (value.params !== undefined) {
  17. // console.log("3D地形图:" + value)
  18. this.mapData = value
  19. this.level = value.level
  20. this.center = {lng: value.center[1], lat: value.center[0]}
  21. this.init()
  22. }
  23. }
  24. }
  25. },
  26. data() {
  27. return {
  28. A: 40487.57,
  29. B: 0.00007096758,
  30. C: 91610.74,
  31. D: -40467.74,
  32. level: 10,
  33. center: {},
  34. }
  35. }, mounted() {
  36. },
  37. methods: {
  38. init() {
  39. let _self = this
  40. // 高度
  41. let altitude = this.C * Math.pow((this.A - this.D) / (this.level - this.D) - 1, 1 / this.B)
  42. // console.log(this.C * Math.pow((this.A - this.D) / (this.level - this.D) - 1, 1 / this.B))
  43. let center = this.center === [] ? [129.64920, 46.2844] : [this.center.lng, this.center.lat];
  44. bigemap3d.then(() => {
  45. // var center = [104.73673266358675,31.463626972537455];
  46. // console.log(center, 154);
  47. // window.bmgl.Config.HTTP_URL ='http://www.bigemap.com:9000';
  48. window.bmgl.Config.HTTP_URL = 'http://49.4.78.194:17143';
  49. // window.bmgl.Config.HTTP_URL = 'http://localhost:9000';
  50. let viewer = new bmgl.Viewer('container', {
  51. // mapId: 'bigemap.zhongkexingtu',
  52. terrainId: 'bigemap.hl-gaocheng',
  53. mapId:'bigemap.re-huafu',
  54. });
  55. window.viewer=viewer;
  56. viewer.camera.setView({
  57. destination: window.bmgl.Cartesian3.fromDegrees(...center, altitude),
  58. // viewer.camera.computeViewRectangle()
  59. // orientation: {
  60. // heading: 5.737109377827798,
  61. // roll: 6.281571490802099,
  62. // pitch: -0.3089655832119651,
  63. // }
  64. });
  65. let helper = new bmgl.EventHelper();
  66. helper.add(viewer.scene.globe.tileLoadProgressEvent, e => {
  67. var layer=viewer.imageryLayers.get(0);
  68. layer.imageryProvider._imageryProvider._resource._url=layer.imageryProvider._imageryProvider._resource._url.replace('9000','17143');
  69. console.log(layer.imageryProvider._imageryProvider._resource._url)
  70. helper.removeAll();
  71. helper=null;
  72. });
  73. var scene = viewer.scene;
  74. var handler = new bmgl.ScreenSpaceEventHandler(scene.canvas);
  75. var ellipsoid = scene.globe.ellipsoid; //得到当前三维场景的椭球体
  76. var longitudeString = null;
  77. var latitudeString = null;
  78. var height = null;
  79. var cartesian = null;
  80. var mouse_state = document.getElementById("mouse_state"); //显示状态信息
  81. // 鼠标移动触发事件
  82. handler.setInputAction(function (movement) {
  83. //通过指定的椭球或者地图对应的坐标系,将鼠标的二维坐标转换为对应椭球体三维坐标
  84. var ray = viewer.camera.getPickRay(movement.endPosition);
  85. var cartesian = viewer.scene.globe.pick(ray, viewer.scene);
  86. if (cartesian) {
  87. //将笛卡尔坐标转换为地理坐标
  88. var cartographic = ellipsoid.cartesianToCartographic(cartesian);
  89. //将弧度转为度的十进制度表示
  90. longitudeString = window.bmgl.Math.toDegrees(cartographic.longitude).toFixed(
  91. 7);
  92. latitudeString = window.bmgl.Math.toDegrees(cartographic.latitude).toFixed(7);
  93. //获取相机高度
  94. height = Math.ceil(viewer.camera.positionCartographic.height).toFixed(
  95. 3);
  96. mouse_state.innerText =
  97. `移动:经度: ${longitudeString},纬度: ${latitudeString} , 相机高度: ${height} `;
  98. } else {
  99. mouse_state.innerText = "";
  100. }
  101. }, window.bmgl.ScreenSpaceEventType.MOUSE_MOVE);
  102. // handler.setInputAction(function (movement) {
  103. // console.log(2)
  104. // cartesian = viewer.camera.pickEllipsoid(movement.position,
  105. // ellipsoid); //movement.endPosition
  106. // if (cartesian) {
  107. // //将笛卡尔坐标转换为地理坐标
  108. // var cartographic = window.bmgl.Cartographic.fromCartesian(cartesian);
  109. // longitudeString = window.bmgl.Math.toDegrees(cartographic.longitude).toFixed(
  110. // 3);
  111. // latitudeString = window.bmgl.Math.toDegrees(cartographic.latitude).toFixed(3);
  112. // //获取相机高度
  113. // height = Math.ceil(viewer.camera.positionCartographic.height);
  114. // mouse_state.innerText =
  115. // `左键双击 :( 经度: ${longitudeString.toFixed(5)},纬度: ${latitudeString.toFixed(5)} , 相机高度: ${height} )`;
  116. // } else {
  117. // mouse_state.innerText = '';
  118. // }
  119. // }, window.bmgl.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);
  120. // 鼠标平移
  121. //鼠标平移触发事件
  122. handler.setInputAction(function (movement) {
  123. var p = window.bmgl.Cartographic.fromCartesian(viewer.camera.position);
  124. cartesian = viewer.camera.pickEllipsoid(movement.position,
  125. ellipsoid); //movement.endPosition
  126. if (cartesian) {
  127. //将笛卡尔坐标转换为地理坐标
  128. var cartographic = window.bmgl.Cartographic.fromCartesian(cartesian);
  129. longitudeString = window.bmgl.Math.toDegrees(cartographic.longitude);
  130. //.toFixed(3);
  131. latitudeString = window.bmgl.Math.toDegrees(cartographic.latitude);
  132. //.toFixed(3);
  133. //获取相机高度
  134. height = Math.ceil(viewer.camera.positionCartographic.height);
  135. mouse_state.innerText =
  136. `左键抬起 : 经度: ${longitudeString.toFixed(5)},纬度: ${latitudeString.toFixed(5)} , 相机高度: ${height} `;
  137. } else {
  138. mouse_state.innerText = '';
  139. }
  140. _self.level = Math.round(_self.D + (_self.A - _self.D) / (1 + Math.pow(height / _self.C, _self.B)));
  141. _self.center = {lng: window.bmgl.Math.toDegrees(p.latitude), lat: window.bmgl.Math.toDegrees(p.longitude)};
  142. _self.$emit('changeZoom', _self.level)
  143. // console.log(_self.level,_self.center)
  144. }, window.bmgl.ScreenSpaceEventType.LEFT_DOWN);
  145. // 鼠标缩进触发事件
  146. handler.setInputAction(function (wheelment) {
  147. var p = window.bmgl.Cartographic.fromCartesian(viewer.camera.position);
  148. height = Math.ceil(viewer.camera.positionCartographic.height);
  149. mouse_state.innerText = `相机高度: ${height} (米)`;
  150. let position = {
  151. lng: window.bmgl.Math.toDegrees(p.longitude),
  152. lat: window.bmgl.Math.toDegrees(p.latitude)
  153. };
  154. // 高度转化成2D的地图级别
  155. _self.level = Math.round(_self.D + (_self.A - _self.D) / (1 + Math.pow(height / _self.C, _self.B)));
  156. _self.center = position;
  157. _self.$emit('changeZoom', _self.level)
  158. // console.log(_self.level,_self.center)
  159. }, window.bmgl.ScreenSpaceEventType.WHEEL);
  160. // 地图调整角度触发事件
  161. viewer.camera.changed.addEventListener(function (e) {
  162. // console.log("event");
  163. var p = window.bmgl.Cartographic.fromCartesian(viewer.camera.position);
  164. _self.level = Math.round(_self.D + (_self.A - _self.D) / (1 + Math.pow(p.height / _self.C, _self.B)));
  165. _self.center = {lng: window.bmgl.Math.toDegrees(p.latitude), lat: window.bmgl.Math.toDegrees(p.longitude)};
  166. _self.$emit('changeZoom', _self.level)
  167. // console.log(_self.level,_self.center)
  168. // console.log("-----------");
  169. })
  170. // 渲染所有风机、塔、拐点标记点位
  171. // console.log(this.mapData.allPointInfo)
  172. if (this.mapData.allPointInfo !== null && this.mapData.allPointInfo !== undefined) {
  173. let defaultImage = {
  174. heightReference: bmgl.HeightReference.CLAMP_TO_GROUND,
  175. image: '/img/fengji.png',
  176. scale: 0.6
  177. }
  178. let blueImage = {
  179. heightReference: bmgl.HeightReference.CLAMP_TO_GROUND,
  180. image: '/img/fengji/fengjiblue.png',
  181. scale: 0.2
  182. }
  183. let redImage = {
  184. heightReference: bmgl.HeightReference.CLAMP_TO_GROUND,
  185. image: '/img/fengji/fengjired.png',
  186. scale: 0.2
  187. }
  188. let image = [{
  189. billboard: {
  190. heightReference: bmgl.HeightReference.CLAMP_TO_GROUND,
  191. image: '/img/fengji/fengjigreen.png',
  192. scale: 0.2
  193. }
  194. }, {
  195. billboard: {
  196. heightReference: bmgl.HeightReference.CLAMP_TO_GROUND,
  197. image: '/img/fengji/fengjiyellow.png',
  198. scale: 0.2
  199. }
  200. }]
  201. let data = this.mapData.allPointInfo
  202. let i = 0
  203. for (let fan of data.fan) {
  204. if (i > 1) i = 0
  205. for (let item of fan.data) {
  206. if(fan.type === 'project'){
  207. viewer.entities.add({
  208. position: bmgl.Cartesian3.fromDegrees(Number(item.longitudeFan), Number(item.latitudeFan)),
  209. billboard: redImage
  210. });
  211. }else {
  212. if (item.type !== null) {
  213. if (item.type === '新') {
  214. viewer.entities.add({
  215. position: bmgl.Cartesian3.fromDegrees(Number(item.longitudeFan), Number(item.latitudeFan)),
  216. billboard: defaultImage
  217. });
  218. } else {
  219. viewer.entities.add({
  220. position: bmgl.Cartesian3.fromDegrees(Number(item.longitudeFan), Number(item.latitudeFan)),
  221. billboard: blueImage
  222. });
  223. }
  224. } else {
  225. viewer.entities.add({
  226. position: bmgl.Cartesian3.fromDegrees(Number(item.longitudeFan), Number(item.latitudeFan)),
  227. billboard: image[i].billboard
  228. });
  229. }
  230. }
  231. }
  232. i++;
  233. }
  234. for (let coordinatesList of data.coordinatesList) {
  235. for (let key in coordinatesList) {
  236. let coordinates = coordinatesList[key]
  237. for (let item of coordinates) {
  238. if (item.length > 0) {
  239. let latlngs = []
  240. for (let coor of item) {
  241. latlngs.push(Number(coor.longitude))
  242. latlngs.push(Number(coor.latitude))
  243. }
  244. viewer.entities.add({
  245. polygon: {
  246. hierarchy: bmgl.Cartesian3.fromDegreesArray(latlngs),
  247. extrudedHeight: 0,
  248. perPositionHeight: true,
  249. material: bmgl.Color.CYAN.withAlpha(0),
  250. outline: true,
  251. outlineColor: bmgl.Color.CYAN
  252. },
  253. });
  254. }
  255. }
  256. }
  257. }
  258. // 项目或者场站id
  259. let id = this.mapData.id
  260. for (let item of data.towerList) {
  261. let marker = viewer.entities.add({
  262. position: bmgl.Cartesian3.fromDegrees(Number(item.longitude), Number(item.latitude)),
  263. billboard: {
  264. heightReference: bmgl.HeightReference.CLAMP_TO_GROUND,
  265. image: '/largeScreenImg/project.png',
  266. scale: 0.15
  267. },
  268. });
  269. }
  270. /*环境监测仪*/
  271. for (let item of data.weather) {
  272. let marker = viewer.entities.add({
  273. position: bmgl.Cartesian3.fromDegrees(Number(item.longitude), Number(item.latitude)),
  274. billboard: {
  275. heightReference: bmgl.HeightReference.CLAMP_TO_GROUND,
  276. image: '/largeScreenImg/huanjingjianceyi.png',
  277. scale: 0.5
  278. },
  279. });
  280. }
  281. /*逆变器*/
  282. for (let inverter of data.inverter) {
  283. for (let item of inverter.data) {
  284. let marker = viewer.entities.add({
  285. position: bmgl.Cartesian3.fromDegrees(Number(item.longitude), Number(item.latitude)),
  286. billboard: {
  287. heightReference: bmgl.HeightReference.CLAMP_TO_GROUND,
  288. image: '/largeScreenImg/nibianqi.png',
  289. scale: 0.5
  290. },
  291. });
  292. }
  293. }
  294. }
  295. })
  296. }
  297. }
  298. }
  299. </script>
  300. <style scoped>
  301. #container {
  302. width: 100%;
  303. height: calc(90vh);
  304. }
  305. #mouse_state {
  306. position: absolute;
  307. bottom: 0;
  308. right: 5%;
  309. background-color: rgb(160, 160, 160);
  310. border: 1px solid rgb(89, 103, 116);
  311. color: rgba(51, 51, 51, 1);
  312. padding: 0 5px;
  313. }
  314. </style>