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
}
}
}
}
|