cesium-city3d/examples/js/trafficsimulation.js

223 lines
8.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

function onload(Cesium) {
var viewer = new Cesium.Viewer('cesiumContainer',{
imageryProvider: new Cesium.BingMapsImageryProvider({
url : 'https://dev.virtualearth.net',
mapStyle : Cesium.BingMapsStyle.AERIAL
})
});
var scene = viewer.scene;
var widget = viewer.cesiumWidget;
var index = [];
$('#loadingbar').remove();
try{
var promise = scene.open('http://support.supermap.com.cn:8090/iserver/services/3D-CBD/rest/realspace');
Cesium.when(promise,function(layer){
//设置相机位置、视角,便于观察场景
scene.camera.setView({
destination : new Cesium.Cartesian3(-2178804.249321984,4380733.469416426,4091924.387354936),
orientation : {
heading : 1.5724434357959591,
pitch : -0.34259613828624147,
roll : 6.283185307179563
}
});
},function(){
var title = '加载SCP失败请检查网络连接状态或者url地址是否正确';
widget.showErrorPanel(title, undefined, e);
});
}
catch(e){
if (widget._showRenderLoopErrors) {
var title = '渲染时发生错误,已停止渲染。';
widget.showErrorPanel(title, undefined, e);
}
}
var urls = [
'./data/car/qiche1.s3m',
'./data/car/qiche2.s3m',
'./data/car/qiche3.s3m',
'./data/car/qiche4.s3m',
'./data/car/qiche5.s3m',
'./data/car/qiche6.s3m',
'./data/car/qiche7.s3m',
'./data/car/qiche8.s3m',
'./data/car/qiche9.s3m',
'./data/car/qiche10.s3m',
'./data/car/qiche11.s3m',
'./data/car/qiche12.s3m',
'./data/car/qiche13.s3m',
'./data/car/qiche14.s3m',
'./data/car/qiche15.s3m',
'./data/car/qiche16.s3m',
'./data/car/qiche17.s3m',
'./data/car/qiche18.s3m',
];
var Factor = urls.length;
var keymap = {};
for(var i = 0;i < Factor;i++){
var url = urls[i];
keymap[url] = [];
}
var layer = new Cesium.DynamicLayer3D(scene.context,urls);
scene.primitives.add(layer);
doSqlQuery();
function onQueryComplete(queryEventArgs){
var airRoute = queryEventArgs.originResult.features;
var startLines = createCarLines(airRoute);
var count = startLines.length;
var objects = [];
for(var i = 0;i < count;i++){
//每条线上有18辆车
for(var j = 0;j < Factor;j++){
var url = urls[j];
var pts = startLines[i];
var len = pts.length;
var index = Math.floor(Math.random()*(len - 1));
var half = len / 2;
var dir = true;
if(j == 0){
index = 0;
dir = true;
}
var point = pts[index];
if(!point){
continue;
}
var state = new Cesium.DynamicObjectState({
longitude : point.x,
latitude : point.y,
altitude : point.z,
scale : new Cesium.Cartesian3(1,1,1)
});
objects.push({
state : state,
dir : dir,
index : index,
origin : index
});
keymap[url].push(state);
}
}
$("#loadingOverlay").remove();
setInterval(function() {
var m = 0;
for(var i = 0;i < count;i++){
var pts = startLines[i];
if(pts.length == 0){
m++;
continue;
}
for(j = 0;j < Factor;j++){
var url = urls[j];
var obj = objects[(i-m)*Factor+j];
var state = obj.state;
var dir = obj.dir;
var point;
if(dir){
obj.index += 1;
point = pts[obj.index];
if(!point){
layer.clear(url,i);
obj.index = obj.origin;
point = pts[obj.index];
}
}
state.longitude = point.x;
state.latitude = point.y;
state.altitude = point.z;
}
}
for(var key in keymap){
layer.updateObjectWithModel(key,keymap[key]);
}
}, 200);
}
function createCarLines(routes){
var count = routes.length;
var startLines = [];
var otherLines = [];
var startLine,otherLine;
var startPoints=[];
for (var i = 0; i < count; i++){
var line = routes[i];
var point3ds = line.geometry.points;
var isStart = line.fieldValues[12];
if(isStart == 'true'){
startPoints.push(point3ds[0]);
startline = [].concat(point3ds);
startLines.push(startline);;
}
else{
otherLine = [].concat(point3ds);
otherLines.push(otherLine);
}
}
var startPoint,endPoint;
var allLines = [];
while(otherLines.length > 147){
for(var i = 0;i < startLines.length;i++){
startline = startLines[i];
var len = startline.length;
endPoint = startline[len - 1];
var sliceIndices = [];
var flag = false;
for(var j = 0;j < otherLines.length;j++){
otherLine = otherLines[j];
startPoint = otherLine[0];
if(Cesium.Math.equalsEpsilon(startPoint.x,endPoint.x,Cesium.Math.EPSILON5)&& Cesium.Math.equalsEpsilon(startPoint.y,endPoint.y,Cesium.Math.EPSILON5) && Cesium.Math.equalsEpsilon(startPoint.z,endPoint.z,Cesium.Math.EPSILON5)){
flag = true;
line = [].concat(startline).concat(otherLine.slice(1));
allLines.push(line);
sliceIndices.push(j);
}
}
if(!flag){
allLines.push([].concat(startline));
}
for(var m = 0;m < sliceIndices.length;m++){
var index = sliceIndices[m];
otherLines.splice(index,1);
}
}
startLines = [].concat(allLines);
allLines.length = 0;
}
return startLines;
}
function doSqlQuery(){
var getFeatureParam, getFeatureBySQLService, getFeatureBySQLParams;
getFeatureParam = new SuperMap.REST.FilterParameter({
attributeFilter: "SMID>0"
});
getFeatureBySQLParams = new SuperMap.REST.GetFeaturesBySQLParameters({
queryParameter: getFeatureParam,
toIndex:426,
datasetNames: ["CBD车道:" + "车道三维"]
});
var url = 'http://www.supermapol.com/realspace/services/data-road/rest/data';
getFeatureBySQLService = new SuperMap.REST.GetFeaturesBySQLService(url, {
eventListeners: {"processCompleted": onQueryComplete, "processFailed": processFailed}});
getFeatureBySQLService.processAsync(getFeatureBySQLParams);
}
function processFailed(queryEventArgs){
}
scene.postRender.addEventListener(function(){
var lonR = viewer.camera.positionCartographic.longitude;
var latR = viewer.camera.positionCartographic.latitude;
var height = viewer.camera.positionCartographic.height;
var lonD = Cesium.Math.toDegrees(lonR).toFixed(4);
var latD = Cesium.Math.toDegrees(latR).toFixed(4);
var heading = viewer.camera.heading.toFixed(4);
var pitch = viewer.camera.pitch.toFixed(4);
var i = 0;
});
}