-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathgeo3x3.clj
71 lines (64 loc) · 1.66 KB
/
geo3x3.clj
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
(ns geo3x3)
(defn encode_fn [code level i lat lng unit]
(if (>= i level)
code
(encode_fn
(str code (+ 1 (int (/ lng unit)) (* (int (/ lat unit)) 3)))
level
(+ i 1)
(- lat (* (int (/ lat unit)) unit))
(- lng (* (int (/ lng unit)) unit))
(/ unit 3.0)
)
)
)
(defn encode [lat lng level]
(if (< level 1)
nil
(encode_fn
(if (>= lng 0.0) "E" "W")
level
1
(+ lat 90.0)
(if (>= lng 0.0) lng (+ lng 180.0))
(/ 180.0 3.0)
)
)
)
(defn is_1to9 [c]
(and (>= (int c) (int \1)) (<= (int c) (int \9)))
)
(defn decode_fn [code lat lng level unit]
(if (or (= (count code) 0) (not (is_1to9 (first code))))
[(- (+ lat (/ (* unit 3.0) 2.0)) 90.0) (+ lng (/ (* unit 3.0) 2.0)) level (* unit 3.0)]
(let [n (- (int (first code)) 49)]
(decode_fn
(rest code)
(+ lat (* (int (/ n 3)) unit))
(+ lng (* (int (mod n 3)) unit))
(+ level 1)
(/ unit 3.0)
)
)
)
)
(defn decode_fne [code]
(decode_fn code 0.0 0.0 1 (/ 180.0 3.0))
)
(defn decode_fnw [code]
(let [pos (decode_fne code)]
[(first pos) (- (nth pos 1) 180.0) (nth pos 2) (nth pos 3)]
)
)
(defn decode [code]
(if (= (count code) 0)
[0.0 0.0 0 180.0] ; err
(case (first code)
\W (decode_fnw (rest code))
\- (decode_fnw (rest code))
\E (decode_fne (rest code))
\+ (decode_fne (rest code))
(decode_fne code)
)
)
)