为什么在查看targetLocation时,我的headingValue与bearingValue不同?

时间:2015-08-14 16:18:40

标签: java android gps heading bearing

在我的Android应用程序中,我必须使用我当前的标题(使用加速度计和磁力计)和当前方位targetLocationlocation.bearingTo(targetLocation))。

我已经知道使用加速度计和磁力计来确定当前航向从磁北的0°开始,当前轴承从地理北方开始。所以我想,我必须根据我当前的位置添加headingValue,这个值叫做赤纬。

例如,我从google-maps中选取一个GPS点,将此点添加为应用程序中的位置点。启动应用程序,在测量设备之前移动,如空中的无限符号,并将设备放在我面前,聚焦在目标方向上。所以我注意到了标题!=轴承。任何人都可以向我解释错误吗?假设我尝试了50到3米之间的不同距离,并且我的设备已正确校准。以下是源代码的重要方法:

@Override
public void onSensorChanged(SensorEvent event) {

        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
            mGravity = event.values.clone();
        if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
            mGeomagnetic = event.values.clone();
        if (mGravity != null && mGeomagnetic != null) {
            float R[] = new float[9];
            float I[] = new float[9];
            boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic);
            if (success) {
                float orientation[] = new float[3];
                SensorManager.getOrientation(R, orientation);

                double tempAzimuth = Math.toDegrees(orientation[0]); // orientation contains: azimut, pitch and roll

                if(tempAzimuth < 0){
                    currentHeading = tempAzimuth + 360;
                } else {
                    currentHeading = tempAzimuth;
                }
                TVheadingMag.setText(""+String.format( "%.2f",currentHeading)+"°");
            }
        }

    }

@Override
public void onLocationChanged(Location location) {

    //Declination http://stackoverflow.com/questions/4308262/calculate-compass-bearing-heading-to-location-in-android
    geoField = new GeomagneticField(
            Double.valueOf(location.getLatitude()).floatValue(),
            Double.valueOf(location.getLongitude()).floatValue(),
            Double.valueOf(location.getAltitude()).floatValue(),
            System.currentTimeMillis());

    if(location.bearingTo(this.target)<0){
        currentBearing = location.bearingTo(this.target)+360;
    } else {
        currentBearing = location.bearingTo(this.target);
    }

    headingWithDeclination = currentHeading;
    headingWithDeclination += geoField.getDeclination();


    currentDistance = location.distanceTo(this.target);

    TVheading.setText(""+String.format( "%.2f", headingWithDeclination)+"°");
    TVheadingMag.setText(""+String.format( "%.2f",currentHeading)+"°");

    TVbearing.setText(""+String.format( "%.2f",currentBearing)+"°");
    TVgps.setText(""+ String.format( "%.6f",location.getLatitude()) + "   " + String.format( "%.6f",location.getLongitude()));

}

更新

图片:https://pl.vc/1r6ap

橙色标记的位置是targetLocation。 两个位置都朝向targetLocation。 你能同意这些结果是否正确显示?

在创建这张照片时,我注意到两个白色标记都不等于我所站立的位置。似乎坏gps数据是因为这个问题的原因,不是吗?

0 个答案:

没有答案