2021-01-16 23:59:59 +08:00
|
|
|
import {GPSMetadata} from '../../../common/entities/PhotoDTO';
|
2021-04-06 17:32:31 +08:00
|
|
|
import * as NodeGeocoder from 'node-geocoder';
|
|
|
|
import {LocationLookupException} from '../../exceptions/LocationLookupException';
|
|
|
|
import {Utils} from '../../../common/Utils';
|
2021-01-16 23:59:59 +08:00
|
|
|
|
|
|
|
export class LocationManager {
|
2021-04-06 17:32:31 +08:00
|
|
|
readonly geocoder: NodeGeocoder.Geocoder;
|
|
|
|
cache = new Utils.LRU<GPSMetadata>(100);
|
|
|
|
|
|
|
|
constructor() {
|
|
|
|
this.geocoder = NodeGeocoder({provider: 'openstreetmap'});
|
|
|
|
}
|
2021-01-16 23:59:59 +08:00
|
|
|
|
|
|
|
async getGPSData(text: string): Promise<GPSMetadata> {
|
2021-04-06 17:32:31 +08:00
|
|
|
if (!this.cache.get(text)) {
|
|
|
|
|
|
|
|
const ret = await this.geocoder.geocode(text);
|
|
|
|
if (ret.length < 1) {
|
|
|
|
throw new LocationLookupException('Cannot find location:' + text, text);
|
|
|
|
}
|
|
|
|
this.cache.set(text, {
|
|
|
|
latitude: ret[0].latitude,
|
|
|
|
longitude: ret[0].longitude
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
return this.cache.get(text);
|
2021-01-16 23:59:59 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|