trafficsimulation.js 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. function onload(SuperMap3D) {
  2. var viewer = new SuperMap3D.Viewer('SuperMap3DContainer',{
  3. imageryProvider: new SuperMap3D.BingMapsImageryProvider({
  4. url : 'https://dev.virtualearth.net',
  5. mapStyle : SuperMap3D.BingMapsStyle.AERIAL
  6. })
  7. });
  8. var scene = viewer.scene;
  9. var widget = viewer.SuperMap3DWidget;
  10. var index = [];
  11. $('#loadingbar').remove();
  12. try{
  13. var promise = scene.open('http://support.supermap.com.cn:8090/iserver/services/3D-CBD/rest/realspace');
  14. SuperMap3D.when(promise,function(layer){
  15. //设置相机位置、视角,便于观察场景
  16. scene.camera.setView({
  17. destination : new SuperMap3D.Cartesian3(-2178804.249321984,4380733.469416426,4091924.387354936),
  18. orientation : {
  19. heading : 1.5724434357959591,
  20. pitch : -0.34259613828624147,
  21. roll : 6.283185307179563
  22. }
  23. });
  24. },function(){
  25. var title = '加载SCP失败,请检查网络连接状态或者url地址是否正确?';
  26. widget.showErrorPanel(title, undefined, e);
  27. });
  28. }
  29. catch(e){
  30. if (widget._showRenderLoopErrors) {
  31. var title = '渲染时发生错误,已停止渲染。';
  32. widget.showErrorPanel(title, undefined, e);
  33. }
  34. }
  35. var urls = [
  36. './data/car/qiche1.s3m',
  37. './data/car/qiche2.s3m',
  38. './data/car/qiche3.s3m',
  39. './data/car/qiche4.s3m',
  40. './data/car/qiche5.s3m',
  41. './data/car/qiche6.s3m',
  42. './data/car/qiche7.s3m',
  43. './data/car/qiche8.s3m',
  44. './data/car/qiche9.s3m',
  45. './data/car/qiche10.s3m',
  46. './data/car/qiche11.s3m',
  47. './data/car/qiche12.s3m',
  48. './data/car/qiche13.s3m',
  49. './data/car/qiche14.s3m',
  50. './data/car/qiche15.s3m',
  51. './data/car/qiche16.s3m',
  52. './data/car/qiche17.s3m',
  53. './data/car/qiche18.s3m',
  54. ];
  55. var Factor = urls.length;
  56. var keymap = {};
  57. for(var i = 0;i < Factor;i++){
  58. var url = urls[i];
  59. keymap[url] = [];
  60. }
  61. var layer = new SuperMap3D.DynamicLayer3D(scene.context,urls);
  62. scene.primitives.add(layer);
  63. doSqlQuery();
  64. function onQueryComplete(queryEventArgs){
  65. var airRoute = queryEventArgs.originResult.features;
  66. var startLines = createCarLines(airRoute);
  67. var count = startLines.length;
  68. var objects = [];
  69. for(var i = 0;i < count;i++){
  70. //每条线上有18辆车
  71. for(var j = 0;j < Factor;j++){
  72. var url = urls[j];
  73. var pts = startLines[i];
  74. var len = pts.length;
  75. var index = Math.floor(Math.random()*(len - 1));
  76. var half = len / 2;
  77. var dir = true;
  78. if(j == 0){
  79. index = 0;
  80. dir = true;
  81. }
  82. var point = pts[index];
  83. if(!point){
  84. continue;
  85. }
  86. var state = new SuperMap3D.DynamicObjectState({
  87. longitude : point.x,
  88. latitude : point.y,
  89. altitude : point.z,
  90. scale : new SuperMap3D.Cartesian3(1,1,1)
  91. });
  92. objects.push({
  93. state : state,
  94. dir : dir,
  95. index : index,
  96. origin : index
  97. });
  98. keymap[url].push(state);
  99. }
  100. }
  101. $("#loadingOverlay").remove();
  102. setInterval(function() {
  103. var m = 0;
  104. for(var i = 0;i < count;i++){
  105. var pts = startLines[i];
  106. if(pts.length == 0){
  107. m++;
  108. continue;
  109. }
  110. for(j = 0;j < Factor;j++){
  111. var url = urls[j];
  112. var obj = objects[(i-m)*Factor+j];
  113. var state = obj.state;
  114. var dir = obj.dir;
  115. var point;
  116. if(dir){
  117. obj.index += 1;
  118. point = pts[obj.index];
  119. if(!point){
  120. layer.clear(url,i);
  121. obj.index = obj.origin;
  122. point = pts[obj.index];
  123. }
  124. }
  125. state.longitude = point.x;
  126. state.latitude = point.y;
  127. state.altitude = point.z;
  128. }
  129. }
  130. for(var key in keymap){
  131. layer.updateObjectWithModel(key,keymap[key]);
  132. }
  133. }, 200);
  134. }
  135. function createCarLines(routes){
  136. var count = routes.length;
  137. var startLines = [];
  138. var otherLines = [];
  139. var startLine,otherLine;
  140. var startPoints=[];
  141. for (var i = 0; i < count; i++){
  142. var line = routes[i];
  143. var point3ds = line.geometry.points;
  144. var isStart = line.fieldValues[12];
  145. if(isStart == 'true'){
  146. startPoints.push(point3ds[0]);
  147. startline = [].concat(point3ds);
  148. startLines.push(startline);;
  149. }
  150. else{
  151. otherLine = [].concat(point3ds);
  152. otherLines.push(otherLine);
  153. }
  154. }
  155. var startPoint,endPoint;
  156. var allLines = [];
  157. while(otherLines.length > 147){
  158. for(var i = 0;i < startLines.length;i++){
  159. startline = startLines[i];
  160. var len = startline.length;
  161. endPoint = startline[len - 1];
  162. var sliceIndices = [];
  163. var flag = false;
  164. for(var j = 0;j < otherLines.length;j++){
  165. otherLine = otherLines[j];
  166. startPoint = otherLine[0];
  167. if(SuperMap3D.Math.equalsEpsilon(startPoint.x,endPoint.x,SuperMap3D.Math.EPSILON5)&& SuperMap3D.Math.equalsEpsilon(startPoint.y,endPoint.y,SuperMap3D.Math.EPSILON5) && SuperMap3D.Math.equalsEpsilon(startPoint.z,endPoint.z,SuperMap3D.Math.EPSILON5)){
  168. flag = true;
  169. line = [].concat(startline).concat(otherLine.slice(1));
  170. allLines.push(line);
  171. sliceIndices.push(j);
  172. }
  173. }
  174. if(!flag){
  175. allLines.push([].concat(startline));
  176. }
  177. for(var m = 0;m < sliceIndices.length;m++){
  178. var index = sliceIndices[m];
  179. otherLines.splice(index,1);
  180. }
  181. }
  182. startLines = [].concat(allLines);
  183. allLines.length = 0;
  184. }
  185. return startLines;
  186. }
  187. function doSqlQuery(){
  188. var getFeatureParam, getFeatureBySQLService, getFeatureBySQLParams;
  189. getFeatureParam = new SuperMap.REST.FilterParameter({
  190. attributeFilter: "SMID>0"
  191. });
  192. getFeatureBySQLParams = new SuperMap.REST.GetFeaturesBySQLParameters({
  193. queryParameter: getFeatureParam,
  194. toIndex:426,
  195. datasetNames: ["CBD车道:" + "车道三维"]
  196. });
  197. var url = 'http://www.supermapol.com/realspace/services/data-road/rest/data';
  198. getFeatureBySQLService = new SuperMap.REST.GetFeaturesBySQLService(url, {
  199. eventListeners: {"processCompleted": onQueryComplete, "processFailed": processFailed}});
  200. getFeatureBySQLService.processAsync(getFeatureBySQLParams);
  201. }
  202. function processFailed(queryEventArgs){
  203. }
  204. scene.postRender.addEventListener(function(){
  205. var lonR = viewer.camera.positionCartographic.longitude;
  206. var latR = viewer.camera.positionCartographic.latitude;
  207. var height = viewer.camera.positionCartographic.height;
  208. var lonD = SuperMap3D.Math.toDegrees(lonR).toFixed(4);
  209. var latD = SuperMap3D.Math.toDegrees(latR).toFixed(4);
  210. var heading = viewer.camera.heading.toFixed(4);
  211. var pitch = viewer.camera.pitch.toFixed(4);
  212. var i = 0;
  213. });
  214. }