如何才能在Ionic中获得GPS ONLY位置?

时间:2018-01-31 10:55:28

标签: javascript android ionic-framework gps location

我正在创建一个应用程序,用户,我工作的公司的成员,只需按下按钮并编写名称就可以按需注册兴趣点,然后将它们发送并存储到服务器。

但我对位置的准确性有疑问。我正在使用@ionic-native/geolocation,即使我将enableHighAccuracy设置为true,我也收不到精确的位置。其中一些比他们拍摄的地方更远。

有没有办法只从GPS传感器获取地理位置?

我一直在谷歌搜索几个小时,但没有运气。也许我做错了什么。

这是我在客户端获取位置的代码:

obtenirPosicio(): Promise<Geoposicio> {
return new Promise<Geoposicio>((resolve, reject) => {

	const OPCIONS_GPS = {} as GeolocationOptions;
	OPCIONS_GPS.enableHighAccuracy = true;
	OPCIONS_GPS.maximumAge = 0;
	OPCIONS_GPS.timeout = 10000; // 10 segons de timeout per obtenir posicio GPS

	this.gps.getCurrentPosition(OPCIONS_GPS).then(res => {
		let nova_posicio = {} as Geoposicio;
		nova_posicio.lat = res.coords.latitude;
		nova_posicio.lng = res.coords.longitude;
		resolve(nova_posicio);
	}).catch(err => {
		reject(err);
	});

});
}

PS:我只是瞄准Android

1 个答案:

答案 0 :(得分:0)

除非用户将位置模式设置为“仅设备”(即GPS),否则当位置模式为“高精度”时,Android位置管理器将通过GPS和非GPS源发送位置数据,因此有些人会是不准确的Wifi /蓝牙/单元格三角测量位置。

但是,您可以通过查看结果的coords.accuracy属性来过滤掉这些属性,该属性表示位置的估计精确度。 确定您准备接受的最低准确度,然后拒绝任何不准确的准确度。

例如:

obtenirPosicio(): Promise<Geoposicio> {
    return new Promise<Geoposicio>((resolve, reject) => {

        const MIN_ACCURACY = 20; // metres
        const OPCIONS_GPS = {} as GeolocationOptions;
        OPCIONS_GPS.enableHighAccuracy = true;
        OPCIONS_GPS.maximumAge = 0;
        OPCIONS_GPS.timeout = 10000; // 10 segons de timeout per obtenir posicio GPS

        this.gps.getCurrentPosition(OPCIONS_GPS).then(res => {
            // Reject udpate if accuracy is not sufficient
            if(!res.coords.accuracy || res.coords.accuracy > MIN_ACCURACY){
              console.warn("Position update rejected because accuracy of"+res.coords.accuracy+"m is less than required "+MIN_ACCURACY+"m");
              return; // and reject() if you want
            }

            let nova_posicio = {} as Geoposicio;
            nova_posicio.lat = res.coords.latitude;
            nova_posicio.lng = res.coords.longitude;
            resolve(nova_posicio);
        }).catch(err => {
            reject(err);
        });

    });
}