rotate 里面的是弧度不是度,如果需要度则要转成度 Math.PI/180

// 旋转
    this.ctx.rotate(30 * (Math.PI / 180));

转载于:https://www.cnblogs.com/oklfx/p/8320155.html

// 更新车辆图标位置和方向 updateCarMarker(newPoint, coordinates) { if (coordinates.length >= 2) { // 计算方向:取最后两个点计算方向角 const prevPoint = coordinates[coordinates.length - 2]; let bearing = this.calculateBearing(prevPoint, newPoint); // 调整:因为图标初始方向是车头向右(正东),而计算出的方位角是正北为0,所以需要将方位角减去90(即正北方向对应图标应该旋转-90,使车头朝上) bearing = bearing - 90; // 确保在0~360范围内 bearing = (bearing + 360) % 360; this.carMarker.setRotation(bearing); } this.carMarker.setLngLat(newPoint); // 视角跟随(平滑移动) this.mapObj.flyTo({ center: newPoint, offset: [0, -100], // 向上偏移100px speed: 0.5, essential: true }); }, // 计算两点间方向角(单位:) calculateBearing(start, end) { // 原有计算方位角的方法 const startLng = start[0] * Math.PI / 180; const startLat = start[1] * Math.PI / 180; const endLng = end[0] * Math.PI / 180; const endLat = end[1] * Math.PI / 180; const y = Math.sin(endLng - startLng) * Math.cos(endLat); const x = Math.cos(startLat) * Math.sin(endLat) - Math.sin(startLat) * Math.cos(endLat) * Math.cos(endLng - startLng); let bearing = Math.atan2(y, x) * 180 / Math.PI; // 将方位角转换为0~360 bearing = (bearing + 360) % 360; return bearing; }, // 初始化车辆图标 initCarMarker() { if (this.carMarker) { this.carMarker.remove(); // 关键!移除旧标记 } // 如果已经存在车辆标记则不重复创建 const el = document.createElement('div'); el.className = 'car-marker'; el.style.backgroundImage = `url("${this.getImgUrlById(16)}")`; el.style.width = '44px'; el.style.height = '28px'; el.style.backgroundSize = '100% 100%'; el.style.backgroundRepeat = 'no-repeat'; this.carMarker = new minemap.Marker({ element: el, rotationAlignment: 'map', // 方向随地图旋转 anchor: 'center' }).setLngLat([0, 0]).addTo(this.mapObj); this.routeMarkers.push(this.carMarker); },计算的车辆图标偏移严重
最新发布
08-03
// 初始化车辆图标 initCarMarker() { if (this.carMarker) return; // 如果已经存在车辆标记则不重复创建 const el = document.createElement('div'); el.className = 'car-marker'; el.style.backgroundImage = 'url(/images/car.png)'; el.style.width = '32px'; el.style.height = '32px'; el.style.backgroundSize = '100%'; this.carMarker = new minemap.Marker({ element: el, rotationAlignment: 'map', // 方向随地图旋转 anchor: 'center' }).setLngLat([0, 0]).addTo(this.mapObj); }, // 更新车辆位置(父组件调用) updateVehiclePosition(newPoint) { console.log(newPoint,this.carMarker, '00000'); if (!this.mapObj || !this.carMarker) return; console.log(newPoint, '1111'); // 获取当前实时路线的坐标数组 const source = this.mapObj.getSource('realtime-route-source'); if (!source) return; const currentData = source._data; let coordinates = []; if (currentData && currentData.geometry && currentData.geometry.coordinates) { coordinates = currentData.geometry.coordinates; } // 添加新点 coordinates.push(newPoint); // 更新数据源 source.setData({ type: 'Feature', geometry: { type: 'LineString', coordinates: coordinates } }); // 更新车辆图标位置和方向 this.updateCarMarker(newPoint, coordinates); }, // 更新车辆图标位置和方向 updateCarMarker(newPoint, coordinates) { if (coordinates.length >= 2) { // 计算方向:取最后两个点计算方向角 const prevPoint = coordinates[coordinates.length - 2]; const bearing = this.calculateBearing(prevPoint, newPoint); this.carMarker.setRotation(bearing); } this.carMarker.setLngLat(newPoint); // 视角跟随(平滑移动) this.mapObj.flyTo({ center: newPoint, offset: [0, -100], // 向上偏移100px speed: 0.5, essential: true }); }, // 计算两点间方向角(单位:) calculateBearing(start, end) { const startLng = start[0] * Math.PI / 180; const startLat = start[1] * Math.PI / 180; const endLng = end[0] * Math.PI / 180; const endLat = end[1] * Math.PI / 180; const y = Math.sin(endLng - startLng) * Math.cos(endLat); const x = Math.cos(startLat) * Math.sin(endLat) - Math.sin(startLat) * Math.cos(endLat) * Math.cos(endLng - startLng); return Math.atan2(y, x) * 180 / Math.PI; }, 为什么每次都是两个车辆图标,而且方向不对
07-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值