oak-frontend-base/es/features/location.js

73 lines
3.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { Feature } from '../types/Feature';
export class Location extends Feature {
latitude;
longitude;
lastTimestamp;
acceptableLatency;
constructor(acceptableLatency) {
super();
this.acceptableLatency = acceptableLatency || 1000;
}
get() {
return {
latitude: this.latitude,
longitude: this.longitude,
lastTimestamp: this.lastTimestamp,
};
}
async refresh() {
if (process.env.OAK_PLATFORM === 'wechatMp') {
// 小程序平台
const result = await wx.getLocation({
type: 'gcj02',
});
this.latitude = result.latitude;
this.longitude = result.longitude;
this.lastTimestamp = Date.now();
}
else {
const getGeolocation = () => new Promise((resolve, reject) => {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition((position) => {
// 1. coords.latitude估计纬度
// 2. coords.longitude估计经度
// 3. coords.altitude估计高度
// 4. coords.accuracy所提供的以米为单位的经度和纬度估计的精确度
// 5. coords.altitudeAccuracy所提供的以米为单位的高度估计的精确度
// 6. coords.heading 宿主设备当前移动的角度方向,相对于正北方向顺时针计算
// 7. coords.speed以米每秒为单位的设备的当前对地速度
const coords = position.coords;
const location = {
accuracy: coords.accuracy,
altitude: coords.altitude,
altitudeAccuracy: coords.altitudeAccuracy,
heading: coords.heading,
latitude: coords.latitude,
longitude: coords.longitude,
speed: coords.speed,
};
resolve(location);
}, (error) => {
reject(error);
}, {
// 指示浏览器获取高精度的位置默认为false
enableHighAccuracy: true,
// 指定获取地理位置的超时时间,默认不限时,单位为毫秒
timeout: 10000,
// 最长有效期,在重复获取地理位置时,此参数指定多久再次获取位置。
maximumAge: 3000,
});
}
else {
reject('Your browser does not support Geolocation!');
}
});
const result = (await getGeolocation());
this.lastTimestamp = Date.now();
this.latitude = result.latitude;
this.longitude = result.longitude;
}
this.publish();
}
}