/** outils pour gérer les échelles */
import { getPointResolution } from 'ol/proj'
const DEFAULT_DPI = 25.4 / 0.28
const inchPerUnit = { m: 1000 / 25.4, 'us-ft': 12 }
/**
* Converti une résolution en echelle d'affichage
* @param {ol.view} view vue de la carte
* @param {Number} resolution résolution a convertir
* @param {Number} [dpi = 25.4 / 0.28] nombre de pixel par pouce (utile pour un pdf)
* @param {Boolean} [round=false] arrondir le résultat?
* @returns Number
*/
function getScaleForResolution (view, resolution, dpi, round) {
resolution = getPointResolution(
view.getProjection(),
resolution || view.getResolution(),
view.getCenter(),
'm'
)
dpi = dpi || DEFAULT_DPI
const scale = resolution * inchPerUnit.m * dpi
return round ? Math.round(scale) : scale
}
/**
* Converti une échelle a atteindre en résolution de carte
* @param {ol.view} view vue de la carte
* @param {Number} scale échelle a atteindre
* @param {Number} [dpi = 25.4 / 0.28] nombre de pixel par pouce (utile pour un pdf)
* @returns Number
*/
function getResolutionForScale (view, scale, dpi) {
dpi = dpi || DEFAULT_DPI
// calcule la résolution en fonction de la densité de pixel
const resolution = scale / getPointResolution(
view.getProjection(),
dpi / 25.4,
view.getCenter(),
'm'
) / 1000
return resolution
}
/**
* Converti une échelle a atteindre en zoom de carte
* @param {ol.view} view vue de la carte
* @param {Number} scale échelle a atteindre
* @param {Number} [dpi = 25.4 / 0.28] nombre de pixel par pouce (utile pour un pdf)
* @returns Number
*/
function getZoomForScale (view, scale, dpi) {
const resolution = getResolutionForScale(view, scale, dpi)
return view.getZoomForResolution(resolution)
}
export {
getScaleForResolution,
getResolutionForScale,
getZoomForScale
}
export const ScalesService = {
getScaleForResolution,
getResolutionForScale,
getZoomForScale,
}