1
2 /***************************************************************
3 G_lat_format (lat, buf)
4 double lat;
5 char *buf;
6
7 G_lon_format (lon, buf)
8 double lon;
9 char *buf;
10
11 G_llres_format (res, buf)
12 double res;
13 char *buf;
14
15 formats lat (latitude in degrees), or lon (longitude in degrees)
16 into buf as dd:mm:ssH, where H (hemishpere) is
17 N for northern hemishpere, S for southern,
18 W for western hemishpere, E for eastern
19 none for resolution
20 (lat > 0 is northern, lat < 0 is southern)
21 (lon > 0 is eastern, lon < 0 is western)
22
23 Note: lat should be in the range -90 to 90s, but
24 the range is NOT checked by G_lat_format().
25 lon can be anything, but
26 values outside [-180,180] are moved into this range
27 by adding (or subtracting) 360.
28
29 NOTE: These routines are used by G_format_northing(), G_format_easting(), and
30 G_format_resolution(). Those routines are intended to provide
31 a general interface to window values and should be used instead of
32 these projection specific routines. In other words, these routines
33 are for the library only, programmers shouldn't use them.
34 ***************************************************************/
35 #include <grass/gis.h>
36 #include <string.h>
37
38 static void format(char *, int, int, double, char);
39 static void ll_parts(double, int *, int *, double *);
40
G_lat_format(double lat,char * buf)41 void G_lat_format(double lat, char *buf)
42 {
43 int d, m;
44 char h;
45 double s;
46
47 G_lat_parts(lat, &d, &m, &s, &h);
48 format(buf, d, m, s, h);
49 }
50
G_lat_format_string(void)51 const char *G_lat_format_string(void)
52 {
53 return "dd:mm:ss{N|S}";
54 }
55
G_lon_format(double lon,char * buf)56 void G_lon_format(double lon, char *buf)
57 {
58 int d, m;
59 char h;
60 double s;
61
62 G_lon_parts(lon, &d, &m, &s, &h);
63 format(buf, d, m, s, h);
64 }
65
G_lon_format_string(void)66 const char *G_lon_format_string(void)
67 {
68 return "ddd:mm:ss{E|W}";
69 }
70
G_llres_format(double res,char * buf)71 void G_llres_format(double res, char *buf)
72 {
73 int d, m;
74 char h;
75 double s;
76
77 G_lat_parts(res, &d, &m, &s, &h);
78 h = 0;
79 format(buf, d, m, s, h);
80 }
81
G_llres_format_string(void)82 const char *G_llres_format_string(void)
83 {
84 return "dd:mm:ss";
85 }
86
format(char * buf,int d,int m,double s,char h)87 static void format(char *buf, int d, int m, double s, char h)
88 {
89 char temp[50];
90 double ss;
91
92 sprintf(temp, "%f", s);
93 sscanf(temp, "%lf", &ss);
94 if (ss >= 60) {
95 ss = 0; /* force it to zero */
96 if (++m >= 60) {
97 m = 0;
98 d++;
99 }
100 }
101
102 if (ss < 10.0)
103 sprintf(temp, "0%f", ss);
104 else
105 sprintf(temp, "%f", ss);
106 G_trim_decimal(temp);
107 if (strcmp(temp, "00") != 0 && strcmp(temp, "0") != 0)
108 sprintf(buf, "%d:%02d:%s%c", d, m, temp, h);
109 else if (m > 0)
110 sprintf(buf, "%d:%02d%c", d, m, h);
111 else if (d > 0)
112 sprintf(buf, "%d%c", d, h);
113 else
114 sprintf(buf, "0");
115 }
116
G_lat_parts(double lat,int * d,int * m,double * s,char * h)117 void G_lat_parts(double lat, /* lat in degrees to be split into parts */
118 int *d, int *m, /* degrees, minutes */
119 double *s, /* seconds */
120 char *h /* hemisphere */
121 )
122 {
123 if (lat < 0) {
124 *h = 'S';
125 lat = -lat;
126 }
127 else
128 *h = 'N';
129
130 ll_parts(lat, d, m, s);
131 }
132
G_lon_parts(double lon,int * d,int * m,double * s,char * h)133 void G_lon_parts(double lon, /* lon in degrees to be split into parts */
134 int *d, int *m, /* degrees, minutes */
135 double *s, /* seconds */
136 char *h /* hemisphere */
137 )
138 {
139 #if 0
140 while (lon > 180.0)
141 lon -= 360.0;
142 while (lon < -180.0)
143 lon += 360.0;
144 #endif
145
146 if (lon < 0) {
147 *h = 'W';
148 lon = -lon;
149 }
150 else
151 *h = 'E';
152
153 ll_parts(lon, d, m, s);
154 }
155
ll_parts(double ll,int * d,int * m,double * s)156 static void ll_parts(double ll, /* ll in degrees to be split into parts */
157 int *d, int *m, /* degrees, minutes */
158 double *s /* seconds */
159 )
160 {
161 if (ll == 0.0) {
162 *d = 0;
163 *m = 0;
164 *s = 0.0;
165 }
166 else {
167 *d = ll;
168 *m = (ll - *d) * 60;
169 if (*m < 0)
170 *m = 0;
171 *s = ((ll - *d) * 60 - *m) * 60;
172 if (*s < 0)
173 *s = 0;
174 }
175 }
176