cesium-examples/Cesium/Apps/CesiumViewer/CesiumViewer.js

222 lines
8.6 KiB
JavaScript

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';
});