Map.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  1. <template>
  2. <div id="skysceneryContainer"></div>
  3. </template>
  4. <script>
  5. export default {
  6. name: "Map",
  7. mounted() {
  8. window.SkySceneryConfig = {};
  9. this.getToken();
  10. },
  11. methods: {
  12. getToken() {
  13. let that = this;
  14. let loginInfo = new FormData();
  15. for (const key in userLoginConfig) {
  16. if (Object.prototype.hasOwnProperty.call(userLoginConfig, key)) {
  17. loginInfo.append(key, userLoginConfig[key]);
  18. }
  19. }
  20. fetch(oauthUrl + "/oauth/api/user/login", {
  21. method: "POST",
  22. body: loginInfo
  23. })
  24. .then(resp => resp.json())
  25. .then(data => {
  26. SkySceneryConfig = {
  27. authUrl: oauthUrl,
  28. token: data.message
  29. };
  30. that.pushAllScripts();
  31. });
  32. },
  33. pushAllScripts() {
  34. let that = this;
  35. that.addScripts(scriptObj.main).then(function() {
  36. let arr = scriptObj.plugins.map(function(src) {
  37. return that.addScripts(src);
  38. });
  39. Promise.all(arr).then(function() {
  40. setTimeout(() => {
  41. if (SkyScenery) {
  42. that.creatMap();
  43. } else {
  44. that.pushAllScripts();
  45. }
  46. });
  47. });
  48. });
  49. },
  50. addScripts(src) {
  51. return new Promise((resolve, reject) => {
  52. // 创建一个新的script标签
  53. var script = document.createElement("script");
  54. // 设置script标签的src属性为要引入的JavaScript文件的URL
  55. script.src = src;
  56. // 将script标签添加到页面的head部分或者其他合适的位置
  57. document.head.appendChild(script);
  58. if (script.readyState) {
  59. // IE
  60. script.onreadystatechange = function() {
  61. if (
  62. script.readyState === "loaded" ||
  63. script.readyState === "complete"
  64. ) {
  65. script.onreadystatechange = null;
  66. resolve();
  67. }
  68. };
  69. } else {
  70. // 其他浏览器
  71. script.onload = function() {
  72. resolve();
  73. };
  74. }
  75. });
  76. },
  77. creatMap() {
  78. try {
  79. let that = this;
  80. window.viewer = new SkyScenery.Viewer("skysceneryContainer", {
  81. animation: false, //是否创建动画小器件,左下角仪表
  82. baseLayerPicker: false, //是否显示图层选择器
  83. imageryProvider: new SkyScenery.SingleTileImageryProvider({
  84. url: (function createColorCanvas(color) {
  85. var width = 1,
  86. height = 1;
  87. var canvas = document.createElement("canvas");
  88. canvas.width = width;
  89. canvas.height = height;
  90. var ctx = canvas.getContext("2d");
  91. ctx.fillStyle = color;
  92. ctx.fillRect(0, 0, width, height);
  93. return canvas.toDataURL();
  94. })("#ffffff00"),
  95. rectangle: SkyScenery.Rectangle.fromDegrees(
  96. -180.0,
  97. -90.0,
  98. 180.0,
  99. 90.0
  100. )
  101. }),
  102. fullscreenButton: false, //是否显示全屏按钮
  103. geocoder: false, //是否显示geocoder小器件,右上角查询按钮
  104. homeButton: false, //是否显示Home按钮
  105. infoBox: false, //是否显示信息框
  106. sceneModePicker: false, //是否显示3D/2D选择器
  107. selectionIndicator: false, //是否显示选取指示器组件
  108. timeline: false, //是否显示时间轴
  109. navigationHelpButton: false, //是否显示右上角的帮助按钮
  110. scene3DOnly: true, //如果设置为true,则所有几何图形以3D模式绘制以节约GPU资源
  111. infoBox: false, //是否显示点击要素之后显示的信息
  112. shouldAnimate: false //是否自动播放
  113. });
  114. setTimeout(() => {
  115. // 根据配置文件中的配置信息加载底图
  116. systemConfig.imageryProviders.forEach(url => {
  117. that.loadTheWorldMapImage(url);
  118. });
  119. viewer.camera.setView({
  120. destination: SkyScenery.Cartesian3.fromDegrees(121, 31, 30000.0), // 设置位置
  121. orientation: {
  122. heading: SkyScenery.Math.toRadians(0.0), // 方向
  123. pitch: SkyScenery.Math.toRadians(-90.0), // 倾斜角度
  124. roll: 0
  125. }
  126. });
  127. this.$store.commit("createdMap", true);
  128. // // 盘龙天地
  129. // let tileName = "盘龙天地";
  130. // for (let key in systemConfig.data3DTiles[tileName]) {
  131. // let v = systemConfig.data3DTiles[tileName][key];
  132. // this.add3DTiles(v, true);
  133. // }
  134. // // 西虹桥
  135. // this.add3DTiles(systemConfig.data3DTiles["西虹桥"]["全部"], true);
  136. return;
  137. }, 0);
  138. // viewer.entities.add({
  139. // name: "点",
  140. // position: SkyScenery.Cartesian3.fromDegrees(121.1, 31), //经纬度转世界坐标
  141. // point: {
  142. // show: true,
  143. // color: SkyScenery.Color.GREEN,
  144. // pixelSize: 20,
  145. // outlineColor: SkyScenery.Color.YELLOW,
  146. // outlineWidth: 3,
  147. // },
  148. // label: {
  149. // text: "这里是标签", //设置文字内容
  150. // font: "normal 18px 楷体", //设置文字大小和字体
  151. // fillColor: SkyScenery.Color.fromCssColorString("#00ff00"), //设置文字填充的颜色
  152. // horizontalOrigin: SkyScenery.HorizontalOrigin.CENTER,
  153. // verticalOrigin: SkyScenery.VerticalOrigin.BOTTOM,
  154. // pixelOffset: new SkyScenery.Cartesian2(0, -20),
  155. // },
  156. // });
  157. // viewer.entities.add({
  158. // position: SkyScenery.Cartesian3.fromDegrees(121.2, 31),
  159. // billboard: {
  160. // image: "/static/image/point.png",
  161. // width: 48, // default: undefined
  162. // height: 48, // default: undefined
  163. // scale: 1.0, // default: 1.0
  164. // show: true, // default
  165. // horizontalOrigin: SkyScenery.HorizontalOrigin.CENTER, // default
  166. // verticalOrigin: SkyScenery.VerticalOrigin.BOTTOM, // default: CENTER
  167. // },
  168. // label: {
  169. // text: "这是自定义图片", // 设置文字内容
  170. // font: "normal 18px 楷体", // 设置文字大小和字体
  171. // fillColor: SkyScenery.Color.fromCssColorString("#00ff00"), //设置文字填充的颜色
  172. // horizontalOrigin: SkyScenery.HorizontalOrigin.CENTER,
  173. // verticalOrigin: SkyScenery.VerticalOrigin.BOTTOM,
  174. // pixelOffset: new SkyScenery.Cartesian2(0, -50),
  175. // },
  176. // });
  177. // let positions = [
  178. // [121.04829640102727, 31.12735759260756],
  179. // [121.05219953077487, 31.126058264888133],
  180. // [121.0556573133586, 31.125143117515066],
  181. // [121.0585577885634, 31.12489903339664],
  182. // [121.05855842602281, 31.117437091290032],
  183. // [121.05755469646111, 31.116865171387122],
  184. // [121.05855867110577, 31.114567660254956],
  185. // [121.05716503781966, 31.111412856109656],
  186. // [121.05169919616742, 31.109414349328368],
  187. // [121.04846566530048, 31.10731617798831],
  188. // [121.04523257218045, 31.105074455848328],
  189. // [121.04372646220537, 31.108713847196935],
  190. // [121.04238895034425, 31.11239990163383],
  191. // [121.04216536839769, 31.11503097997496],
  192. // [121.03965751482633, 31.117141773623022],
  193. // [121.0392664980893, 31.119247569299414],
  194. // [121.0401584271992, 31.124267692010815],
  195. // [121.04534263782213, 31.124207732078528],
  196. // [121.04813004860797, 31.124919266167907],
  197. // [121.04829640102727, 31.12735759260756],
  198. // ];
  199. // viewer.entities.add({
  200. // name: "立体墙效果",
  201. // wall: {
  202. // positions: positions.map(function (item) {
  203. // return SkyScenery.Cartesian3.fromDegrees(item[0], item[1]);
  204. // }),
  205. // // 设置高度
  206. // maximumHeights: new Array(positions.length).fill(100),
  207. // minimumHeights: new Array(positions.length).fill(0),
  208. // material: new SkyScenery.DynamicWallMaterialProperty({
  209. // color: SkyScenery.Color.fromCssColorString("#00c4ff80"),
  210. // trailImage: "/static/image/color.png",
  211. // duration: 3000,
  212. // }),
  213. // },
  214. // });
  215. // viewer.entities.add({
  216. // name: " 面",
  217. // polygon: {
  218. // hierarchy: {
  219. // positions: SkyScenery.Cartesian3.fromDegreesArray(
  220. // positions
  221. // .join(",")
  222. // .split(",")
  223. // .map(function (num) {
  224. // return Number(num);
  225. // })
  226. // ),
  227. // },
  228. // material: new SkyScenery.ImageMaterialProperty({
  229. // image: "/static/image/b2.png", // 图片路径
  230. // transparent: true, // 是否透明
  231. // }),
  232. // },
  233. // });
  234. } catch (error) {
  235. console.log("createMap error:", error);
  236. window.location.reload();
  237. }
  238. },
  239. /**
  240. * 加载天地图底图
  241. * @author LiuMengxiang
  242. * 加载影像底图和影像注记
  243. */
  244. loadTheWorldMapImage(url) {
  245. // if (url.indexOf("//t0.") != -1) {
  246. // url = url.replace("//t0.", "//t{s}.");
  247. // }
  248. // viewer.imageryLayers.addImageryProvider(
  249. // new SkyScenery.WebMapTileServiceImageryProvider({
  250. // url:
  251. // url +
  252. // "?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=" +
  253. // systemConfig.tdt_tk,
  254. // layer: "img",
  255. // style: "default",
  256. // tileMatrixSetID: "w",
  257. // format: "image/jpeg",
  258. // subdomains: ["0", "1", "2", "3", "4", "5", "6", "7"],
  259. // show: true,
  260. // minimumLevel: 1,
  261. // maximumLevel: 18
  262. // })
  263. // );
  264. viewer.imageryLayers.addImageryProvider(
  265. new SkyScenery.ArcGisMapServerImageryProvider({
  266. url:
  267. "https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer"
  268. })
  269. );
  270. viewer.camera.setView({
  271. destination: SkyScenery.Cartesian3.fromDegrees(121, 31, 30000.0), // 设置位置
  272. orientation: {
  273. heading: SkyScenery.Math.toRadians(0.0), // 方向
  274. pitch: SkyScenery.Math.toRadians(-90.0), // 倾斜角度
  275. roll: 0
  276. }
  277. });
  278. },
  279. // 加载geojson数据
  280. addGeoJson(url, options) {
  281. // options = {
  282. // point: {
  283. // imgUrl: ""
  284. // },
  285. // polyline: {
  286. // color: "#ffffff",
  287. // width: 3,
  288. // alpha: 0.7
  289. // },
  290. // polygon: {
  291. // outerColor: "#ffffff",
  292. // outerWidth: 3,
  293. // innerColor: "#ffffff",
  294. // alpha: 0.7
  295. // }
  296. // };
  297. SkyScenery.GeoJsonDataSource.load(url).then(function(dataSource) {
  298. viewer.dataSources.add(dataSource);
  299. var entities = dataSource.entities.values;
  300. for (var i = 0; i < entities.length; i++) {
  301. var entity = entities[i];
  302. if (entity.billboard) {
  303. entity.billboard = undefined;
  304. entity.billboard = new SkyScenery.BillboardGraphics({
  305. image: options.point.imgUrl,
  306. width: 50,
  307. height: 50,
  308. pixelOffset: new SkyScenery.Cartesian2(0, -25),
  309. heightReference: SkyScenery.HeightReference.CLAMP_TO_GROUND
  310. });
  311. }
  312. if (entity.polyline) {
  313. entity.polyline.width = options.polyline.width;
  314. entity.polyline.material = SkyScenery.Color.fromCssColorString(
  315. options.polyline.color
  316. ).withAlpha(options.polyline.alpha); // 颜色
  317. }
  318. if (entity.polygon) {
  319. entity.polygon.height = 0.2;
  320. entity.polygon.outline = true; // 边框是否显示
  321. entity.polygon.outlineColor = SkyScenery.Color.fromCssColorString(
  322. options.polygon.outerColor
  323. ); // 边框颜色
  324. entity.polygon.outlineWidth = options.polygon.outerWidth; // 边框宽度
  325. entity.polygon.material = SkyScenery.Color.fromCssColorString(
  326. options.polygon.innerColor
  327. ).withAlpha(options.polygon.alpha); // 填充色
  328. }
  329. }
  330. });
  331. },
  332. // 加载动态围墙
  333. addDynamicWall(positions, options) {
  334. /**
  335. * options = {
  336. * maxH: 100,
  337. * color: "#00c4ff80",
  338. * duration: 3000,
  339. * }
  340. */
  341. return viewer.entities.add({
  342. name: "立体墙效果",
  343. wall: {
  344. positions: positions.map(function(item) {
  345. return SkyScenery.Cartesian3.fromDegrees(item[0], item[1]);
  346. }),
  347. // 设置高度
  348. maximumHeights: new Array(positions.length).fill(options.maxH || 100),
  349. minimumHeights: new Array(positions.length).fill(0),
  350. material: new SkyScenery.DynamicWallMaterialProperty({
  351. color: SkyScenery.Color.fromCssColorString(options.color), // "#"
  352. trailImage: "/static/image/color.png",
  353. duration: options.duration || 3000 // 3000
  354. })
  355. }
  356. });
  357. },
  358. /**
  359. * 加载3Dtiles
  360. * @author LiuMengxiang
  361. * @param {*} url 3Dtiles的url地址
  362. * @param {*} flyto 是否自动飞行到3Dtiles
  363. */
  364. add3DTiles(url, flyto) {
  365. // let that = this;
  366. let option = {
  367. url: url + "/tileset.json",
  368. skipLevelOfDetail: true, //开启跳级加载
  369. maximumMemoryUsage: 1024, //最大内存占用 推荐显存的一般
  370. preferLeaves: true,
  371. maximumScreenSpaceError: 16,
  372. maximumNumberOfLoadedTiles: 2000
  373. };
  374. // option = Object.assign(option, options);
  375. var tile = new SkyScenery.Cesium3DTileset(option);
  376. viewer.scene.primitives.add(tile);
  377. if (flyto) {
  378. tile.readyPromise.then(function(tileset) {
  379. viewer.zoomTo(tile);
  380. // if (url.indexOf("jz") != -1) {
  381. // setTimeout(() => {
  382. // that.remove3Dtiles(tile);
  383. // }, 5000);
  384. // }
  385. });
  386. }
  387. return tile;
  388. // let tile = SkyScenery.add3DTilesData(url + "/tileset.json", viewer);
  389. // viewer.scene.primitives.add(tile);
  390. // if (flyto) {
  391. // tile.readyPromise.then(function(tileset) {
  392. // viewer.zoomTo(tile);
  393. // if (url.indexOf("jz") != -1) {
  394. // setTimeout(() => {
  395. // that.remove3Dtiles(tile);
  396. // }, 5000);
  397. // }
  398. // });
  399. // }
  400. // return tile;
  401. },
  402. /**
  403. * 删除3DTiles(测试)
  404. * @author LiuMengxiang
  405. * @param tiles 3DTiles实例
  406. */
  407. remove3Dtiles(tiles) {
  408. viewer.scene.primitives.remove(tiles);
  409. }
  410. }
  411. };
  412. </script>
  413. <style lang="less" scoped>
  414. #skysceneryContainer {
  415. width: 100%;
  416. height: 100%;
  417. }
  418. </style>