map.js 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. //DGE 是自主研发数字孪生框架
  2. //DGE 作者:tianhongguo
  3. let map = new DGE.Map('container', {
  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. let tileset=map.data.threeDTiles.load({
  19. url:"https://testgis.4dage.com/liangqichaoshuju/tileset.json",
  20. height:10,
  21. maximumScreenSpaceError:40
  22. });
  23. let tileset1=map.data.threeDTiles.load({
  24. url:"https://testgis.4dage.com/liangqichaoguju3dtilesbufen/tileset.json",
  25. height:10,
  26. maximumScreenSpaceError:40
  27. });
  28. let tileset2=map.data.threeDTiles.load({
  29. url:"https://testgis.4dage.com/liangqichaoloutibufen/tileset.json",
  30. height:10,
  31. maximumScreenSpaceError:40
  32. });
  33. map.viewer.camera.setView({
  34. destination:new Global.Cartesian3.fromDegrees(line[0].lng,line[0].lat,line[0].alt),
  35. orientation:{
  36. heading : line[0].heading,
  37. pitch : line[0].pitch,
  38. roll : line[0].roll
  39. }
  40. });
  41. let options={};
  42. // 用于在使用重置导航重置地图视图时设置默认视图控制。接受的值是Cesium.Cartographic 和 Cesium.Rectangle.
  43. options.defaultResetView =Global.Rectangle.fromDegrees(80, 22, 130, 50);
  44. // 用于启用或禁用罗盘。true是启用罗盘,false是禁用罗盘。默认值为true。如果将选项设置为false,则罗盘将不会添加到地图中。
  45. options.enableCompass= true;
  46. // 用于启用或禁用缩放控件。true是启用,false是禁用。默认值为true。如果将选项设置为false,则缩放控件将不会添加到地图中。
  47. options.enableZoomControls= false;
  48. // 用于启用或禁用距离图例。true是启用,false是禁用。默认值为true。如果将选项设置为false,距离图例将不会添加到地图中。
  49. options.enableDistanceLegend= false;
  50. // 用于启用或禁用指南针外环。true是启用,false是禁用。默认值为true。如果将选项设置为false,则该环将可见但无效。
  51. options.enableCompassOuterRing= true;
  52. DGE.MapNavigation(map.viewer, options);
  53. let route =new DGE.FlyRoute("测试路线","FlyRouteId");
  54. line.map(({
  55. lng,
  56. lat,
  57. alt,
  58. heading,
  59. pitch,
  60. roll,
  61. waitTime,
  62. }) => {
  63. let step = new DGE.FlyStep(
  64. new DGE.P3(lng, lat, alt),
  65. heading,
  66. pitch,
  67. roll,
  68. waitTime
  69. );
  70. route.add(step); // 给飞行路线添加站点
  71. });
  72. route.speed = 2;
  73. map.flyManager.activeRoute = route;
  74. map.flyManager.add(route);
  75. var flyShow=false;
  76. var interval=null;
  77. var index=0;
  78. addLabels();
  79. //添加地名
  80. function addLabels(){
  81. ps.map(p=>{
  82. map.viewer.entities.add({
  83. id:p.name,
  84. position:Global.Cartesian3.fromDegrees(p.lng,p.lat,p.alt),
  85. label:{
  86. text:p.name,
  87. pixelOffset:new Global.Cartesian2(0,-22),
  88. scale:0.6,
  89. fillColor: Global.Color.WHITE
  90. },
  91. billboard:{
  92. image:"./imgs/label.png",
  93. scale:0.8
  94. },
  95. // polyline:{
  96. // // positions:[Global.Cartesian3.fromDegrees(p.lng,p.lat,p.alt),Global.Cartesian3.fromDegrees(p.lng,p.lat,10)],
  97. // material:new Global.Color(238/255,193/255,133/255),
  98. // width:3
  99. // }
  100. });
  101. })
  102. }
  103. function intervalFun(){
  104. var j=0;//同一个时间段重复运行
  105. interval&&clearInterval(interval)
  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!=map.flyManager.activeStepIndex){
  122. j=0;
  123. index=map.flyManager.activeStepIndex;
  124. if(line[index].str){
  125. addStr(line[index].str)
  126. }
  127. }
  128. if(index==0&&j==0){
  129. addStr(line[index].str)
  130. }
  131. if(index==line.length-2){
  132. clear()
  133. }
  134. let txtdiv=document.getElementById("font");
  135. setFont(line[index].str,txtdiv)
  136. j++;
  137. }
  138. },300);
  139. }
  140. function addStr(str){
  141. let txtdiv=document.getElementById("font");
  142. while(txtdiv.hasChildNodes())
  143. {
  144. txtdiv.removeChild(txtdiv.firstChild);
  145. }
  146. if(str!=""){
  147. setFont(str,txtdiv)
  148. }
  149. // setFontStyle()
  150. }
  151. /**
  152. * 根据屏幕大小动态调节换行
  153. * @param {*} str 字符串
  154. * @param {*} txtdiv 字符串要展示的div
  155. */
  156. function setFont(str,txtdiv){
  157. let count =parseInt(20/400*window.innerWidth);
  158. let strCount=str.length;
  159. let rows=Math.ceil(strCount/count);
  160. let endCount=strCount%count;
  161. let rowCounts=[];
  162. let innertxt="";
  163. for(let i=1;i<rows;i++){
  164. rowCounts.push(count);
  165. innertxt+=str.substr(count*(i-1),count)+"<br>";
  166. }
  167. rowCounts.push(endCount)
  168. innertxt+=str.substr(count*(rows-1),endCount==0?count:endCount);
  169. txtdiv.innerHTML=innertxt;
  170. let width=(window.innerWidth-txtdiv.clientWidth)/2;
  171. let fontsize=14/1920 *window.innerWidth*(6*400/window.innerWidth);
  172. let left=(width/window.innerWidth)*100+"%";
  173. let padding=fontsize/2+"px "+fontsize/2+"px "+fontsize/2+"px "+fontsize/2+"px";
  174. let styleStr="position: absolute;z-index: 100;background-color:rgba(157,96,34,0.5);padding:"+padding+";color:white;left:"+left+";font-size:"+fontsize+"px;";
  175. //styleStr+="lineHeight:"+5*rows+"px;";
  176. styleStr+=" line-height:23px;"
  177. styleStr+="height:"+(25*rows)+"px;"
  178. txtdiv.setAttribute('style',styleStr);
  179. }
  180. // //字体自动大小适应
  181. // function setFontStyle(){
  182. // var txtdiv=document.getElementById("font");
  183. // let width=(window.innerWidth-txtdiv.clientWidth)/2;
  184. // let fontsize=14/1920 *window.innerWidth/4;
  185. // var left=(width/window.innerWidth)*100+"%";
  186. // let styleStr="position: absolute;z-index: 100;bottom: 10%;background-color:rgba(157,96,34,0.5);color:white;left:"+left+";font-size:"+fontsize+"px"
  187. // txtdiv.setAttribute('style',styleStr);
  188. // }
  189. //清除
  190. function clear(){
  191. clearInterval(interval);
  192. var txtdiv=document.getElementById("font");
  193. while(txtdiv.hasChildNodes())
  194. {
  195. txtdiv.removeChild(txtdiv.firstChild);
  196. }
  197. txtdiv.display="none"
  198. txtdiv.style.backgroundColor="rgba(157,96,34,0.01);"
  199. console.log("clear")
  200. }
  201. //开始播放
  202. function play(){
  203. map.flyManager.play();
  204. flyShow=true;
  205. var txtdiv=document.getElementById("font");
  206. txtdiv.display="block";
  207. intervalFun();
  208. }
  209. //暂停播放
  210. function pause(){
  211. map.flyManager.pause();
  212. }
  213. //继续播放
  214. function continueDo(){
  215. map.flyManager.continue();
  216. }
  217. //停止播放
  218. function stop(){
  219. map.flyManager.stop();
  220. clear();
  221. }
  222. // var handler = new Global.ScreenSpaceEventHandler(map.viewer.scene.canvas);
  223. // handler.setInputAction(function (event) {
  224. // //1.椭球面坐标:获取当前点击视线与椭球面相交处的坐标,在加载地形的场景上获取的坐标有误差
  225. // // var earthPosition = map.viewer.camera.pickEllipsoid(event.position,map.viewer.scene.globe.ellipsoid);
  226. // //2.场景坐标:获取场景中任意点击处的对应的世界坐标,需要开启“地形深度检测”(在未开启“地形深度检测”的情况下只能在3DTile上准确获取空间坐标,开启“地形深度检测”后,viewer.scene.pickPosition 也能在非3DTile上准确获取坐标)
  227. // map.viewer.scene.globe.depthTestAgainstTerrain = true;
  228. // var position1 = map.viewer.scene.pickPosition(event.position);
  229. // var ellipsoid = map.viewer.scene.globe.ellipsoid;
  230. // var cartographic = ellipsoid.cartesianToCartographic(position1);
  231. // var lat1 = Global.Math.toDegrees(cartographic.latitude);
  232. // var lng1 = Global.Math.toDegrees(cartographic.longitude);
  233. // var alt1 = cartographic.height;
  234. // console.log({
  235. // lat1:lat1,
  236. // lng1:lng1,
  237. // alt1:alt1
  238. // })
  239. // var cartographic = ellipsoid.cartesianToCartographic(map.viewer.camera.position);
  240. // var lat = Global.Math.toDegrees(cartographic.latitude);
  241. // var lng = Global.Math.toDegrees(cartographic.longitude);
  242. // var alt = cartographic.height;
  243. // console.log({
  244. // lat:lat,
  245. // lng:lng,
  246. // alt:alt,
  247. // heading:map.viewer.camera.heading,
  248. // pitch:map.viewer.camera.pitch,
  249. // roll:map.viewer.camera.roll
  250. // })
  251. // }, Global.ScreenSpaceEventType.LEFT_CLICK);
  252. // document.getElementById("fun").addEventListener("click",()=>{
  253. // play()
  254. // })
  255. // document.getElementById("fun1").addEventListener("click",()=>{
  256. // pause()
  257. // })
  258. // document.getElementById("fun2").addEventListener("click",()=>{
  259. // continueDo()
  260. // })
  261. // document.getElementById("fun3").addEventListener("click",()=>{
  262. // stop();
  263. // })