CesiumViewer.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  1. window.CESIUM_BASE_URL = '../../Source/';
  2. // import {
  3. // Cartesian3,
  4. // createWorldTerrain,
  5. // defined,
  6. // formatError,
  7. // Math as CesiumMath,
  8. // objectToQuery,
  9. // queryToObject,
  10. // CzmlDataSource,
  11. // GeoJsonDataSource,
  12. // KmlDataSource,
  13. // TileMapServiceImageryProvider,
  14. // Viewer,
  15. // viewerCesiumInspectorMixin,
  16. // viewerDragDropMixin,
  17. // UrlTemplateImageryProvider,
  18. // WebMapTileServiceImageryProvider,
  19. // GeographicTilingScheme
  20. // } from '../../Source/Cesium.js';
  21. import * as Cesium from '../../Source/Cesium.js';
  22. import{drawRectangle} from './rectangle.js'
  23. window.Cesium = Cesium
  24. var defined = Cesium.defined
  25. var formatError = Cesium.formatError
  26. var CesiumMath = Cesium.Math
  27. var objectToQuery = Cesium.objectToQuery
  28. var queryToObject = Cesium.queryToObject
  29. var TileMapServiceImageryProvider = Cesium.TileMapServiceImageryProvider
  30. var Viewer = Cesium.Viewer
  31. var viewerCesiumInspectorMixin = Cesium.viewerCesiumInspectorMixin
  32. var viewerDragDropMixin = Cesium.viewerDragDropMixin
  33. var UrlTemplateImageryProvider = Cesium.UrlTemplateImageryProvider
  34. var WebMapTileServiceImageryProvider = Cesium.WebMapTileServiceImageryProvider
  35. var GeographicTilingScheme = Cesium.GeographicTilingScheme
  36. // 创建热力图
  37. function createHeatMap(max, data) {
  38. // 创建元素
  39. var heatDoc = document.createElement("div");
  40. heatDoc.setAttribute("style", "width:1000px;height:1000px;margin: 0px;display: none;");
  41. document.body.appendChild(heatDoc);
  42. // 创建热力图对象
  43. var heatmap = h337.create({
  44. container: heatDoc,
  45. radius: 20,
  46. maxOpacity: .5,
  47. minOpacity: 0,
  48. blur: .75,
  49. gradient: {
  50. '0.9': 'red',
  51. '0.8': 'orange',
  52. '0.7': 'yellow',
  53. '0.5': 'blue',
  54. '0.3': 'green',
  55. },
  56. });
  57. // 添加数据
  58. heatmap.setData({
  59. max: max,
  60. data: data
  61. });
  62. return heatmap;
  63. }
  64. // 创建正方形 绑定热力图
  65. function createRectangle(viewer, coordinate, heatMap) {
  66. viewer.entities.add({
  67. name: 'Rotating rectangle with rotating texture coordinate',
  68. show: true,
  69. rectangle: {
  70. coordinates:new Cesium.Rectangle(coordinate[0], coordinate[1], coordinate[2], coordinate[3]), //Cesium.Rectangle.fromDegrees(coordinate[0], coordinate[1], coordinate[2], coordinate[3]),
  71. material: heatMap._renderer.canvas // 核心语句,填充热力图
  72. }
  73. });
  74. }
  75. // 生成len个随机数据
  76. function getData(len) {
  77. //构建一些随机数据点
  78. var points = [];
  79. var max = 0;
  80. var width = 1000;
  81. var height = 1000;
  82. while (len--) {
  83. var val = Math.floor(Math.random() * 500);
  84. max = Math.max(max, val);
  85. var point = {
  86. x: Math.floor(Math.random() * width),
  87. y: Math.floor(Math.random() * height),
  88. value: val
  89. };
  90. points.push(point);
  91. }
  92. return {
  93. max: max,
  94. data: points
  95. }
  96. }
  97. function main() {
  98. /*
  99. Options parsed from query string:
  100. source=url The URL of a CZML/GeoJSON/KML data source to load at startup.
  101. Automatic data type detection uses file extension.
  102. sourceType=czml/geojson/kml
  103. Override data type detection for source.
  104. flyTo=false Don't automatically fly to the loaded source.
  105. tmsImageryUrl=url Automatically use a TMS imagery provider.
  106. lookAt=id The ID of the entity to track at startup.
  107. stats=true Enable the FPS performance display.
  108. inspector=true Enable the inspector widget.
  109. debug=true Full WebGL error reporting at substantial performance cost.
  110. theme=lighter Use the dark-text-on-light-background theme.
  111. scene3DOnly=true Enable 3D only mode.
  112. view=longitude,latitude,[height,heading,pitch,roll]
  113. Automatically set a camera view. Values in degrees and meters.
  114. [height,heading,pitch,roll] default is looking straight down, [300,0,-90,0]
  115. saveCamera=false Don't automatically update the camera view in the URL when it changes.
  116. */
  117. var endUserOptions = queryToObject(window.location.search.substring(1));
  118. var imageryProvider;
  119. if (defined(endUserOptions.tmsImageryUrl)) {
  120. imageryProvider = new TileMapServiceImageryProvider({
  121. url: endUserOptions.tmsImageryUrl
  122. });
  123. }
  124. var loadingIndicator = document.getElementById('loadingIndicator');
  125. var viewer;
  126. try {
  127. // var hasBaseLayerPicker = !defined(imageryProvider);
  128. // viewer = new Viewer('cesiumContainer', {
  129. // imageryProvider : imageryProvider,
  130. // baseLayerPicker : hasBaseLayerPicker,
  131. // scene3DOnly : endUserOptions.scene3DOnly,
  132. // requestRenderMode : true
  133. // });
  134. // if (hasBaseLayerPicker) {
  135. // var viewModel = viewer.baseLayerPicker.viewModel;
  136. // viewModel.selectedTerrain = viewModel.terrainProviderViewModels[1];
  137. // } else {
  138. // viewer.terrainProvider = createWorldTerrain({
  139. // requestWaterMask: true,
  140. // requestVertexNormals: true
  141. // });
  142. // }
  143. var Google = new UrlTemplateImageryProvider({
  144. url: "http://mt3.google.cn/vt/lyrs=y@110&hl=zh-CN&gl=cn&src=app&x={x}&y={y}&z={z}&s=Ga",
  145. })
  146. var TianDiTu = new WebMapTileServiceImageryProvider({
  147. url: "http://{s}.tianditu.gov.cn/img_c/wmts?tk=4bbbafdfeca49cb6fb5efb1a40164445&service=wmts&request=GetTile&version=1.0.0" +
  148. "&LAYER=img&tileMatrixSet=c&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}" +
  149. "&style=default&format=tiles",
  150. layer: "tdtImg_c",
  151. style: "default",
  152. format: "tiles",
  153. tileMatrixSetID: "c",
  154. subdomains: ["t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7"],
  155. tilingScheme: new GeographicTilingScheme(),
  156. tileMatrixLabels: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19"],
  157. maximumLevel: 50,
  158. show: false
  159. })
  160. TianDiTu = new WebMapTileServiceImageryProvider({
  161. url: 'http://t0.tianditu.gov.cn/img_w/wmts?tk=4bbbafdfeca49cb6fb5efb1a40164445',
  162. layer: 'img',
  163. style: 'default',
  164. tileMatrixSetID: 'w',
  165. format: 'tiles',
  166. maximumLevel: 18
  167. });
  168. var PBF = createMVTWithStyle(Cesium, ol, createMapboxStreetsV6Style, {
  169. //url: '/static/poi/{z}/{x}/{y}.pbf',
  170. url: 'http://localhost:8080/wts/poi/{z}/{x}/{y}',
  171. //url:"https://a.tiles.mapbox.com/v4/mapbox.mapbox-streets-v6/{z}/{x}/{y}.vector.pbf?access_token={k}",
  172. key: "pk.eyJ1IjoibXV5YW8xOTg3IiwiYSI6ImNpcm9ueHd6cjAwNzZoa20xazY1aWlubjIifQ.5tLtC5j1rh8Eqjlyrq3OaA"
  173. });
  174. viewer = window.viewer = new Viewer('cesiumContainer', {
  175. resolutionScale: 1,
  176. terrainProviderViewModels: [],
  177. animation: false, //动画控制不显示
  178. baseLayerPicker: false,
  179. fullscreenButton: false, //全屏按钮,默认显示true
  180. geocoder: false, //地名查找,默认true
  181. timeline: false, //时间线,默认true
  182. vrButton: false, //双屏模式,默认不显示false
  183. homeButton: true, //主页按钮,默认true
  184. infoBox: false, //点击要素之后显示的信息,默认true
  185. selectionIndicator: false, //选中元素显示,默认true
  186. sceneModePicker: false, //是否显示投影方式控件
  187. navigationHelpButton: true, //是否显示帮助信息控件
  188. maximumRenderTimeChange: Infinity,
  189. requestRenderMode: true,
  190. imageryProvider: Google,
  191. });
  192. viewer.scene.debugShowFramesPerSecond = true;
  193. viewer.scene.screenSpaceCameraController.enableTranslate = false;
  194. viewer.scene.screenSpaceCameraController.enableTilt = false;
  195. viewer.scene.screenSpaceCameraController.enableLook = false;
  196. viewer.scene.screenSpaceCameraController.enableCollisionDetection = false;
  197. //var imageryLayers = viewer.imageryLayers;
  198. //imageryLayers.addImageryProvider(PBF);
  199. viewer.camera.setView({
  200. destination: Cesium.Cartesian3.fromDegrees(113.07242100, 22.58652789, 1000.0),
  201. orientation: {
  202. heading: 5.205384767667713,
  203. pitch: -1.0220630084744524,
  204. roll: 6.27919703978724
  205. }
  206. })
  207. // 第一个热力图
  208. // var coordinate1 = [1.9733857532084744, 0.39425835263667813, 1.9733970408057608, 0.39426568435545245];
  209. // var heatMap1 = createHeatMap(getData(1000).max, getData(1000).data);
  210. // createRectangle(viewer, coordinate1, heatMap1);
  211. // 第二个热力图
  212. // var coordinate2 = [-109.0, 30.0, -80.0, 41.0];
  213. // var heatMap2 = createHeatMap(getData(3000).max, getData(3000).data);
  214. // createRectangle(viewer, coordinate2, heatMap2);
  215. // // 第三个热力图
  216. // var coordinate3 = [-109.0, 41.0, -80.0, 50.0];
  217. // var heatMap3 = createHeatMap(getData(5000).max, getData(5000).data);
  218. // createRectangle(viewer, coordinate3, heatMap3);
  219. var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
  220. drawRectangle(Cesium,viewer,handler,function(coords){
  221. console.log(coords)
  222. var heatMap1 = createHeatMap(getData(1000).max, getData(1000).data);
  223. createRectangle(viewer, [coords.west,coords.south,coords.east,coords.north], heatMap1);
  224. })
  225. } catch (exception) {
  226. loadingIndicator.style.display = 'none';
  227. var message = formatError(exception);
  228. console.error(message);
  229. if (!document.querySelector('.cesium-widget-errorPanel')) {
  230. window.alert(message); //eslint-disable-line no-alert
  231. }
  232. return;
  233. }
  234. viewer.extend(viewerDragDropMixin);
  235. if (endUserOptions.inspector) {
  236. viewer.extend(viewerCesiumInspectorMixin);
  237. }
  238. var showLoadError = function (name, error) {
  239. var title = 'An error occurred while loading the file: ' + name;
  240. var message = 'An error occurred while loading the file, which may indicate that it is invalid. A detailed error report is below:';
  241. viewer.cesiumWidget.showErrorPanel(title, message, error);
  242. };
  243. viewer.dropError.addEventListener(function (viewerArg, name, error) {
  244. showLoadError(name, error);
  245. });
  246. var scene = viewer.scene;
  247. var context = scene.context;
  248. if (endUserOptions.debug) {
  249. context.validateShaderProgram = true;
  250. context.validateFramebuffer = true;
  251. context.logShaderCompilation = true;
  252. context.throwOnWebGLError = true;
  253. }
  254. // var view = endUserOptions.view;
  255. // var source = endUserOptions.source;
  256. // if (defined(source)) {
  257. // var sourceType = endUserOptions.sourceType;
  258. // if (!defined(sourceType)) {
  259. // // autodetect using file extension if not specified
  260. // if (/\.czml$/i.test(source)) {
  261. // sourceType = 'czml';
  262. // } else if (/\.geojson$/i.test(source) || /\.json$/i.test(source) || /\.topojson$/i.test(source)) {
  263. // sourceType = 'geojson';
  264. // } else if (/\.kml$/i.test(source) || /\.kmz$/i.test(source)) {
  265. // sourceType = 'kml';
  266. // }
  267. // }
  268. // var loadPromise;
  269. // if (sourceType === 'czml') {
  270. // loadPromise = CzmlDataSource.load(source);
  271. // } else if (sourceType === 'geojson') {
  272. // loadPromise = GeoJsonDataSource.load(source);
  273. // } else if (sourceType === 'kml') {
  274. // loadPromise = KmlDataSource.load(source, {
  275. // camera: scene.camera,
  276. // canvas: scene.canvas
  277. // });
  278. // } else {
  279. // showLoadError(source, 'Unknown format.');
  280. // }
  281. // if (defined(loadPromise)) {
  282. // viewer.dataSources.add(loadPromise).then(function (dataSource) {
  283. // var lookAt = endUserOptions.lookAt;
  284. // if (defined(lookAt)) {
  285. // var entity = dataSource.entities.getById(lookAt);
  286. // if (defined(entity)) {
  287. // viewer.trackedEntity = entity;
  288. // } else {
  289. // var error = 'No entity with id "' + lookAt + '" exists in the provided data source.';
  290. // showLoadError(source, error);
  291. // }
  292. // } else if (!defined(view) && endUserOptions.flyTo !== 'false') {
  293. // viewer.flyTo(dataSource);
  294. // }
  295. // }).otherwise(function (error) {
  296. // showLoadError(source, error);
  297. // });
  298. // }
  299. // }
  300. if (endUserOptions.stats) {
  301. scene.debugShowFramesPerSecond = true;
  302. }
  303. var theme = endUserOptions.theme;
  304. if (defined(theme)) {
  305. if (endUserOptions.theme === 'lighter') {
  306. document.body.classList.add('cesium-lighter');
  307. viewer.animation.applyThemeChanges();
  308. } else {
  309. var error = 'Unknown theme: ' + theme;
  310. viewer.cesiumWidget.showErrorPanel(error, '');
  311. }
  312. }
  313. // if (defined(view)) {
  314. // var splitQuery = view.split(/[ ,]+/);
  315. // if (splitQuery.length > 1) {
  316. // var longitude = !isNaN(+splitQuery[0]) ? +splitQuery[0] : 0.0;
  317. // var latitude = !isNaN(+splitQuery[1]) ? +splitQuery[1] : 0.0;
  318. // var height = ((splitQuery.length > 2) && (!isNaN(+splitQuery[2]))) ? +splitQuery[2] : 300.0;
  319. // var heading = ((splitQuery.length > 3) && (!isNaN(+splitQuery[3]))) ? CesiumMath.toRadians(+splitQuery[3]) : undefined;
  320. // var pitch = ((splitQuery.length > 4) && (!isNaN(+splitQuery[4]))) ? CesiumMath.toRadians(+splitQuery[4]) : undefined;
  321. // var roll = ((splitQuery.length > 5) && (!isNaN(+splitQuery[5]))) ? CesiumMath.toRadians(+splitQuery[5]) : undefined;
  322. // viewer.camera.setView({
  323. // destination: Cartesian3.fromDegrees(longitude, latitude, height),
  324. // orientation: {
  325. // heading: heading,
  326. // pitch: pitch,
  327. // roll: roll
  328. // }
  329. // });
  330. // }
  331. // }
  332. var camera = viewer.camera;
  333. function saveCamera() {
  334. var position = camera.positionCartographic;
  335. var hpr = '';
  336. if (defined(camera.heading)) {
  337. hpr = ',' + CesiumMath.toDegrees(camera.heading) + ',' + CesiumMath.toDegrees(camera.pitch) + ',' + CesiumMath.toDegrees(camera.roll);
  338. }
  339. endUserOptions.view = CesiumMath.toDegrees(position.longitude) + ',' + CesiumMath.toDegrees(position.latitude) + ',' + position.height + hpr;
  340. history.replaceState(undefined, '', '?' + objectToQuery(endUserOptions));
  341. }
  342. var timeout;
  343. if (endUserOptions.saveCamera !== 'false') {
  344. camera.changed.addEventListener(function () {
  345. window.clearTimeout(timeout);
  346. timeout = window.setTimeout(saveCamera, 1000);
  347. });
  348. }
  349. loadingIndicator.style.display = 'none';
  350. }
  351. main();