-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGridSquare.cpp
83 lines (68 loc) · 2.04 KB
/
GridSquare.cpp
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
#include <iostream>
#include <cmath>
using namespace std;
/**
* Calculations from http://n1sv.com/PROJECTS/How%20to%20calculate%20your%208-digit%20grid%20square.pdf
* http://www.w8bh.net/grid_squares.pdf
*/
void usage(char *name);
void calcLocator(char *dst, double lat, double lon);
int main( int argc, char *argv[], char *envp[] )
{
char dst[12];
double lat, lon;
if( argc != 3 ) usage(argv[0]);
sscanf(argv[1],"%lf",&lat);
if( abs(lat) > 90 ) usage(argv[0]);
sscanf(argv[2],"%lf",&lon);
if( abs(lon) > 180 ) usage(argv[0]);
calcLocator(dst, lat, lon);
fprintf(stderr, "Latitude: %lf\nLongitude: %lf\nGrid Square: %s\n", lat, lon, dst);
printf("%s\n", dst);
}
void usage(char *name)
{
fprintf(stderr, "usage: %s Latitude Longitude\n", name);
exit(EXIT_FAILURE);
}
void calcLocator(char *dst, double lat, double lon)
{
int o1, o2, o3, o4, o5;
int a1, a2, a3, a4, a5;
double remainder;
double oneTwelfth = 1.0/12.0;
double oneTwentyFourth = 1.0/24.0;
// longitude
remainder = lon + 180.0;
o1 = (int)(remainder / 20.0);
remainder = remainder - (double)o1 * 20.0;
o2 = (int)(remainder / 2.0);
remainder = remainder - 2.0 * (double)o2;
o3 = (int)(remainder / oneTwelfth);
remainder = remainder - oneTwelfth * (double)o3;
o4 = (int)(remainder/(oneTwelfth/10));
remainder = remainder - (o4 / 120.0);
o5 = (int)(remainder * 2880);
// latitude
remainder = lat + 90.0;
a1 = (int)(remainder / 10.0);
remainder = remainder - (double)a1 * 10.0;
a2 = (int)(remainder);
remainder = remainder - (double)a2;
a3 = (int)(remainder / oneTwentyFourth);
remainder = remainder - oneTwentyFourth * (double)a3;
a4 = (int)(remainder / (oneTwentyFourth/10));
remainder = remainder - (a4 / 240.0);
a5 = (int)(remainder * 5760);
dst[0] = (char)o1 + 'A';
dst[1] = (char)a1 + 'A';
dst[2] = (char)o2 + '0';
dst[3] = (char)a2 + '0';
dst[4] = (char)o3 + 'a';
dst[5] = (char)a3 + 'a';
dst[6] = (char)o4 + '0';
dst[7] = (char)a4 + '0';
dst[8] = (char)o5 + 'A';
dst[9] = (char)a5 + 'A';
dst[10] = (char)0;
}