Flutter问题:根据当前位置与Bearing计算目标点异常排查
问题分析与解决方案
核心错误原因
你的计算代码存在致命疏漏:直接使用度数格式的经纬度参与三角函数运算,而sin/cos/asin等三角函数要求输入值为弧度。这会导致方位角计算完全失效,不同Bearing值算出的终点坐标几乎重合,最终线条视觉上没有区别。
修正后的代码
final la1 = vector.radians(userPosition.latitude); // 纬度转弧度 final lo1 = vector.radians(userPosition.longitude); // 经度转弧度 const r = 6367; // 地球半径(单位:公里) const d = 40; // 目标距离(单位:公里) const dist = d / r; // 弧度制距离 final bearing = vector.radians(direction.value); // 确保direction.value是地理正北为基准的方位角 // 计算终点的弧度坐标 final la2 = asin( sin(la1) * cos(dist) + cos(la1) * sin(dist) * cos(bearing) ); final lo2 = lo1 + atan2( sin(bearing) * sin(dist) * cos(la1), cos(dist) - sin(la1) * sin(la2) ); // 将弧度转回度数,生成最终坐标 return LatLng(vector.degrees(la2), vector.degrees(lo2));
额外注意事项
- 确认
direction.value的定义:必须是以地理正北为0度的方位角。如果是设备自身的朝向(比如屏幕顶部指向的方向),需要结合地图的当前旋转角度,或者通过传感器数据将设备朝向转换为地理方位角,否则旋转手机时线条方向不会匹配地图视角。 - 测试验证:可以用已知方位角测试,比如输入0度(正北),终点应在当前位置正北;输入90度(正东),终点应在正东,以此确认计算逻辑正确。
内容的提问来源于stack exchange,提问作者Lab
相关产品推荐
相关产品推荐

