问题描述
这是我的代码,它记录位置,但是更新时间为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秒的间隔内“近似”地理数据。