订单轨迹回放
This commit is contained in:
		| @ -4,6 +4,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; | ||||
| import com.ruoyi.orders.domain.ZcOrderSub; | ||||
| import com.ruoyi.orders.dto.PushItemRequest; | ||||
| import com.ruoyi.orders.dto.RefundRequest; | ||||
| import com.ruoyi.orders.dto.TrajectoryPoint; | ||||
| import com.ruoyi.orders.util.OrderTrajectoryResponse; | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| @ -13,6 +15,8 @@ import org.springframework.stereotype.Service; | ||||
| import org.springframework.web.client.RestTemplate; | ||||
|  | ||||
| import java.math.BigDecimal; | ||||
| import java.util.HashMap; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
|  | ||||
| @Service | ||||
| @ -36,6 +40,10 @@ public class DataPushApi { | ||||
|     @Value(value = "${dataPush.sendAddUserUrl}") | ||||
|     private String sendAddUserUrl; | ||||
|  | ||||
|  | ||||
|     @Value(value = "${dataPush.orderTrajectoryUrl}") | ||||
|     private String orderTrajectoryUrl; | ||||
|  | ||||
|     /** | ||||
|      * 发送添加运营商信息 | ||||
|      * @param companyId | ||||
| @ -219,4 +227,66 @@ public class DataPushApi { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * 获取订单轨迹 | ||||
|      * @param clientId | ||||
|      * @param startTm | ||||
|      * @param endTm | ||||
|      * @return | ||||
|      */ | ||||
|     public List<TrajectoryPoint> fetchOrderTrajectory(String clientId, String startTm, String endTm) { | ||||
|         try { | ||||
|             // 准备请求参数 | ||||
|             Map<String, String> requestBody = new HashMap<>(); | ||||
|             requestBody.put("clientId", clientId); | ||||
|             requestBody.put("startTm", startTm); | ||||
|             requestBody.put("endTm", endTm); | ||||
|  | ||||
|             // 打印请求参数便于调试 | ||||
|             String jsonParams = objectMapper.writeValueAsString(requestBody); | ||||
|             logger.info("订单轨迹请求参数: {}", jsonParams); | ||||
|  | ||||
|             // 发送HTTP POST请求调用订单轨迹接口 | ||||
|             HttpHeaders headers = new HttpHeaders(); | ||||
|             headers.setContentType(MediaType.APPLICATION_JSON); | ||||
|  | ||||
|             HttpEntity<Map<String, String>> requestEntity = new HttpEntity<>(requestBody, headers); | ||||
|             RestTemplate restTemplate = new RestTemplate(); | ||||
|             ResponseEntity<String> response = restTemplate.postForEntity(orderTrajectoryUrl, requestEntity, String.class); | ||||
|  | ||||
|             // 处理订单轨迹接口响应 | ||||
|             if (response.getStatusCode() == HttpStatus.OK) { | ||||
|                 String responseBody = response.getBody(); | ||||
|                 if (responseBody != null) { | ||||
|                     try { | ||||
|                         // 使用ObjectMapper解析JSON响应 | ||||
|                         OrderTrajectoryResponse result = objectMapper.readValue(responseBody, OrderTrajectoryResponse.class); | ||||
|                         if (result.getCode() != null && result.getCode() == 200) { | ||||
|                             logger.info("获取订单轨迹成功,客户端ID: {},轨迹点数量: {}", clientId, | ||||
|                                     result.getData() != null ? result.getData().size() : 0); | ||||
|                             return result.getData(); | ||||
|                         } else { | ||||
|                             logger.error("获取订单轨迹失败,客户端ID: {},响应: {}", clientId, responseBody); | ||||
|                             return null; | ||||
|                         } | ||||
|                     } catch (Exception jsonEx) { | ||||
|                         logger.error("解析订单轨迹接口响应异常,客户端ID: {},响应: {}", clientId, responseBody, jsonEx); | ||||
|                         return null; | ||||
|                     } | ||||
|                 } else { | ||||
|                     logger.error("订单轨迹接口返回空响应,客户端ID: {}", clientId); | ||||
|                     return null; | ||||
|                 } | ||||
|             } else { | ||||
|                 logger.error("获取订单轨迹失败,客户端ID: {},响应: {}", clientId, response.getBody()); | ||||
|                 return null; | ||||
|             } | ||||
|         } catch (Exception e) { | ||||
|             logger.error("调用订单轨迹接口异常,客户端ID: " + clientId, e); | ||||
|             return null; | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| @ -4,16 +4,19 @@ import java.util.ArrayList; | ||||
| import java.util.Date; | ||||
| import java.util.List; | ||||
|  | ||||
| import com.ruoyi.api.DataPushApi; | ||||
| import com.ruoyi.common.constant.UserConstants; | ||||
| import com.ruoyi.common.utils.DateUtils; | ||||
| import com.ruoyi.operation.domain.Company; | ||||
| import com.ruoyi.operation.service.ICompanyService; | ||||
| import com.ruoyi.orders.domain.ZcOrderCarChange; | ||||
| import com.ruoyi.orders.dto.StatisticsHomeOrder; | ||||
| import com.ruoyi.orders.dto.TrajectoryPoint; | ||||
| import com.ruoyi.orders.service.IZcOrderCarChangeService; | ||||
| import com.ruoyi.orders.util.OrderStatusEnum; | ||||
| import org.apache.shiro.authz.annotation.RequiresPermissions; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.beans.factory.annotation.Value; | ||||
| import org.springframework.stereotype.Controller; | ||||
| import org.springframework.ui.ModelMap; | ||||
| import org.springframework.web.bind.annotation.GetMapping; | ||||
| @ -48,6 +51,9 @@ public class ZcOrderMainController extends BaseController | ||||
|     private IZcOrderCarChangeService zcOrderCarChangeService; | ||||
|     @Autowired | ||||
|     private ICompanyService companyService; | ||||
|     @Autowired | ||||
|     private DataPushApi dataPushApi; | ||||
|  | ||||
|  | ||||
|     @RequiresPermissions("orders:order:view") | ||||
|     @GetMapping() | ||||
| @ -166,6 +172,57 @@ public class ZcOrderMainController extends BaseController | ||||
|         return toAjax(flag); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 租车订单轨迹 | ||||
|      */ | ||||
|     @GetMapping("/orderTrajectory/{id}") | ||||
|     public String orderTrajectory(@PathVariable("id") Long id, ModelMap mmap) | ||||
|     { | ||||
|         // 调用 | ||||
|         List<TrajectoryPoint> trajectoryPoints = dataPushApi.fetchOrderTrajectory("15135683068", "2025-10-10 08:08:80", "2025-10-10 16:80:00"); | ||||
|  | ||||
|  | ||||
| //        List<TrajectoryPoint> trajectoryPoints = new ArrayList<>(); | ||||
| //        double[][] testData = { | ||||
| //                {112.925285, 27.900163}, {112.925285, 27.900163}, {112.925285, 27.900163}, | ||||
| //                {112.925285, 27.900163}, {112.925285, 27.900163}, {112.925285, 27.900163}, | ||||
| //                {112.925285, 27.900163}, {112.925285, 27.900163}, {112.925285, 27.900163}, | ||||
| //                {112.925285, 27.900163}, {112.925285, 27.900163}, {112.925285, 27.900163}, | ||||
| //                {112.925285, 27.900163}, {112.925285, 27.900163}, {112.925285, 27.900163}, | ||||
| //                {112.925285, 27.900163}, {112.925285, 27.900163}, {112.925855, 27.898977}, | ||||
| //                {112.925745, 27.898878}, {112.9261, 27.898802}, {112.926718, 27.898633}, | ||||
| //                {112.927295, 27.898673}, {112.92779, 27.898652}, {112.928342, 27.898685}, | ||||
| //                {112.928483, 27.89868}, {112.929135, 27.898667}, {112.9299, 27.898445}, | ||||
| //                {112.930225, 27.898263}, {112.93024, 27.898233}, {112.930213, 27.898052}, | ||||
| //                {112.929905, 27.897193}, {112.929437, 27.895972}, {112.929417, 27.895775}, | ||||
| //                {112.929483, 27.895702}, {112.929832, 27.895443}, {112.929875, 27.89528}, | ||||
| //                {112.930153, 27.894773}, {112.930123, 27.894712}, {112.929758, 27.894537}, | ||||
| //                {112.929558, 27.894395}, {112.929668, 27.894208}, {112.929712, 27.89416}, | ||||
| //                {112.930053, 27.893827}, {112.930018, 27.89383}, {112.930027, 27.893798}, | ||||
| //                {112.930027, 27.893798}, {112.930027, 27.893798}, {112.93002, 27.893797}, | ||||
| //                {112.93002, 27.893797}, {112.93002, 27.893797}, {112.929775, 27.89305}, | ||||
| //                {112.929775, 27.89305}, {112.92978, 27.893495}, {112.92978, 27.893495} | ||||
| //        }; | ||||
| //        // 创建轨迹点列表 | ||||
| //        for (int i = 0; i < testData.length; i++) { | ||||
| //            TrajectoryPoint point = new TrajectoryPoint(); | ||||
| //            point.setLng(testData[i][0]);  // 经度 | ||||
| //            point.setLat(testData[i][1]);  // 纬度 | ||||
| //            // 时间戳可以按需添加 | ||||
| //            // point.setTs("2025-10-17 14:" + String.format("%02d", (39 + i)) + ":36.0"); | ||||
| //            trajectoryPoints.add(point); | ||||
| //        } | ||||
|  | ||||
|         // 设置中心点和轨迹点列表 | ||||
|         if (!trajectoryPoints.isEmpty()) { | ||||
|             mmap.put("centerPoint", trajectoryPoints.get(0)); | ||||
|             mmap.put("orderTrajectoryPointList", trajectoryPoints); | ||||
|             mmap.put("orderTrajectoryPointLen", trajectoryPoints.size()-1); | ||||
|         } | ||||
|         return prefix + "/orderTrajectory"; | ||||
|     } | ||||
|  | ||||
|  | ||||
|     @PostMapping("/statisticsHomeOrder") | ||||
|     @ResponseBody | ||||
|     public AjaxResult statisticsHomeOrder(String type) { | ||||
|  | ||||
| @ -0,0 +1,18 @@ | ||||
| package com.ruoyi.orders.dto; | ||||
|  | ||||
| public class TrajectoryPoint { | ||||
|  | ||||
|     private Double lng;  // 经度 | ||||
|     private Double lat;  // 纬度 | ||||
|     private String ts;   // 时间戳 | ||||
|  | ||||
|     // getter和setter方法 | ||||
|     public Double getLng() { return lng; } | ||||
|     public void setLng(Double lng) { this.lng = lng; } | ||||
|  | ||||
|     public Double getLat() { return lat; } | ||||
|     public void setLat(Double lat) { this.lat = lat; } | ||||
|  | ||||
|     public String getTs() { return ts; } | ||||
|     public void setTs(String ts) { this.ts = ts; } | ||||
| } | ||||
| @ -0,0 +1,22 @@ | ||||
| package com.ruoyi.orders.util; | ||||
|  | ||||
| import com.ruoyi.orders.dto.TrajectoryPoint; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| public class OrderTrajectoryResponse { | ||||
|  | ||||
|     private Integer code; | ||||
|     private List<TrajectoryPoint> data; | ||||
|  | ||||
|     // getter和setter方法 | ||||
|     public Integer getCode() { return code; } | ||||
|     public void setCode(Integer code) { this.code = code; } | ||||
|  | ||||
|     public List<TrajectoryPoint> getData() { | ||||
|         return data; | ||||
|     } | ||||
|     public void setData(List<TrajectoryPoint> data) { | ||||
|         this.data = data; | ||||
|     } | ||||
| } | ||||
| @ -87,7 +87,10 @@ dataPush: | ||||
|     refundUrl: http://115.190.8.52:8019/api/payment/refund | ||||
|     alirefundUrl: http://115.190.8.52:8019/api/alipay/refund | ||||
|     pushItemUrl: http://115.190.8.52:8019/item/sync/item | ||||
|     # 轨迹接口地址 | ||||
|     orderTrajectoryUrl: http://106.14.7.172:8100/device/getHistoryDeviceInfo | ||||
|  | ||||
|     sendAddCompanyUrl: http://sczx-sync-container:8016/send/companyinfo/ | ||||
|     sendAddStoreUrl: http://sczx-sync-container:8016/send/storeinfo/ | ||||
|     sendAddUserUrl: http://sczx-sync-container:8016/send/userinfo/ | ||||
|  | ||||
|  | ||||
							
								
								
									
										
											BIN
										
									
								
								ruoyi-admin/src/main/resources/static/img/model_taxi.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								ruoyi-admin/src/main/resources/static/img/model_taxi.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 30 KiB | 
| @ -263,11 +263,41 @@ | ||||
|                     field: 'startRentTime', | ||||
|                     title: '开始计费时间', | ||||
|                     width: '160px' | ||||
|                 }, | ||||
|                 { | ||||
|                     title: '操作', | ||||
|                     align: 'center', | ||||
|                     width: '100px', | ||||
|                     formatter: function(value, row, index) { | ||||
|                         var actions = []; | ||||
|                         actions.push('<a class="btn btn-success btn-xs btnOption" href="javascript:void(0)" onclick="orderTrajectory(\'' + row.orderId + '\')"><i class="fa fa-edit"></i>轨迹</a> '); | ||||
|                         return actions.join(''); | ||||
|                     } | ||||
|                 }] | ||||
|             }; | ||||
|             $.table.init(options); | ||||
|         }); | ||||
|  | ||||
|         function orderTrajectory(id){ | ||||
|             var url = prefix + "/orderTrajectory/" + id; | ||||
|             top.layer.open({ | ||||
|                 type: 2, | ||||
|                 area: ['1400px', '800px'], | ||||
|                 fix: false, | ||||
|                 //不固定 | ||||
|                 maxmin: true, | ||||
|                 shade: 0.3, | ||||
|                 title: "订单轨迹回放", | ||||
|                 content: url, | ||||
|                 btn: ['关闭'], | ||||
|                 // 弹层外区域关闭 | ||||
|                 shadeClose: true, | ||||
|                 cancel: function(index) { | ||||
|                     return true; | ||||
|                 } | ||||
|             }); | ||||
|             //$.modal.open("订单轨迹", prefix + "/orderTrajectory/" + id, '1400', '800', false); | ||||
|         } | ||||
|         function manualClose(id){ | ||||
|             var index = layer.open({ | ||||
|                 type: 2, // iframe模式 | ||||
|  | ||||
| @ -0,0 +1,334 @@ | ||||
| <!DOCTYPE html> | ||||
| <html lang="en"> | ||||
| <head> | ||||
|     <meta charset="UTF-8" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | ||||
|     <meta http-equiv="X-UA-Compatible" content="ie=edge" /> | ||||
|     <title>marker轨迹回放-跟随模式</title> | ||||
| </head> | ||||
| <script src="https://map.qq.com/api/gljs?v=1.exp&key=GPYBZ-Q4TY3-MWZ3S-OO6TP-5GA43-I4BRH&libraries=geometry"></script> | ||||
|  | ||||
| <style type="text/css"> | ||||
|     html, | ||||
|     body { | ||||
|         height: 100%; | ||||
|         margin: 0px; | ||||
|         padding: 0px; | ||||
|         overflow: hidden; | ||||
|     } | ||||
|  | ||||
|     #container { | ||||
|         position: relative; | ||||
|         width: 100%; | ||||
|         height: 100%; | ||||
|     } | ||||
|  | ||||
|     .btnContainer { | ||||
|         position: absolute; | ||||
|         left: 20px; | ||||
|         top: 20px; | ||||
|         z-index: 10000; | ||||
|     } | ||||
|  | ||||
|     .btnContainer button { | ||||
|         padding: 10px 14px; | ||||
|         box-sizing: border-box; | ||||
|         border: none; | ||||
|         background-color: #919aac; | ||||
|         border-radius: 2px; | ||||
|         color: #fff; | ||||
|         font-size: 14px; | ||||
|         line-height: 14px; | ||||
|     } | ||||
|  | ||||
|     .btnContainer button:focus { | ||||
|         outline: none; | ||||
|     } | ||||
|  | ||||
|     .btnContainer .btn1 { | ||||
|         padding: 10px 14px; | ||||
|         background: #3876ff; | ||||
|         border-radius: 2px; | ||||
|         border: none; | ||||
|         box-sizing: border-box; | ||||
|         font-size: 14px; | ||||
|         color: #fff; | ||||
|         line-height: 14px; | ||||
|         font-family: PingFangSC-Regular; | ||||
|     } | ||||
|  | ||||
|     input { | ||||
|         height: 25px; | ||||
|     } | ||||
|  | ||||
|     .info { | ||||
|         background-color: white; | ||||
|         padding: 10px; | ||||
|         font-size: 14px; | ||||
|     } | ||||
| </style> | ||||
|  | ||||
| <body> | ||||
| <div class="btnContainer"> | ||||
|     <button class="btn1">点击小车开始移动</button> | ||||
|     <button class="btn2">重置</button> | ||||
|     <button class="btn3">暂停</button> | ||||
|     <button class="btn4">恢复</button> | ||||
|  | ||||
|     <div class="info"> | ||||
|         <p></p> | ||||
|         <p></p> | ||||
|         <p>当前小车行驶距离:0米</p> | ||||
|         <p></p> | ||||
|     </div> | ||||
| </div> | ||||
| <div id="container"></div> | ||||
| <script type="text/javascript" th:inline="javascript"> | ||||
|     var centerPoint = /*[[${centerPoint}]]*/ null; | ||||
|     var len = /*[[${orderTrajectoryPointLen}]]*/ 0; | ||||
|     var orderTrajectoryPointList = /*[[${orderTrajectoryPointList}]]*/ []; | ||||
|     var center = new TMap.LatLng(28.398338642835437,112.84714169618475); | ||||
|     if(centerPoint != null){ | ||||
|         var lng = centerPoint.lng; | ||||
|         var lat = centerPoint.lat; | ||||
|         // 设置地图中心点(注意腾讯地图 LatLng 构造函数参数顺序是纬度,经度) | ||||
|         center = new TMap.LatLng(lat, lng); | ||||
|     } | ||||
|     // 初始化地图 | ||||
|     var map = new TMap.Map('container', { | ||||
|         zoom: 16, | ||||
|         center | ||||
|     }); | ||||
|  | ||||
|     var isMoving = false; | ||||
|     var roation; | ||||
|     var position; | ||||
|  | ||||
|     var path = []; | ||||
|     if (orderTrajectoryPointList && orderTrajectoryPointList.length > 0) { | ||||
|         path = orderTrajectoryPointList.map(function(point) { | ||||
|             // 注意腾讯地图 LatLng 参数顺序是 (纬度, 经度) | ||||
|             return new TMap.LatLng(point.lat, point.lng); | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     var limitDistance = 0; // 限制距离 | ||||
|     // MultiPolyline文档:https://lbs.qq.com/webApi/javascriptGL/glDoc/glDocVector#1 | ||||
|     var polylineLayer = new TMap.MultiPolyline({ | ||||
|         map, // 绘制到目标地图 | ||||
|         // 折线样式定义 | ||||
|         styles: { | ||||
|             style_blue: new TMap.PolylineStyle({ | ||||
|                 color: '#2A88FF', // 线填充色 | ||||
|                 width: 8, // 折线宽度 | ||||
|                 borderWidth: 3, // 边线宽度 | ||||
|                 borderColor: '#0569FF', // 边线颜色 | ||||
|                 lineCap: 'round', // 线端头方式 | ||||
|                 showArrow: true | ||||
|             }), | ||||
|             style_gray: new TMap.PolylineStyle({ | ||||
|                 color: '#ccc', // 线填充色 | ||||
|                 width: 8, // 折线宽度 | ||||
|                 borderWidth: 3, // 边线宽度 | ||||
|                 borderColor: '#FFF', // 边线颜色 | ||||
|                 lineCap: 'round' // 线端头方式 | ||||
|             }) | ||||
|         }, | ||||
|         geometries: [ | ||||
|             { | ||||
|                 id: 'path1', | ||||
|                 styleId: 'style_blue', | ||||
|                 paths: path | ||||
|             }, | ||||
|             { | ||||
|                 id: 'path2', | ||||
|                 styleId: 'style_blue', | ||||
|                 paths: path | ||||
|             } | ||||
|         ] | ||||
|     }); | ||||
|     // marker文档:https://lbs.qq.com/webApi/javascriptGL/glDoc/glDocMarker | ||||
|     var marker = new TMap.MultiMarker({ | ||||
|         id: 'car', | ||||
|         map, | ||||
|         styles: { | ||||
|             'car-down': new TMap.MarkerStyle({ | ||||
|                 width: 48, | ||||
|                 height: 72, | ||||
|                 anchor: { | ||||
|                     x: 24, | ||||
|                     y: 36 | ||||
|                 }, | ||||
|                 faceTo: 'map', | ||||
|                 rotate: 180, | ||||
|                 src: '../../../img/model_taxi.png' | ||||
|             }), | ||||
|             start: new TMap.MarkerStyle({ | ||||
|                 anchor: { | ||||
|                     x: 16, | ||||
|                     y: 32 | ||||
|                 }, | ||||
|                 src: 'https://mapapi.qq.com/web/miniprogram/demoCenter/images/marker-start.png' | ||||
|             }), | ||||
|             end: new TMap.MarkerStyle({ | ||||
|                 src: 'https://mapapi.qq.com/web/miniprogram/demoCenter/images/marker-end.png' | ||||
|             }) | ||||
|         }, | ||||
|         geometries: [ | ||||
|             { | ||||
|                 id: 'car', | ||||
|                 styleId: 'car-down', | ||||
|                 position: path[0] | ||||
|             }, | ||||
|             { | ||||
|                 id: 'start', | ||||
|                 styleId: 'start', | ||||
|                 position: path[0] | ||||
|             }, | ||||
|             { | ||||
|                 id: 'end', | ||||
|                 styleId: 'end', | ||||
|                 position: path[len] | ||||
|             } | ||||
|         ] | ||||
|     }); | ||||
|     function initInfo() { | ||||
|         // 初始化全程长度及小车起始坐标 | ||||
|         var distance = TMap.geometry.computeDistance(path); | ||||
|         var fullLength = document.querySelectorAll('.info p')[0]; | ||||
|         fullLength.innerHTML = '路线全程长度:' + parseNumber(distance, 2) + '米'; | ||||
|         var currentLatLng = document.querySelectorAll('.info p')[3]; | ||||
|         currentLatLng.innerHTML = | ||||
|             '当前小车坐标:' + | ||||
|             parseNumber(path[0].lat, 6) + | ||||
|             ',' + | ||||
|             parseNumber(path[0].lng, 6); | ||||
|     } | ||||
|     initInfo(); | ||||
|     function parseNumber(value, num) { | ||||
|         // 解析数字 | ||||
|         return parseFloat(value).toFixed(num); | ||||
|     } | ||||
|     function carMove() { | ||||
|         map.off('idle', carMove); | ||||
|         marker.moveAlong( | ||||
|             { | ||||
|                 car: { | ||||
|                     path, | ||||
|                     speed: 200 | ||||
|                 } | ||||
|             }, | ||||
|             { | ||||
|                 autoRotation: true | ||||
|             } | ||||
|         ); | ||||
|         isMoving = true; | ||||
|     } | ||||
|     marker.on('move_ended', function () { | ||||
|         isMoving = false; | ||||
|     }); | ||||
|     marker.on('move_stopped', function (e) { | ||||
|         isMoving = false; | ||||
|     }); | ||||
|     marker.on('moving', function (e) { | ||||
|         if (!e.car) return; | ||||
|         roation = TMap.geometry.computeHeading( | ||||
|             e.car.passedLatLngs[e.car.passedLatLngs.length - 2], | ||||
|             e.car.passedLatLngs[e.car.passedLatLngs.length - 1] | ||||
|         ); | ||||
|         position = TMap.geometry.computeDestination( | ||||
|             marker.getGeometryById('car').position, | ||||
|             roation, | ||||
|             60 | ||||
|         ); | ||||
|         map.easeTo( | ||||
|             { | ||||
|                 center: position, | ||||
|                 rotation: e.car.angle && e.car.angle, | ||||
|                 zoom: 20, | ||||
|                 pitch: 70 | ||||
|             }, | ||||
|             { | ||||
|                 duration: 300 | ||||
|             } | ||||
|         ); | ||||
|         // 移动路线置灰 | ||||
|         polylineLayer.updateGeometries([ | ||||
|             { | ||||
|                 id: 'path2', | ||||
|                 styleId: 'style_gray', | ||||
|                 paths: e.car.passedLatLngs | ||||
|             } | ||||
|         ]); | ||||
|         // 计算当前移动距离 | ||||
|         var currentDistance = TMap.geometry.computeDistance(e.car.passedLatLngs); | ||||
|         if (limitDistance && currentDistance > limitDistance) { | ||||
|             // 大于限制距离 停止移动 | ||||
|             marker.stopMove(); | ||||
|         } | ||||
|         // 移动过程中更新小车已行驶距离 | ||||
|         document.querySelectorAll('.info p')[2].innerHTML = | ||||
|             '当前小车行驶距离:' + parseNumber(currentDistance, 2) + '米'; | ||||
|         // 移动过程中更新小车当前坐标 | ||||
|         var movingLatLng = e.car.passedLatLngs[e.car.passedLatLngs.length - 1]; | ||||
|         document.querySelectorAll('.info p')[3].innerHTML = | ||||
|             '当前小车坐标:' + | ||||
|             parseNumber(movingLatLng.lat, 6) + | ||||
|             ',' + | ||||
|             parseNumber(movingLatLng.lng, 6); | ||||
|     }); | ||||
|     document.querySelector('.btn1').onclick = function () { | ||||
|         if (isMoving) return; | ||||
|         map.easeTo( | ||||
|             { | ||||
|                 zoom: 20, | ||||
|                 rotation: 180, | ||||
|                 pitch: 80 | ||||
|             }, | ||||
|             { | ||||
|                 duration: 1000 | ||||
|             } | ||||
|         ); | ||||
|         map.on('idle', carMove); | ||||
|     }; | ||||
|  | ||||
|     document.querySelector('.btn2').onclick = function () { | ||||
|         marker.stopMove(); | ||||
|         isMoving = false; | ||||
|         polylineLayer.setGeometries([ | ||||
|             { | ||||
|                 id: 'path1', | ||||
|                 styleId: 'style_blue', | ||||
|                 paths: path | ||||
|             }, | ||||
|             { | ||||
|                 id: 'path2', | ||||
|                 styleId: 'style_blue', | ||||
|                 paths: path | ||||
|             } | ||||
|         ]); | ||||
|  | ||||
|         map.easeTo({ | ||||
|             center, | ||||
|             zoom: 16, | ||||
|             rotation: 0, | ||||
|             pitch: 0 | ||||
|         }); | ||||
|     }; | ||||
|     document.querySelector('.btn3').onclick = function () { | ||||
|         marker.pauseMove(); | ||||
|     }; | ||||
|     document.querySelector('.btn4').onclick = function () { | ||||
|         marker.resumeMove(); | ||||
|     }; | ||||
|     document.querySelector('.btn5').onclick = function () { | ||||
|         // 限制小车移动距离,0||NAN 不限制 | ||||
|         if (isMoving) return; | ||||
|         var value = parseFloat(document.querySelector('input').value); | ||||
|         value ? (limitDistance = value) : (limitDistance = 0); | ||||
|         document.querySelectorAll('.info p')[1].innerHTML = | ||||
|             '当前限制小车最大移动距离:' + limitDistance + '米'; | ||||
|     }; | ||||
| </script> | ||||
| </body> | ||||
| </html> | ||||
		Reference in New Issue
	
	Block a user
	 19173159168
					19173159168