223 lines
8.9 KiB
JavaScript
223 lines
8.9 KiB
JavaScript
|
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;
|
|||
|
});
|
|||
|
|
|||
|
}
|