map.js 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. //DGE 是自主研发数字孪生框架
  2. //DGE 作者:tianhongguo
  3. let map = new DGE.Map('cesiumContainer', {
  4. animation:false, //左下角的动画仪表盘
  5. baseLayerPicker:false, //右上角的图层选择按钮
  6. geocoder:false, //搜索框
  7. homeButton:false, //home按钮
  8. sceneModePicker:false, //模式切换按钮
  9. timeline:false, //底部的时间轴
  10. navigationHelpButton:false, //右上角的帮助按钮,
  11. fullscreenButton:false, //右下角的全屏按钮
  12. infoBox: false, //是否显示点击要素之后显示的信息
  13. vrButton: true,
  14. infoBox: false,
  15. selectionIndicator: false,
  16. baseUrl:"./Source/"
  17. });
  18. map.viewer._cesiumWidget._creditContainer.style.display = "none";
  19. let tileset=map.data.threeDTiles.load({
  20. url:"https://testgis.4dage.com/liangqichaoshuju/tileset.json",
  21. height:10,
  22. maximumScreenSpaceError:40
  23. });
  24. let tileset1=map.data.threeDTiles.load({
  25. url:"https://testgis.4dage.com/liangqichaoguju3dtilesbufen/tileset.json",
  26. height:10,
  27. maximumScreenSpaceError:40
  28. });
  29. let tileset2=map.data.threeDTiles.load({
  30. url:"https://testgis.4dage.com/liangqichaoloutibufen/tileset.json",
  31. height:10,
  32. maximumScreenSpaceError:40
  33. });
  34. map.viewer.camera.setView({
  35. destination:new Global.Cartesian3.fromDegrees(line[0].lng,line[0].lat,line[0].alt),
  36. orientation:{
  37. heading : line[0].heading,
  38. pitch : line[0].pitch,
  39. roll : line[0].roll
  40. }
  41. });
  42. let options={};
  43. // 用于在使用重置导航重置地图视图时设置默认视图控制。接受的值是Cesium.Cartographic 和 Cesium.Rectangle.
  44. options.defaultResetView =Global.Rectangle.fromDegrees(80, 22, 130, 50);
  45. // 用于启用或禁用罗盘。true是启用罗盘,false是禁用罗盘。默认值为true。如果将选项设置为false,则罗盘将不会添加到地图中。
  46. options.enableCompass= true;
  47. // 用于启用或禁用缩放控件。true是启用,false是禁用。默认值为true。如果将选项设置为false,则缩放控件将不会添加到地图中。
  48. options.enableZoomControls= false;
  49. // 用于启用或禁用距离图例。true是启用,false是禁用。默认值为true。如果将选项设置为false,距离图例将不会添加到地图中。
  50. options.enableDistanceLegend= false;
  51. // 用于启用或禁用指南针外环。true是启用,false是禁用。默认值为true。如果将选项设置为false,则该环将可见但无效。
  52. options.enableCompassOuterRing= true;
  53. DGE.CesiumNavigation(map.viewer, options);
  54. let route =new DGE.FlyRoute("测试路线","FlyRouteId");
  55. line.map(({
  56. lng,
  57. lat,
  58. alt,
  59. heading,
  60. pitch,
  61. roll,
  62. waitTime,
  63. }) => {
  64. let step = new DGE.FlyStep(
  65. new DGE.P3(lng, lat, alt),
  66. heading,
  67. pitch,
  68. roll,
  69. waitTime
  70. );
  71. route.add(step); // 给飞行路线添加站点
  72. });
  73. route.speed = 2;
  74. map.flyManager.activeRoute = route;
  75. map.flyManager.add(route);
  76. var flyShow=false;
  77. var interval=null;
  78. var index=0;
  79. addLabels();
  80. //添加地名
  81. function addLabels(){
  82. ps.map(p=>{
  83. map.viewer.entities.add({
  84. id:p.name,
  85. position:Global.Cartesian3.fromDegrees(p.lng,p.lat,p.alt),
  86. label:{
  87. text:p.name,
  88. pixelOffset:new Global.Cartesian2(0,-22),
  89. scale:0.6,
  90. fillColor: Global.Color.WHITE
  91. },
  92. billboard:{
  93. image:"./imgs/label.png",
  94. scale:0.8
  95. },
  96. polyline:{
  97. positions:[Global.Cartesian3.fromDegrees(p.lng,p.lat,p.alt),Global.Cartesian3.fromDegrees(p.lng,p.lat,10)],
  98. material:new Global.Color(238/255,193/255,133/255)
  99. }
  100. });
  101. })
  102. intervalFun();
  103. }
  104. function intervalFun(){
  105. var j=0;
  106. interval=setInterval(()=>{
  107. if(flyShow){
  108. let ens=map.viewer.entities.values;
  109. for(let i=0;i<line.length;i++){
  110. if(i==map.flyManager.activeStepIndex){
  111. ens.map(e=>{
  112. e.label.fillColor=Global.Color.WHITE;
  113. e.billboard.image="./imgs/label.png";
  114. if(e.id==line[i].name) {
  115. e.billboard.image="./imgs/labelok.png";
  116. e.label.fillColor= new Global.Color(157/255,96/255,34/255);
  117. }
  118. })
  119. }
  120. }
  121. if(index==0&&j==0){
  122. addStr(line[index].str)
  123. }
  124. if(index!=map.flyManager.activeStepIndex){
  125. j=0;
  126. index=map.flyManager.activeStepIndex;
  127. if(line[index].str){
  128. addStr(line[index].str)
  129. }
  130. }
  131. j++;
  132. }
  133. },1000);
  134. }
  135. function addStr(str){
  136. var txtdiv=document.getElementById("font");
  137. while(txtdiv.hasChildNodes())
  138. {
  139. txtdiv.removeChild(txtdiv.firstChild);
  140. }
  141. if(str!="false"){
  142. var txt=document.createTextNode(str);
  143. txtdiv.appendChild(txt);
  144. }
  145. var width=(window.innerWidth-txtdiv.clientWidth)/2;
  146. txtdiv.style.left=width;
  147. let styleStr="position: absolute;z-index: 100;bottom: 10%;background-color:rgba(157,96,34,0.5);color:white;left:"+width+"px;"
  148. txtdiv.setAttribute('style',styleStr);
  149. }
  150. //清除
  151. function clear(){
  152. clearInterval(interval);
  153. var txtdiv=document.getElementById("font");
  154. while(txtdiv.hasChildNodes())
  155. {
  156. txtdiv.removeChild(txtdiv.firstChild);
  157. }
  158. txtdiv.display="none"
  159. }
  160. //开始播放
  161. function play(){
  162. map.flyManager.play();
  163. flyShow=true;
  164. var txtdiv=document.getElementById("font");
  165. txtdiv.display="block";
  166. intervalFun();
  167. }
  168. //暂停播放
  169. function pause(){
  170. map.flyManager.pause();
  171. }
  172. //继续播放
  173. function continueDo(){
  174. map.flyManager.continue();
  175. }
  176. //停止播放
  177. function stop(){
  178. map.flyManager.stop();
  179. clear();
  180. }
  181. // var handler = new Global.ScreenSpaceEventHandler(map.viewer.scene.canvas);
  182. // handler.setInputAction(function (event) {
  183. // //1.椭球面坐标:获取当前点击视线与椭球面相交处的坐标,在加载地形的场景上获取的坐标有误差
  184. // //var earthPosition = viewer.camera.pickEllipsoid(event.position,viewer.scene.globe.ellipsoid);
  185. // //2.场景坐标:获取场景中任意点击处的对应的世界坐标,需要开启“地形深度检测”(在未开启“地形深度检测”的情况下只能在3DTile上准确获取空间坐标,开启“地形深度检测”后,viewer.scene.pickPosition 也能在非3DTile上准确获取坐标)
  186. // map.viewer.scene.globe.depthTestAgainstTerrain = true;
  187. // var ellipsoid = map.viewer.scene.globe.ellipsoid;
  188. // var cartographic = ellipsoid.cartesianToCartographic(map.viewer.camera.position);
  189. // var lat = Global.Math.toDegrees(cartographic.latitude);
  190. // var lng = Global.Math.toDegrees(cartographic.longitude);
  191. // var alt = cartographic.height;
  192. // console.log({
  193. // lat:lat,
  194. // lng:lng,
  195. // alt:alt,
  196. // heading:map.viewer.camera.heading,
  197. // pitch:map.viewer.camera.pitch,
  198. // roll:map.viewer.camera.roll
  199. // })
  200. // }, Global.ScreenSpaceEventType.LEFT_CLICK);
  201. document.getElementById("fun").addEventListener("click",()=>{
  202. play()
  203. })
  204. document.getElementById("fun1").addEventListener("click",()=>{
  205. pause()
  206. })
  207. document.getElementById("fun2").addEventListener("click",()=>{
  208. continueDo()
  209. })
  210. document.getElementById("fun3").addEventListener("click",()=>{
  211. stop();
  212. })