define([ 'Cesium/Core/Cartesian3', 'Cesium/Core/createWorldTerrain', 'Cesium/Core/defined', 'Cesium/Core/formatError', 'Cesium/Core/Math', 'Cesium/Core/objectToQuery', 'Cesium/Core/queryToObject', 'Cesium/DataSources/CzmlDataSource', 'Cesium/DataSources/GeoJsonDataSource', 'Cesium/DataSources/KmlDataSource', 'Cesium/Scene/createTileMapServiceImageryProvider', 'Cesium/Widgets/Viewer/Viewer', 'Cesium/Widgets/Viewer/viewerCesiumInspectorMixin', 'Cesium/Widgets/Viewer/viewerDragDropMixin', 'domReady!' ], function( Cartesian3, createWorldTerrain, defined, formatError, CesiumMath, objectToQuery, queryToObject, CzmlDataSource, GeoJsonDataSource, KmlDataSource, createTileMapServiceImageryProvider, Viewer, viewerCesiumInspectorMixin, viewerDragDropMixin) { 'use strict'; /* Options parsed from query string: source=url The URL of a CZML/GeoJSON/KML data source to load at startup. Automatic data type detection uses file extension. sourceType=czml/geojson/kml Override data type detection for source. flyTo=false Don't automatically fly to the loaded source. tmsImageryUrl=url Automatically use a TMS imagery provider. lookAt=id The ID of the entity to track at startup. stats=true Enable the FPS performance display. inspector=true Enable the inspector widget. debug=true Full WebGL error reporting at substantial performance cost. theme=lighter Use the dark-text-on-light-background theme. scene3DOnly=true Enable 3D only mode. view=longitude,latitude,[height,heading,pitch,roll] Automatically set a camera view. Values in degrees and meters. [height,heading,pitch,roll] default is looking straight down, [300,0,-90,0] saveCamera=false Don't automatically update the camera view in the URL when it changes. */ var endUserOptions = queryToObject(window.location.search.substring(1)); var imageryProvider; if (defined(endUserOptions.tmsImageryUrl)) { imageryProvider = createTileMapServiceImageryProvider({ url : endUserOptions.tmsImageryUrl }); } var loadingIndicator = document.getElementById('loadingIndicator'); var viewer; try { var hasBaseLayerPicker = !defined(imageryProvider); viewer = new Viewer('cesiumContainer', { imageryProvider : imageryProvider, baseLayerPicker : hasBaseLayerPicker, scene3DOnly : endUserOptions.scene3DOnly, requestRenderMode : true }); if (hasBaseLayerPicker) { var viewModel = viewer.baseLayerPicker.viewModel; viewModel.selectedTerrain = viewModel.terrainProviderViewModels[1]; } else { viewer.terrainProvider = createWorldTerrain({ requestWaterMask: true, requestVertexNormals: true }); } } catch (exception) { loadingIndicator.style.display = 'none'; var message = formatError(exception); console.error(message); if (!document.querySelector('.cesium-widget-errorPanel')) { window.alert(message); //eslint-disable-line no-alert } return; } viewer.extend(viewerDragDropMixin); if (endUserOptions.inspector) { viewer.extend(viewerCesiumInspectorMixin); } var showLoadError = function(name, error) { var title = 'An error occurred while loading the file: ' + name; var message = 'An error occurred while loading the file, which may indicate that it is invalid. A detailed error report is below:'; viewer.cesiumWidget.showErrorPanel(title, message, error); }; viewer.dropError.addEventListener(function(viewerArg, name, error) { showLoadError(name, error); }); var scene = viewer.scene; var context = scene.context; if (endUserOptions.debug) { context.validateShaderProgram = true; context.validateFramebuffer = true; context.logShaderCompilation = true; context.throwOnWebGLError = true; } var view = endUserOptions.view; var source = endUserOptions.source; if (defined(source)) { var sourceType = endUserOptions.sourceType; if (!defined(sourceType)) { // autodetect using file extension if not specified if (/\.czml$/i.test(source)) { sourceType = 'czml'; } else if (/\.geojson$/i.test(source) || /\.json$/i.test(source) || /\.topojson$/i.test(source)) { sourceType = 'geojson'; } else if (/\.kml$/i.test(source) || /\.kmz$/i.test(source)) { sourceType = 'kml'; } } var loadPromise; if (sourceType === 'czml') { loadPromise = CzmlDataSource.load(source); } else if (sourceType === 'geojson') { loadPromise = GeoJsonDataSource.load(source); } else if (sourceType === 'kml') { loadPromise = KmlDataSource.load(source, { camera: scene.camera, canvas: scene.canvas }); } else { showLoadError(source, 'Unknown format.'); } if (defined(loadPromise)) { viewer.dataSources.add(loadPromise).then(function(dataSource) { var lookAt = endUserOptions.lookAt; if (defined(lookAt)) { var entity = dataSource.entities.getById(lookAt); if (defined(entity)) { viewer.trackedEntity = entity; } else { var error = 'No entity with id "' + lookAt + '" exists in the provided data source.'; showLoadError(source, error); } } else if (!defined(view) && endUserOptions.flyTo !== 'false') { viewer.flyTo(dataSource); } }).otherwise(function(error) { showLoadError(source, error); }); } } if (endUserOptions.stats) { scene.debugShowFramesPerSecond = true; } var theme = endUserOptions.theme; if (defined(theme)) { if (endUserOptions.theme === 'lighter') { document.body.classList.add('cesium-lighter'); viewer.animation.applyThemeChanges(); } else { var error = 'Unknown theme: ' + theme; viewer.cesiumWidget.showErrorPanel(error, ''); } } if (defined(view)) { var splitQuery = view.split(/[ ,]+/); if (splitQuery.length > 1) { var longitude = !isNaN(+splitQuery[0]) ? +splitQuery[0] : 0.0; var latitude = !isNaN(+splitQuery[1]) ? +splitQuery[1] : 0.0; var height = ((splitQuery.length > 2) && (!isNaN(+splitQuery[2]))) ? +splitQuery[2] : 300.0; var heading = ((splitQuery.length > 3) && (!isNaN(+splitQuery[3]))) ? CesiumMath.toRadians(+splitQuery[3]) : undefined; var pitch = ((splitQuery.length > 4) && (!isNaN(+splitQuery[4]))) ? CesiumMath.toRadians(+splitQuery[4]) : undefined; var roll = ((splitQuery.length > 5) && (!isNaN(+splitQuery[5]))) ? CesiumMath.toRadians(+splitQuery[5]) : undefined; viewer.camera.setView({ destination: Cartesian3.fromDegrees(longitude, latitude, height), orientation: { heading: heading, pitch: pitch, roll: roll } }); } } var camera = viewer.camera; function saveCamera() { var position = camera.positionCartographic; var hpr = ''; if (defined(camera.heading)) { hpr = ',' + CesiumMath.toDegrees(camera.heading) + ',' + CesiumMath.toDegrees(camera.pitch) + ',' + CesiumMath.toDegrees(camera.roll); } endUserOptions.view = CesiumMath.toDegrees(position.longitude) + ',' + CesiumMath.toDegrees(position.latitude) + ',' + position.height + hpr; history.replaceState(undefined, '', '?' + objectToQuery(endUserOptions)); } var timeout; if (endUserOptions.saveCamera !== 'false') { camera.changed.addEventListener(function() { window.clearTimeout(timeout); timeout = window.setTimeout(saveCamera, 1000); }); } loadingIndicator.style.display = 'none'; });