-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathgeo3x3.prg
72 lines (51 loc) · 1.89 KB
/
geo3x3.prg
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
OPTION STRICT
COMMON DEF GEO3X3_ENCODE(LAT,LNG,LV%)
IF LV%<1 THEN RETURN ""
DIM RES$="E"
IF LNG<0.0 THEN
RES$="W"
INC LNG,180.0
ENDIF
INC LAT,90.0
DIM I%
DIM UNIT=180.0
FOR I%=1 TO LV%-1
UNIT=UNIT/3.0
DIM X%=FLOOR(LNG/UNIT)
DIM Y%=FLOOR(LAT/UNIT)
DIM N%=X%+Y%*3+1
RES$=RES$+STR$(N%)
DEC LNG,X%*UNIT
DEC LAT,Y%*UNIT
NEXT
RETURN RES$
END
COMMON DEF GEO3X3_DECODE CODE$,RES[]
DIM CLEN%=LEN(CODE$)
IF CLEN%==0 THEN RETURN
DIM BEGIN%,FLG%=#FALSE
DIM C$=CODE$[0]
IF C$=="-" || C$=="W" THEN
FLG%=#TRUE
BEGIN%=1
ELSEIF C$=="+" || C$=="E" THEN
BEGIN%=1
ENDIF
DIM LAT,LNG,UNIT=180.0
DIM I%,LV%=1
FOR I%=BEGIN% TO CLEN%-1
DIM N%=VAL(CODE$[I%])
IF N%<=0 THEN BREAK
UNIT=UNIT/3.0
DEC N%
INC LNG,(N% MOD 3)*UNIT
INC LAT,FLOOR(N%/3)*UNIT
INC LV%
NEXT
INC LAT,UNIT/2
INC LNG,UNIT/2
DEC LAT,90.0
IF FLG% THEN DEC LNG,180.0
RES[0]=LAT:RES[1]=LNG
RES[2]=LV%:RES[3]=UNIT
END