summaryrefslogtreecommitdiff
path: root/gpsdclient.c
diff options
context:
space:
mode:
authorGary E. Miller <gem@rellim.com>2016-03-28 20:29:03 -0700
committerGary E. Miller <gem@rellim.com>2016-03-28 20:29:03 -0700
commitd47077f3f089dfb90929c7a90d1ed39ab8e94098 (patch)
treecff48ce27d073e1794024997b6b513ed38c1e308 /gpsdclient.c
parentd2a94a143b380a6a4155931878b105b10a8a701b (diff)
downloadgpsd-d47077f3f089dfb90929c7a90d1ed39ab8e94098.tar.gz
use more precision when outputting lat/lon.
A cm level GPS needs decimal degrees to 0.0000001
Diffstat (limited to 'gpsdclient.c')
-rw-r--r--gpsdclient.c24
1 files changed, 14 insertions, 10 deletions
diff --git a/gpsdclient.c b/gpsdclient.c
index 2ab7ff6a..b98f5265 100644
--- a/gpsdclient.c
+++ b/gpsdclient.c
@@ -31,9 +31,12 @@ static struct exportmethod_t exportmethods[] = {
/* convert double degrees to a static string and return a pointer to it
*
* deg_str_type:
- * deg_dd : return DD.dddddd
- * deg_ddmm : return DD MM.mmmm'
- * deg_ddmmss : return DD MM' SS.sss"
+ * deg_dd : return DD.ddddddd
+ * deg_ddmm : return DD MM.mmmmmm'
+ * deg_ddmmss : return DD MM' SS.sssss"
+ *
+ * for cm level accuracy we need degrees to 7 decimal places
+ * Ref: https://en.wikipedia.org/wiki/Decimal_degrees
*
*/
char *deg_to_str(enum deg_str_type type, double f)
@@ -50,27 +53,28 @@ char *deg_to_str(enum deg_str_type type, double f)
fmin = modf(f, &fdeg);
deg = (int)fdeg;
- frac_deg = (long)(fmin * 1000000);
+ frac_deg = (long)(fmin * 10000000);
if (deg_dd == type) {
- /* DD.dddddd */
- (void)snprintf(str, sizeof(str), "%3d.%06ld", deg, frac_deg);
+ /* DD.ddddddd */
+ /* cm level accuracy requires the %07ld */
+ (void)snprintf(str, sizeof(str), "%3d.%07ld", deg, frac_deg);
return str;
}
fsec = modf(fmin * 60, &fmin);
min = (int)fmin;
- sec = (int)(fsec * 10000.0);
+ sec = (int)(fsec * 1000000.0);
if (deg_ddmm == type) {
/* DD MM.mmmm */
- (void)snprintf(str, sizeof(str), "%3d %02d.%04d'", deg, min, sec);
+ (void)snprintf(str, sizeof(str), "%3d %02d.%06d'", deg, min, sec);
return str;
}
/* else DD MM SS.sss */
fdsec = modf(fsec * 60, &fsec);
sec = (int)fsec;
- dsec = (int)(fdsec * 1000.0);
- (void)snprintf(str, sizeof(str), "%3d %02d' %02d.%03d\"", deg, min, sec,
+ dsec = (int)(fdsec * 10000.0);
+ (void)snprintf(str, sizeof(str), "%3d %02d' %02d.%05d\"", deg, min, sec,
dsec);
return str;