-
Notifications
You must be signed in to change notification settings - Fork 16
/
geo3x3.libsonnet
54 lines (50 loc) · 1.17 KB
/
geo3x3.libsonnet
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
local encode_fn = function(code, level, i, lat, lng, unit)
if i >= level then
code
else
encode_fn(
code + (std.floor(lng / unit) + std.floor(lat / unit) * 3 + 1),
level,
i + 1,
lat - unit * std.floor(lat / unit),
lng - unit * std.floor(lng / unit),
unit / 3.0
)
;
local _encode = function(lat, lng, level)
encode_fn(
if lng < 0.0 then "W" else "E",
level,
1,
lat + 90.0,
if lng < 0.0 then lng + 180.0 else lng,
180.0 / 3.0
)
;
local decode_fn = function(code, lat, lng, level, unit, wflg)
if std.length(code) == level then
local lng2 = lng + unit * 3.0 / 2.0;
{
lat: -90.0 + (lat + unit * 3.0 / 2.0),
lng: if wflg then lng2 - 180.0 else lng2,
level: level,
unit: unit * 3.0,
}
else
local n = std.parseInt(code[level]) - 1;
decode_fn(
code,
lat + std.floor(n / 3) * unit,
lng + n % 3 * unit,
level + 1,
unit / 3.0,
wflg
)
;
local _decode = function(code)
decode_fn(code, 0.0, 0.0, 1, 180.0 / 3.0, code[0] == "W")
;
{
encode: function(lat, lng, level) _encode(lat, lng, level),
decode: function(code) _decode(code),
}