diff options
author | Gary E. Miller <gem@rellim.com> | 2016-03-28 20:29:03 -0700 |
---|---|---|
committer | Gary E. Miller <gem@rellim.com> | 2016-03-28 20:29:03 -0700 |
commit | d47077f3f089dfb90929c7a90d1ed39ab8e94098 (patch) | |
tree | cff48ce27d073e1794024997b6b513ed38c1e308 /gpsdclient.c | |
parent | d2a94a143b380a6a4155931878b105b10a8a701b (diff) | |
download | gpsd-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.c | 24 |
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; |