Ionic 3 - Как повернуть маркер в картах Google родной, как компас? - PullRequest
0 голосов
/ 23 сентября 2019

Я пытаюсь повернуть значок (маркер) на карте, как компас.Я использую датчик акселерометра, чтобы установить угол наклона телефона, но результат будет неточным даже после нормализации значений оси XYZ и преобразования из радиуса в угол.Как мне сделать это вращение?

В ionic 3 я использую плагин «cordova-plugin-device-motion»: «^ 2.0.1», чтобы получить значения осей и затем сгенерировать векторную нормализацию.После нормализации вектора я могу получить угол наклона устройства от оси Z, но не могу получить вращение оси XY.

  1. Угол наклона оси Z

let inclination: number = Math.round(this.toDegrees(Math.acos(this.sensor.acc.z)));

Угол поворота вокруг осей XY

let rotation: number = Math.round(this.toDegrees(Math.atan2(this.sensor.acc.y, this.sensor.acc.x)));

import { firebaseConfig } from './../../app/app.module';
import { TaxiDriverServiceProvider } from '../../providers/taxi-driver-service/taxi-driver-service';
import { Injectable, NgZone } from '@angular/core';
import { Subscription, Observable, Subject } from 'rxjs';

import 'rxjs/add/operator/filter';

import { Device } from '@ionic-native/device';
import { Gyroscope, GyroscopeOptions, GyroscopeOrientation } from '@ionic-native/gyroscope';
import { DeviceMotion, DeviceMotionAccelerationData } from '@ionic-native/device-motion';
import { Geolocation, Geoposition, GeolocationOptions } from '@ionic-native/geolocation';

import * as firebase from 'firebase';
import { Platform, Events } from 'ionic-angular';

const KEY_DEVICE_UUID = 'key_device_ref';
const PATH_REFERENCE = 'db_realtime/';

interface Sensor {
  orient: { x: number, y: number, z: number; timestamp?: number; },
  acc: { x: number, y: number, z: number; timestamp?: number; },
  angle: number
}

@Injectable()
export class LocationTrackingProvider {

  ref: any;
  geolocationSb: Subscription;
  accelerometerSb: Subscription;

  watch: Observable<Geoposition>;
  lat: number = 0;
  lng: number = 0;
  sensor: Sensor = {} as Sensor;

  // Foreground Trackin
  geolocationOptions: GeolocationOptions = {
    // frequency: 3000,
    enableHighAccuracy: true
  };

  gyroscopeListener: Subject<any> = new Subject();

  constructor(
    private events: Events,
    public deviceMotion: DeviceMotion,
    public zone: NgZone,
    public geolocation: Geolocation,
    public platform: Platform,
    public device: Device) {

    firebase.initializeApp(firebaseConfig);
    this.ref = firebase.database().ref(PATH_REFERENCE);

  }

  accelerometerStart() {
    this.deviceMotion.getCurrentAcceleration().then(
      (acceleration: DeviceMotionAccelerationData) => console.log(JSON.stringify(acceleration))
    );

    this.accelerometerSb = this.deviceMotion.watchAcceleration()
      .subscribe((acceleration: DeviceMotionAccelerationData) => {

        let normOfg: number = Math.sqrt(
          acceleration.x * acceleration.x +
          acceleration.y * acceleration.y +
          acceleration.z * acceleration.z
        );

        // Normalize the accelerometer vector
        this.sensor.acc = {
          x: acceleration.x / normOfg,
          y: acceleration.y / normOfg,
          z: acceleration.z / normOfg
        };

        let inclination: number = Math.round(this.toDegrees(Math.acos(this.sensor.acc.z)));
        let rotation: number = Math.round(this.toDegrees(Math.atan2(this.sensor.acc.y, this.sensor.acc.x)));

        console.log(`normalize: ${normOfg} rot1:${rotation} inc:${inclination}`);

        this.events.publish("maps:compass", { angle: rotation });

        if (inclination < 25 || inclination > 155) {
        }
      });
  }

  toDegrees(radians): number {
    return radians * (180 / Math.PI);
  }

}

Независимо от угла наклона оси Z мне нужно вращение устройства в этом XYплоскость, следующее изображение:

https://i.stack.imgur.com/gbzQG.png

...