GRASS GIS 8 Programmer's Manual 8.2.0(2022)-exported
ll_format.c
Go to the documentation of this file.
1
2/***************************************************************
3G_lat_format (lat, buf)
4 double lat;
5 char *buf;
6
7G_lon_format (lon, buf)
8 double lon;
9 char *buf;
10
11G_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
23Note: 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
29NOTE: 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
38static void format(char *, int, int, double, char);
39static void ll_parts(double, int *, int *, double *);
40
41void 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
51const char *G_lat_format_string(void)
52{
53 return "dd:mm:ss{N|S}";
54}
55
56void 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
66const char *G_lon_format_string(void)
67{
68 return "ddd:mm:ss{E|W}";
69}
70
71void 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
82const char *G_llres_format_string(void)
83{
84 return "dd:mm:ss";
85}
86
87static 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
117void 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
133void 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
156static 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}
void G_lat_parts(double lat, int *d, int *m, double *s, char *h)
Definition: ll_format.c:117
void G_lat_format(double lat, char *buf)
Definition: ll_format.c:41
void G_llres_format(double res, char *buf)
Definition: ll_format.c:71
void G_lon_format(double lon, char *buf)
Definition: ll_format.c:56
const char * G_lat_format_string(void)
Definition: ll_format.c:51
const char * G_llres_format_string(void)
Definition: ll_format.c:82
void G_lon_parts(double lon, int *d, int *m, double *s, char *h)
Definition: ll_format.c:133
const char * G_lon_format_string(void)
Definition: ll_format.c:66
void G_trim_decimal(char *buf)
Removes trailing zeros from decimal number.
Definition: trim_dec.c:24