记录坐标,在几秒钟内更新在离子

问题描述

这是我的代码,它记录位置,但是更新时间为5秒,我想将其减少到500毫秒左右。该应用程序正常运行,只是希望减少时间

  import { Component,ngzone } from '@angular/core';
import { Plugins } from '@capacitor/core';
const { Geolocation } = Plugins;
import { NativeGeocoder,NativeGeocoderResult,NativeGeocoderOptions } from '@ionic-native/native-geocoder/ngx';
@Component({
  selector: 'app-tab3',templateUrl: 'tab3.page.html',styleUrls: ['tab3.page.scss']
})
export class Tab3Page {
  public lat: any;
  public lng: any;
  points: any;
  wait: any;
  constructor(public ngzone: ngzone) { 
    this.points = [];
  }
  track() {
    this.wait = Geolocation.watchPosition({},(position,err) => {
      this.ngzone.run(() => {
        this.lat = position.coords.latitude;
        this.lng = position.coords.longitude;
        let date = new Date().toLocaleTimeString();
        this.addNewLocation(position.coords.latitude,position.coords.longitude,date);
      })
    })
  }
  stopTracking() {
    Geolocation.clearWatch({ id: this.wait });
  }
  addNewLocation(lat,lng,time) {
    this.points.unshift({
      lat,time,});
  }
}

解决方法

请尝试利用the timeout option

PositionOptions.timeout属性为正的long值 表示设备的最大时间长度(以毫秒为单位) 允许采取以返回职位。默认值为 无穷大,意味着getCurrentPosition()直到 职位空缺。

您可以像这样使用它:

track() {
    this.wait = Geolocation.watchPosition({ enableHighAccuracy: false,timeout: 500,maximumAge: 0 },(position,err) => {
      this.ngZone.run(() => {
        this.lat = position.coords.latitude;
        this.lng = position.coords.longitude;
        let date = new Date().toLocaleTimeString();
        this.addNewLocation(position.coords.latitude,position.coords.longitude,date);
      })
    })
  }

电容器文档也确认此方法可以正常工作:https://capacitorjs.com/docs/apis/geolocation#type-162408

如果watchPosition方法不能帮助您解决用例,则可以尝试实现自己的“ watch”方法。不幸的是,我无法使用带有电容器的应用程序,但是如下所示的内容应该可以使您走上正轨:

import { Component,NgZone } from '@angular/core';
import { Plugins } from '@capacitor/core';
const { Geolocation } = Plugins;
import { NativeGeocoder,NativeGeocoderResult,NativeGeocoderOptions } from '@ionic-native/native-geocoder/ngx';
import { interval } from 'rxjs';
import { Subscription } from 'rxjs';
import { concatMap } from 'rxjs/operators';

@Component({
  selector: 'app-tab3',templateUrl: 'tab3.page.html',styleUrls: ['tab3.page.scss']
})
export class Tab3Page {

  private subscription: Subscription;

  constructor(public ngZone: NgZone) { 
  }

  track() {
    const interval500 = interval(500);
    this.subscription = interval500.pipe(
        concatMap(val => Geolocation.getCurrentPosition())
    ).subscribe(coordinates => console.log(coordinates));
  }

  stopTracking() {
    this.subscription.unsubscribe();
  }

}

基本上,您将需要自己的间隔(500ms),然后为间隔的每个“滴答”调用getCurrentPosition方法。然后适当退订。

实际上不建议这样做,因为这会导致电池问题等。 此外,如果设备在更新数量上受到设备级别的限制,则该设备可能仍无法提供地理数据。

根据使用情况,您可能希望在5秒的间隔内“近似”地理数据。