gancio-upstream/server/services/geocoding/nominatim.js

70 lines
1.8 KiB
JavaScript
Raw Normal View History

const cache = require('memory-cache')
const providerCache = new cache.Cache()
const get = require('lodash/get')
const nominatim = {
commonName: 'Nominatim',
DEFAULT_ENDPOINT: 'https://nominatim.openstreetmap.org/search',
endpoint: (req, res) => {
return res.locals.settings.geocoding_provider || nominatim.DEFAULT_ENDPOINT
},
cache: providerCache,
getParams (req, res) {
const countrycodes = res.locals.settings.geocoding_countrycodes || []
const details = req.params.place_details
return {
countrycodes: countrycodes.join(','),
q: details,
limit: 3,
format: 'json',
addressdetails: 1,
namedetails: 1,
}
},
/**
* Icons to nominatim `osm_type` and `class` conversion
*/
searchIcons_nominatim_osm_type: {
way: 'mdiRoadVariant',
house: 'mdiHome',
node: 'mdiMapMarker',
relation: 'mdiCityVariant',
},
searchIcons_nominatim_class: ['place', 'amenity', 'shop', 'tourism', 'leisure', 'building'],
loadResultIcon (item) {
if (this.searchIcons_nominatim_class.includes(item.class)) {
return 'mdiHome'
}
return this.searchIcons_nominatim_osm_type[item.type]
},
/**
* Map results from provider
*/
filterNameFromAddress: ['place', 'amenity', 'shop', 'tourism', 'leisure', 'building'],
mapQueryResults (ret, addressList = []) {
if (ret && ret.length) {
addressList = ret.map(v => {
const name = get(v.namedetails, 'alt_name', get(v.namedetails, 'name'))
const address = this.filterNameFromAddress.includes(v.class) ? v.display_name.replace(name, '').replace(/^, ?/, '') : v.display_name.replace(/^, ?/, '')
return {
class: v.class,
type: v.osm_type,
lat: v.lat,
lon: v.lon,
name,
address
}
})
}
return addressList
}
}
module.exports = nominatim