Подшипник GPS на какой шкале

  • В каком масштабе location.getBearing()возвращает угол, от 0 до 360 в градусах к востоку от северного направления или в каком-то другом масштабе.

  • Должен ли курс моего телефона с истинным севером совпадать с этим направлением, если мой телефон расположен параллельно направлению движения?

Я рассчитываю азимут с SensorManager.getOrientation(rotationMatrix,vals) функция и добавил склонение GPS к нему, чтобы получить устройство курс на истинный север.

2 ответа

Да, азимут измеряется (и доставляется) в градусах от истинного севера по часовой стрелке. Некоторые описывают это как градусы к востоку от севера. Диапазон составляет 0 - 359,9999. Так что 0 градусов это север.

2) Обратите внимание, что математические углы имеют 0° на востоке и увеличиваются против часовой стрелки. В зависимости от кода вы должны конвертировать между географическими углами в математические.

Дальнейшее объяснение 2): Если вы посмотрите на карту, то север направлен вверх, восток направо, это соответствует нашей 2-й декартовой системе координат, которую мы всегда использовали в школе:

Пространство x,y:

В этом пространстве положительное значение x находится в направлении вправо, которое является востоком на большинстве карт, положительное значение y в верхнем направлении или северное направление на картах, отрицательные значения - запад и юг.

При преобразовании координат долготы по широте в декартову x,y для использования более простой школьной математики, такой как вычисление углов, расстояния и т. Д., Необходимо учитывать, что все математические операции основаны на декартовой x,y мире. И в этом мире 0° в направлении положительной оси X (восток на карте). +90° (математический угол) в направлении у достижения. в то время как географическое направление +90 находится в восточном направлении, что обозначено x-achsis. Таким образом, математические углы поднимаются против часовой стрелки, а компасная роза (= геоиграфические углы) поднимается по часовой стрелке.

При трансформации между этими волдами вы должны учитывать это.

Однако для некоторых применений вам не нужно переходить между сферическим и декартовым миром, но, возможно, вам придется это делать при использовании датчиков ускорения и гироскопа.

Это то, что я сделал, вы можете сослаться на этот код.

onSensorChanged

@Override
        public void onSensorChanged(SensorEvent event) {
            // TODO Auto-generated method stub
            if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
                mGeomagnetic = event.values;
            if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
                mGravity = event.values;

            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);
                    azimut = orientation[0]; // orientation contains:
                                                // azimut, pitch and roll
                    rotateCompass(azimut);
                }
            }
        }

Рассчитать подшипник

private void rotateCompass(final float azimut) {

    float azimuth = (float) Math.round(Math.toDegrees(azimut));
    Location currentLoc = new Location("");
    currentLoc.setLatitude(curr_lat);
    currentLoc.setLongitude(curr_long);
    Location target = new Location("");
    target.setLatitude(dest_lat);
    target.setLongitude(dest_lng);

    float bearing = currentLoc.bearingTo(target); // (it's already in degrees)
    if (bearing < 0) {
        bearing = bearing + 360;
    }
    float direction = (float) (bearing - azimuth);

     // If the direction is smaller than 0, add 360 to get the rotation clockwise.
    if (direction < 0) {
        direction = direction + 360;
    }

    showToast("" + direction);
    rotateImageView(imgCompass, R.drawable.pin_finder, direction);
}

Повернуть изображение в соответствии с направлением в градусах

private void rotateImageView(ImageView imageView, int drawable, float rotate) {

    // Decode the drawable into a bitmap
    Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(),
            drawable);
    // Get the width/height of the drawable
    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);
    int width = bitmapOrg.getWidth(), height = bitmapOrg.getHeight();

    // Initialize a new Matrix
    Matrix matrix = new Matrix();

    // Decide on how much to rotate
    rotate = rotate % 360;

    // Actually rotate the image
    matrix.postRotate(rotate, width, height);

    // recreate the new Bitmap via a couple conditions
    Bitmap rotatedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, width,
            height, matrix, true);
    // BitmapDrawable bmd = new BitmapDrawable( rotatedBitmap );

    // imageView.setImageBitmap( rotatedBitmap );
    imageView.setImageDrawable(new BitmapDrawable(getResources(),
            rotatedBitmap));
    imageView.setScaleType(ScaleType.CENTER);
}
Другие вопросы по тегам