You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

211 lines
5.6 KiB

var OverpassLayer = require('overpass-layer')
const { measureFrom } = require('measure-ts')
const formatcoords = require('formatcoords')
const settings = {
coordFormat: 'FFf',
coordSpacer: ', ',
system: 'si',
speed: 'km/h'
}
const distanceUnits = {
si: ['cm', 'm', 'km'],
imp: ['in', 'ft', 'yd', 'mi'],
nautical: ['M'],
m: ['m']
}
const areaUnits = {
si: ['cm2', 'm2', 'ha', 'km2'],
imp: ['in2', 'ft2', 'yd2', 'ac', 'mi2'],
nautical: ['M2'],
m: ['m2']
}
const coordsPrecisionFormats = {
'FFf': [
'DD X',
'DD MM X',
'DD MM X',
'DD MM ss0 X',
'DD MM ss1 X',
'DD MM ss2 X',
'DD MM ss3 X'
],
'Ff': [
'DD X',
'DD MM X',
'DD MM X',
'DD mm1 X',
'DD mm2 X',
'DD mm3 X',
'DD mm4 X'
],
'f': [
'DD X',
'dd1 X',
'dd2 X',
'dd3 X',
'dd4 X',
'dd5 X',
'dd6 X'
]
}
module.exports = {
distance: value => {
const measure = measureFrom.apply(this, distanceUnits[settings.system])
return measure(value).toString()
},
height: value => {
switch (settings.system) {
case 'imp':
return (value / 0.3048) .toFixed(0) + ' ft'
case 'nautical':
// not defined for nautical, use 'm' instead
case 'si':
case 'm':
default:
return value.toFixed(0) + ' m'
}
const measure = measureFrom.apply(this, distanceUnits[settings.system])
return measure(value).toString()
},
area: value => {
const measure = measureFrom.apply(this, areaUnits[settings.system])
return measure(value).toString()
},
speed: value => {
switch (settings.speed) {
case 'm/s':
return value.toFixed(0) + ' ' + lang('formatUnits:speed:m/s')
case 'km/h':
return (value * 3.6).toFixed(0) + ' ' + lang('formatUnits:speed:km/h')
case 'mi/h':
return (value * 2.236936).toFixed(0) + ' ' + lang('formatUnits:speed:mi/h')
case 'kn':
return (value * 1.943844).toFixed(0) + ' ' + lang('formatUnits:speed:kn')
case 'ft/s':
return (value * 3.280840).toFixed(0) + ' ' + lang('formatUnits:speed:ft/s')
}
},
coord: (value, options = {}) => {
let format = settings.coordFormat
options.precision = 'precision' in options ? options.precision : 5
let decimalPlaces = 'decimalPlaces' in options ? options.decimalPlaces : options.precision
if ('precision' in options && settings.coordFormat in coordsPrecisionFormats) {
if (options.precision > coordsPrecisionFormats[settings.coordFormat].length) {
format = coordsPrecisionFormats[settings.coordFormat][coordsPrecisionFormats[settings.coordFormat].length - 1]
} else {
format = coordsPrecisionFormats[settings.coordFormat][options.precision]
}
}
let m = format.match(/^(.*)(s|m|d)([0-9]+)(.*)$/)
if (m) {
format = m[1] + m[2] + m[4]
decimalPlaces = parseInt(m[3])
}
let result = formatcoords(value).format(format, {
latLonSeparator: settings.coordSpacer,
decimalPlaces
})
result = '<a href="geo:' + value.lat.toFixed(5) + ',' + value.lng.toFixed(5) + '">' + result + '</a>'
return result
},
settings
}
register_hook('options_form', def => {
def.formatUnitsSystem = {
'name': lang('formatUnits:system'),
'type': 'select',
'values': {
'si': lang('formatUnits:system:si'),
'imp': lang('formatUnits:system:imp'),
'nautical': lang('formatUnits:system:nautical'),
'm': lang('formatUnits:system:m'),
},
'default': settings.system
}
def.formatUnitsCoordFormat = {
'name': lang('formatUnits:coordFormat'),
'desc': 'A format definition as specified in <a target="_blank" href="https://github.com/nerik/formatcoords">module formatCoords</a>',
'type': 'select_other',
'values': {
'FFf': 'DD° MM′ SS.SSS″ X',
'Ff': 'DD° MM.MMM′ X',
'f': 'DD.DDD° X',
'-d': '±DD.DDD'
},
'default': settings.coordFormat
}
def.formatUnitsCoordSpacer = {
'name': lang('formatUnits:coordSpacer'),
'type': 'select_other',
'values': {
' ': 'Space',
', ': 'Colon'
},
'default': settings.coordSpacer
}
def.formatUnitsSpeed = {
'name': lang('formatUnits:speed'),
'type': 'select',
'values': {
'km/h': lang('formatUnits:speed:km/h'),
'mi/h': lang('formatUnits:speed:mi/h'),
'm/s': lang('formatUnits:speed:m/s'),
'kn': lang('formatUnits:speed:kn'),
'ft/s': lang('formatUnits:speed:ft/s')
},
'default': settings.speed
}
})
register_hook('options_orig_data', data => {
data.formatUnitsSystem = settings.system
data.formatUnitsCoordFormat = settings.coordFormat
data.formatUnitsCoordSpacer = settings.coordSpacer
data.formatUnitsSpeed = settings.speed
})
register_hook('options_save', data => {
let old = JSON.stringify(settings)
settings.coordFormat = data.formatUnitsCoordFormat
settings.coordSpacer = data.formatUnitsCoordSpacer
settings.system = data.formatUnitsSystem
settings.speed = data.formatUnitsSpeed
if (old !== JSON.stringify(settings)) {
call_hooks('format-units-refresh')
}
})
register_hook('init', () => {
let old = JSON.stringify(settings)
settings.coordFormat = global.options.formatUnitsCoordFormat || settings.coordFormat
settings.coordSpacer = global.options.formatUnitsCoordSpacer || settings.coordSpacer
settings.system = global.options.formatUnitsSystem || settings.system
settings.speed = global.options.formatUnitsSpeed || settings.speed
if (old !== JSON.stringify(settings)) {
call_hooks('format-units-refresh')
}
})
OverpassLayer.twig.extendFunction('formatDistance', function () {
return module.exports.distance.call(this, arguments[0])
})