UNPKG

@jsxc/jsxc

Version:

Real-time XMPP chat application with video calls, file transfer and encrypted communication

73 lines (59 loc) 2.17 kB
import { REGEX } from '@src/CONST'; export default class Location { public static getCurrentLocation(): Promise<{ coords: { latitude: number; longitude: number; accuracy: number }; }> { return new Promise((resolve, reject) => { navigator.geolocation.getCurrentPosition( position => resolve(position), error => reject(error) ); }); } public static async getCurrentLocationAsGeoUri(): Promise<string> { let { coords } = await Location.getCurrentLocation(); return `geo:${coords.latitude},${coords.longitude};u=${coords.accuracy}`; } public static getCurrentLocationAsLink(zoom: number = 16) { return Location.getCurrentLocation().then(({ coords }) => { return Location.locationToLink(coords.latitude, coords.longitude, zoom); }); } public static locationToLink(latitude: number, longitude: number, zoom: number = 16) { return `https://www.openstreetmap.org/?mlat=${latitude}&mlon=${longitude}&zoom=${zoom}`; } public static parseGeoUri(uri: string) { let matches = uri.match(new RegExp(REGEX.GEOURI, '')); let latitude = matches[1] && parseFloat(matches[1]); let longitude = matches[2] && parseFloat(matches[2]); let accuracy = matches[3] && parseFloat(matches[3]); return { latitude, longitude, accuracy, }; } public static ddToDms(latitude: number, longitude: number): string { let latDms = Location.decimalToDms(latitude); let lonDms = Location.decimalToDms(longitude); let latPostfix = latitude > 0 ? 'N' : 'S'; let lonPostfix = longitude > 0 ? 'E' : 'W'; return latDms + latPostfix + ' ' + lonDms + lonPostfix; } private static decimalToDms(deg: number): string { let d = Math.floor(deg); let minFloat = (deg - d) * 60; let m = Math.floor(minFloat); let secFloat = (minFloat - m) * 60; let s = Math.round(secFloat * 10) / 10; if (s === 60) { m++; s = 0; } if (m === 60) { d++; m = 0; } return `${d}°${m}'${s}"`; } }