cesium-city3d/examples/js/trafficsimulation.js

223 lines
8.9 KiB
JavaScript
Raw Permalink Normal View History

2020-08-03 18:04:41 +08:00
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;
});
}