-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathgeo3x3.neko
91 lines (84 loc) · 1.96 KB
/
geo3x3.neko
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
var buffer_new = $loader.loadprim("std@buffer_new",0);
var buffer_add = $loader.loadprim("std@buffer_add",2);
var buffer_add_char = $loader.loadprim("std@buffer_add_char",2);
var buffer_string = $loader.loadprim("std@buffer_string",1);
var math_floor = $loader.loadprim("std@math_floor",1);
var ac_0 = 48 // '0'
var ac_Plus = 43 // '+'
var ac_Minus = 45 // '-'
var ac_E = 69 // 'E'
var ac_W = 87 // 'W'
var encode = function (lat, lng, level) {
if level < 1 {
return "";
}
var res = buffer_new();
if lng >= 0 {
buffer_add(res, "E");
} else {
buffer_add(res, "W");
lng += 180.0;
}
lat += 90.0;
var unit = 180.0;
var i = 1;
while i < level {
unit /= 3.0;
var x = math_floor(lng / unit);
var y = math_floor(lat / unit);
var c = ac_0 + x + y * 3 + 1
buffer_add_char(res, c);
lng -= x * unit;
lat -= y * unit;
i += 1;
}
return buffer_string(res);
}
var decode = function (code) {
if code == null || $ssize(code) == 0 {
return null;
}
var begin = 0;
flg = false;
c = $sget(code,0);
if c == ac_Minus || c == ac_W {
flg = true;
begin = 1;
} else {
if c == ac_Plus || c == ac_E {
begin = 1;
}
}
var unit = 180.0;
var lat = 0.0;
var lng = 0.0;
var level = 1;
var clen = $ssize(code);
var i = begin;
while i < clen {
n = $sget(code,i) - ac_0;
if n <= 0 {
break;
}
unit /= 3.0;
n -= 1;
lng += math_floor(n % 3) * unit;
lat += math_floor(n / 3) * unit;
level += 1;
i += 1;
}
lat += unit / 2.0;
lng += unit / 2.0;
lat -= 90.0;
if flg {
lng -= 180.0;
}
return {
lat => lat,
lng => lng,
level => level,
unit => unit,
};
}
$exports.encode = encode;
$exports.decode = decode;