aboutsummaryrefslogtreecommitdiff
path: root/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/utils/MapCalculus.kt
blob: 1a0d27b8604f5d85a478ac3c7141a96cade310bf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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
            }
        }
    }
}