我想在Google map View 上的我的位置显示一个箭头,该箭头显示我相对于目的地位置(而不是北方)的方向。
a)我已经使用磁力计和加速度计的传感器值算出了北方。我知道这是正确的,因为它与Google Map View 上使用的指南针对齐。
b)我已经通过使用myLocation.bearingTo(destLocation)计算了从我的位置到目的地位置的初始方位;
我错过了最后一步;从这两个值(a和b)中,我使用什么公式来获得手机相对于目的地位置所指向的方向?
感谢您的帮助,以备不时之需!
最佳答案
好吧,我明白了。对于其他尝试这样做的人,您需要:
a)航向:您从硬件指南针航向。这是磁性北以东的度数
b)方位:从您所在位置到目的地位置的方位。这是东部北部的度数。
myLocation.bearingTo(destLocation);
c)磁偏角:真北与磁北之间的差异
磁力计+加速度计返回的航向为真实(磁性)北向东的度数(-180到+180),因此您需要获取您所在位置的北向与北磁差。这种差异是可变的,具体取决于您在地球上的何处。您可以通过使用GeomagneticField类获得。
GeomagneticField geoField;
private final LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
geoField = new GeomagneticField(
Double.valueOf(location.getLatitude()).floatValue(),
Double.valueOf(location.getLongitude()).floatValue(),
Double.valueOf(location.getAltitude()).floatValue(),
System.currentTimeMillis()
);
...
}
}
有了这些,您就可以计算出要在 map 上绘制的箭头的角度,以显示相对于目标对象而不是正北的方向。
首先用偏角调整航向:
heading += geoField.getDeclination();
其次,您需要使电话面向的方向(朝向)偏离目标目的地,而不是正北。这是我坚持的部分。从指南针返回的航向值为您提供了一个值,该值描述了相对于手机指向的位置的磁北向(以真北向东为度)。所以如果值为-10,则说明磁北向左偏10度。方位角以真实北向东的角度为您提供目的地的角度。因此,在补偿了磁偏角之后,可以使用下面的公式来获得所需的结果:
heading = myBearing - (myBearing + heading);
然后,您需要将正北(-180到+180)以东的度数转换为正常度(0到360):
Math.round(-heading / 360 + 180)