Source: services/scales-service.js

/** 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,
}