f65_dynamicRoamLine.html 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0,minimum-scale=1.0,maximum-scale=1.0" />
  6. <meta name="author" content="火星科技 http://mars3d.cn " />
  7. <meta name="apple-touch-fullscreen" content="yes" />
  8. <meta name="apple-mobile-web-app-capable" content="yes" />
  9. <meta name="apple-mobile-web-app-status-bar-style" content="black" />
  10. <meta name="format-detection" content="telephone=no" />
  11. <meta name="x5-fullscreen" content="true" />
  12. <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" />
  13. <!-- 标题及搜索关键字 -->
  14. <meta name="keywords" content="火星科技,cesium,3D,GIS,marsgis,三维,地球,地图,开发,框架,系统,示例,资料,模型,离线,外包,合肥,安徽,中国" />
  15. <meta
  16. name="description"
  17. content="火星科技 合肥火星 合肥火星科技 合肥火星科技有限公司 leaflet leaflet框架 leaflet开发 cesium cesium开发 cesium框架 三维 地球 模型 gis marsgis 地图离线 地图开发 地图框架 地图外包 框架 开发 外包 地图离线 二维地图 三维地图 全景漫游 地理信息系统 云GIS 三维GIS GIS平台 WebGIS"
  18. />
  19. <link rel="shortcut icon" type="image/x-icon" href="" />
  20. <title>实时动态轨迹路线 </title>
  21. <!--第三方lib-->
  22. <script
  23. type="text/javascript"
  24. src="../lib/include-lib.js"
  25. libpath="../lib/"
  26. include="jquery,font-awesome,bootstrap,bootstrap-table,layer,haoutil,turf,mars3d"
  27. ></script>
  28. <link href="css/style.css" rel="stylesheet" />
  29. <style>
  30. .fixed-table-container tbody .selected td {
  31. background-color: #3f4854a9;
  32. }
  33. </style>
  34. </head>
  35. <body class="dark">
  36. <!--加载前进行操作提示,优化用户体验-->
  37. <div id="mask" class="signmask" onclick="removeMask()"></div>
  38. <div id="mars3dContainer" class="mars3d-container"></div>
  39. <!-- 面板 -->
  40. <div id="logView" class="infoview infoview-right"></div>
  41. <!-- 车辆列表 -->
  42. <div class="infoview">
  43. <table id="tableCar"></table>
  44. </div>
  45. <script src="./js/common.js"></script>
  46. <script type="text/javascript">
  47. "use script"; //开发环境建议开启严格模式
  48. var map;
  49. var graphicLayer;
  50. function initMap(options) {
  51. //合并属性参数,可覆盖config.json中的对应配置
  52. var mapOptions = mars3d.Util.merge(options, {
  53. scene: {
  54. center: { lat: 31.773622, lng: 117.077444, alt: 5441, heading: 359, pitch: -57 },
  55. },
  56. });
  57. //创建三维地球场景
  58. map = new mars3d.Map("mars3dContainer", mapOptions);
  59. //演示数据的时间
  60. map.clock.currentTime = window.Cesium.JulianDate.fromDate(new Date("2020-11-25 10:10:00"));
  61. //加载车辆
  62. queryCarListApiData()
  63. .then(function (res) {
  64. showCarList(res.data);
  65. })
  66. .catch(function (e) {
  67. console.log("queryCarListApiData失败",e);
  68. haoutil.msg("查询信息失败");
  69. });
  70. }
  71. var colors = [
  72. "rgb(40, 40, 255)",
  73. "rgb(0, 88, 176)",
  74. "rgb(0, 128, 255)",
  75. "rgb(0, 217, 0)",
  76. "rgb(0, 151, 0)",
  77. "rgb(255, 199, 83)",
  78. "rgb(255, 144, 30)",
  79. "rgb(202, 101, 0)",
  80. "rgb(255, 0, 0)",
  81. ];
  82. // 访问car-list.json后端接口,取数据
  83. function queryCarListApiData() {
  84. return new Promise(function (resolve, reject) {
  85. $.ajax({
  86. url: "//data.mars3d.cn/file/apidemo/car-list.json",
  87. type: "get",
  88. dataType: "json",
  89. success: function (result) {
  90. resolve(result);
  91. },
  92. error: function (data) {
  93. reject(data);
  94. },
  95. });
  96. });
  97. }
  98. // 访问car-path.json后端接口,取数据
  99. function queryCarPathApiData() {
  100. return new Promise(function (resolve, reject) {
  101. $.ajax({
  102. url: "//data.mars3d.cn/file/apidemo/car-path.json",
  103. type: "get",
  104. dataType: "json",
  105. success: function (result) {
  106. resolve(result);
  107. },
  108. error: function (data) {
  109. reject(data);
  110. },
  111. });
  112. });
  113. }
  114. function showCarList(arr) {
  115. console.log("加载" + arr.length + "条");
  116. //创建矢量数据图层
  117. graphicLayer = new mars3d.layer.GraphicLayer();
  118. map.addLayer(graphicLayer);
  119. // 鼠标移入提示信息
  120. graphicLayer.bindTooltip(function (event) {
  121. var data = event.graphic.options;
  122. return "车辆编号:" + data.id + "<br />车牌号码:" + data.name;
  123. });
  124. //单击地图空白处
  125. map.on(mars3d.EventType.clickMap, function (event) {
  126. if (lastClickCar) {
  127. lastClickCar.removeShading("circle");
  128. lastClickCar = null;
  129. }
  130. });
  131. // 绑定点击事件
  132. graphicLayer.on(mars3d.EventType.click, (event, position) => {
  133. var car = event.graphic;
  134. console.log("单击了车辆", car);
  135. if (lastClickCar) {
  136. if (lastClickCar === car) {
  137. return;
  138. } //重复单击,跳出
  139. lastClickCar.removeShading("circle");
  140. lastClickCar = null;
  141. }
  142. car.addShading({
  143. type: "circle",
  144. materialType: mars3d.MaterialType.CircleWave,
  145. speed: 10,
  146. count: 3,
  147. gradient: 0.1,
  148. radius: 50,
  149. color: "#ffff00",
  150. opacity: 0.3,
  151. show: true,
  152. });
  153. lastClickCar = car;
  154. //视角定位下
  155. // car.flyToPoint({ radius: 1000 })
  156. });
  157. var lastClickCar;
  158. for (var i = 0, len = arr.length; i < len; i++) {
  159. var item = arr[i];
  160. item.show = true;
  161. var modelParam;
  162. switch (item.type) {
  163. default:
  164. case 1:
  165. modelParam = {
  166. scale: 2,
  167. url: "//data.mars3d.cn/gltf/mars/car/tufangche.glb",
  168. };
  169. break;
  170. case 2:
  171. modelParam = {
  172. scale: 1,
  173. url: "//data.mars3d.cn/gltf/mars/car/wajueji.glb",
  174. };
  175. break;
  176. }
  177. const car = new mars3d.graphic.DynamicRoamLine({
  178. id: item.id,
  179. name: item.name,
  180. model: {
  181. clampToGround: true,
  182. show: true,
  183. ...modelParam,
  184. },
  185. shadow: [
  186. {
  187. type: "polyline",
  188. color: colors[i],
  189. width: 2,
  190. clampToGround: true,
  191. maxDistance: 500,
  192. show: true,
  193. },
  194. ],
  195. });
  196. graphicLayer.addGraphic(car);
  197. }
  198. tabInit(arr);
  199. // 定时获取卡车和铲车的列表数据
  200. this.createPath();
  201. }
  202. //取轨迹数据的时间间隔(单位:秒)
  203. var timeStep = 10;
  204. //首次获取并创建轨迹
  205. function createPath() {
  206. //取数据的时间范围,结束时间
  207. var date = Cesium.JulianDate.toDate(map.clock.currentTime);
  208. var endTime = date.format("yyyy-MM-dd HH:mm:ss");
  209. // 修改当前时间回退一分钟,因为数据永远是当前时间之前的。
  210. date.setSeconds(date.getSeconds() - 60);
  211. map.clock.currentTime = window.Cesium.JulianDate.fromDate(date);
  212. //取数据的时间范围,开始时间
  213. date.setMinutes(date.getMinutes() - 10); // 初次取一定时间内的数据
  214. var beginTime = date.format("yyyy-MM-dd HH:mm:ss");
  215. //记录最后一次读取数据的时间
  216. this.lastTime = endTime;
  217. //取数据
  218. getPathList(beginTime, endTime);
  219. //定时更新
  220. this.intervalGetData = setInterval(() => {
  221. this.updatePath();
  222. }, timeStep * 1000);
  223. }
  224. //后续更新轨迹
  225. function updatePath() {
  226. var beginTime = this.lastTime;
  227. var date = new Date(beginTime);
  228. date.setSeconds(date.getSeconds() + timeStep);
  229. var endTime = date.format("yyyy-MM-dd HH:mm:ss");
  230. this.lastTime = endTime;
  231. //取数据
  232. getPathList(beginTime, endTime);
  233. }
  234. //读取车辆gps坐标路径的接口
  235. function getPathList(beginTime, endTime) {
  236. queryCarPathApiData()
  237. .then(function (res) {
  238. var listALL = res.data || [];
  239. //因为读取静态json,为了演示动态,筛选数据内符合时间范围内的数据。
  240. //真实接口中可以注释下面代码。
  241. var d_beginTime = new Date(beginTime);
  242. var d_endTime = new Date(endTime);
  243. var list = listALL.filter((item) => {
  244. var thistime = new Date(item.time);
  245. return thistime >= d_beginTime && thistime <= d_endTime;
  246. });
  247. //真实接口中可以注释上面代码。
  248. addLog(`${endTime} 获取到 ${list.length} 条GPS坐标记录`);
  249. //循环车辆
  250. graphicLayer.eachGraphic((car) => {
  251. //取出对应车辆的轨迹列表
  252. var path = list.filter((item) => {
  253. return item.id === car.id;
  254. });
  255. if (path && path.length > 0) {
  256. //更新车辆的轨迹
  257. car.updatePath(path, {
  258. timeColumn: "time",
  259. getPosition: function (item) {
  260. return Cesium.Cartesian3.fromDegrees(parseFloat(item.lon), parseFloat(item.lat), 0);
  261. },
  262. });
  263. //addLog(`${car.id} 更新 ${path.length} 条轨迹记录`)
  264. }
  265. });
  266. })
  267. .catch(function () {
  268. haoutil.msg("实时查询气象信息失败,请稍候再试");
  269. });
  270. }
  271. function addLog(log) {
  272. console.log(log);
  273. var logView = $("#logView");
  274. var oldhtml = logView.html();
  275. if (oldhtml.length < 500) {
  276. logView.html(oldhtml + log + "<br />");
  277. } else {
  278. logView.html(log + "<br />");
  279. }
  280. }
  281. //==================================================
  282. function tabInit(data) {
  283. $("#tableCar").bootstrapTable({
  284. data: data,
  285. pagination: false,
  286. singleSelect: false,
  287. checkboxHeader: false,
  288. columns: [
  289. {
  290. title: "是否显示",
  291. field: "show",
  292. align: "center",
  293. checkbox: true,
  294. width: 50,
  295. },
  296. {
  297. title: "序号",
  298. sortable: true,
  299. editable: false,
  300. align: "left",
  301. formatter: function (value, row, index) {
  302. return index + 1;
  303. },
  304. },
  305. {
  306. field: "name",
  307. title: "车牌号",
  308. },
  309. {
  310. field: "type",
  311. title: "类型",
  312. formatter: function (value, row, index) {
  313. if (value == 1) {
  314. return "土方车";
  315. } else if (value == 2) {
  316. return "挖掘机";
  317. }
  318. return "";
  319. },
  320. },
  321. ],
  322. //定位车辆区域
  323. onClickRow: function (row) {
  324. let car = graphicLayer.getGraphicById(row.id);
  325. if (car) {
  326. car.flyToPoint({ radius: 900 });
  327. }
  328. },
  329. //勾选隐藏车辆
  330. onCheck: function (row) {
  331. let car = graphicLayer.getGraphicById(row.id);
  332. if (car) {
  333. car.show = true;
  334. }
  335. },
  336. //取消勾选显示车辆
  337. onUncheck: function (row) {
  338. let car = graphicLayer.getGraphicById(row.id);
  339. if (car) {
  340. car.show = false;
  341. }
  342. },
  343. });
  344. }
  345. </script>
  346. </body>
  347. </html>