-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathgeo3x3.tcl
67 lines (61 loc) · 1.56 KB
/
geo3x3.tcl
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
proc geo3x3_encode {lat lng level} {
if {$level < 1} {
return ""
}
set res ""
if {$lng >= 0} {
append res "E"
} else {
append res "W"
set lng [expr $lng + 180.0]
}
set lat [expr $lat + 90.0]
set unit 180
for {set i 1} {$i < $level} {incr i} {
set unit [expr $unit / 3.0]
set x [expr floor($lng / $unit)]
set y [expr floor($lat / $unit)]
append res [format %c [expr int(48 + $x + $y * 3 + 1)]]
set lng [expr $lng - $x * $unit]
set lat [expr $lat - $y * $unit]
}
return $res
}
proc geo3x3_decode {code} {
if {[string length $code] == 0} {
return {0.0 0.0 0 0.0}
}
set begin 0
set flg false
set c [string index $code 0]
if {$c == "-" || $c == "W"} {
set flg true
set begin 1
} elseif {$c == "+" || $c == "E"} {
set begin 1
}
set unit 180.0
set lat 0.0
set lng 0.0
set level 1
set clen [string length $code]
for {set i $begin} {$i < $clen} {incr i} {
scan [string index $code $i] %c c
set n [expr $c - 48]
if { $n <= 0 || 9 < $n } {
break
}
set unit [expr $unit / 3.0]
set n [expr $n -1]
set lng [expr $lng + $n % 3 * $unit]
set lat [expr $lat + $n / 3 * $unit]
set level [expr $level + 1]
}
set lat [expr $lat + $unit / 2]
set lng [expr $lng + $unit / 2]
set lat [expr $lat - 90.0]
if {$flg} {
set lng [expr $lng - 180.0]
}
return "$lat $lng $level $unit"
}