如何计算当前方向与GPS点之间的角度?

5

我有两个点(Android位置对象):当前位置和目标位置。另外,我有一个设备方向(以度数表示)。

enter image description here

我想计算目标位置和方向之间的角度。如何正确做?
我从FusedLocationProvider接收位置(如果这很重要)。 现在我只是使用
float requiredAngle = Math.abs(location.getBearing() - 180 - target.bearingTo(location)); float angleBetween = Math.abs(requiredAngle - location.getBearing());
它返回不正确的角度。
我认为我应该计算真北和磁北之间的差异,并添加设备方向。然后使用currentPosition.bearingTo(target),并从方位中减去设备方向。

这是一个二维还是三维场?如果告诉我们X、Y和Z,我们就能为这个问题提供一个公式。 - schweppes0x
这是一个3D场。我有地球上某一点的GPS坐标:纬度和经度。 - Vladislav
2个回答

0

这个角度被称为相对方位

注册监听器到Sensor.TYPE_ROTATION_VECTOR、Sensor.TYPE_ACCELEROMETER、Sensor.TYPE_MAGNETIC_FIELD。例如:

sensorManager.registerListener(listener, sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR), SensorManager.SENSOR_DELAY_NORMAL);

然后为此创建一个监听器:

private float[] gravity;
private float[] geomagnetic;
private float[] R = new float[9];
private float[] I = new float[9];    

@Override
public void onSensorChanged(SensorEvent event) {
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
        gravity = sensor.values(); // Just save the values
    }

    if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
        geomagnetic = sensor.values();
    }

    if (SensorManager.getRotationMatrix(R, I, gravity, geomagnetic)) { // If something is wrong (like device is in free fall)
        float orientation[] = new float[3];
        SensorManager.getOrientation(R, orientation);
        // Now you have values from -PI to PI
        float heading;
        if (R[0] > 0) { // R[0] is heading
            heading = R[0] * 180 / PI;
        } else { // -PI, eq. from South to West to North
            heading = (Math.abs(R[0]) * 180 / PI) * 2;
        }

        float relativeBearing = location.bearingTo(target) - heading;
        if (relativeBearing < 0) {
            relativeBearing = 360 + relativeBearing;
        }
    }
}

Documentation: https://developer.android.com/reference/android/hardware/SensorManager#getRotationMatrix(float[],%20float[],%20float[],%20float[]) https://developer.android.com/reference/android/hardware/SensorManager#getOrientation(float[],%20float[])


0

如果是这种情况,您可以查看这篇文章:https://onlinemschool.com/math/library/vector/angl/

  1. 计算向量的点积
  2. 计算向量的大小
  3. 计算这两个向量之间的夹角

向量A和向量B之间夹角的公式为: cosine(alpha) = dotProductAB / (magnitudeA * magnitudeB)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接