package mx.trackermap.TrackerMap.utils import kotlin.math.roundToLong class MapCalculus { companion object { /** * WhirlyGlobe library uses height rather than zoom levels, but it supports converting * Mapnik denominator scales to height, so we can first convert zoom levels to Mapnik * denominator scales, and then convert them to height using WhirlyGlobe. * Source: https://github.com/openstreetmap/mapnik-stylesheets/blob/master/zoom-to-scale.txt */ fun zoomLevelToScale(zoom: Int): Double? = when (zoom) { 1 -> 279541132.014 2 -> 139770566.007 3 -> 69885283.0036 4 -> 34942641.5018 5 -> 17471320.7509 6 -> 8735660.37545 7 -> 4367830.18772 8 -> 2183915.09386 9 -> 1091957.54693 10 -> 545978.773466 11 -> 272989.386733 12 -> 136494.693366 13 -> 68247.3466832 14 -> 34123.6733416 15 -> 17061.8366708 16 -> 8530.9183354 17 -> 4265.4591677 18 -> 2132.72958385 19 -> 1066.36479193 20 -> 533.182395965 21 -> 266.5911979825 22 -> 133.29559899125 23 -> 66.647799495625 24 -> 33.3238997478125 else -> null } fun scaleToZoomLevel(scale: Double): Int { fun z(d: Int) = zoomLevelToScale(d)!! return when { scale > z(1) -> 1 scale in z(2)..z(1) -> 2 scale in z(3)..z(2) -> 3 scale in z(4)..z(3) -> 4 scale in z(5)..z(4) -> 5 scale in z(6)..z(5) -> 6 scale in z(7)..z(6) -> 7 scale in z(8)..z(7) -> 8 scale in z(9)..z(8) -> 9 scale in z(10)..z(9) -> 10 scale in z(11)..z(10) -> 11 scale in z(12)..z(11) -> 12 scale in z(13)..z(12) -> 13 scale in z(14)..z(13) -> 14 scale in z(15)..z(14) -> 15 scale in z(16)..z(15) -> 16 scale in z(17)..z(16) -> 17 scale in z(18)..z(17) -> 18 scale in z(19)..z(18) -> 19 scale in z(20)..z(19) -> 20 scale in z(21)..z(20) -> 21 scale in z(22)..z(21) -> 22 scale in z(23)..z(22) -> 23 scale in z(24)..z(23) -> 24 else -> 24 } } } }