X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/c0366d1ce9cca935e6c3f1a36d607687ed6ec04b..80471a6a905e00bf80ad04fa2061f88ea81f15cb:/src/coords.c diff --git a/src/coords.c b/src/coords.c index 40f2e8e9..c7ce8d61 100644 --- a/src/coords.c +++ b/src/coords.c @@ -41,6 +41,8 @@ renaming functions and defining LatLon and UTM structs. #include #include "viking.h" +#include "globals.h" +#include "degrees_converters.h" /** * Convert a double to a string WITHOUT LOCALE. @@ -52,19 +54,9 @@ renaming functions and defining LatLon and UTM structs. */ char *a_coords_dtostr ( double d ) { - /* In order to ignore locale, we do all the stuff manually */ - double integer, decimal; - integer = trunc(d); - - /* 6 decimals are sufficient (~0,1m) */ - /* Cf. http://www.tbs-sct.gc.ca/rpm-gbi/guides/Latlong_f.asp */ - decimal = d - integer; - decimal = decimal * 1000000; - decimal = trunc ( decimal ); - decimal = fabs ( decimal ); - - /* Format */ - return g_strdup_printf ( "%g.%06g", integer, decimal ); + gchar *buffer = g_malloc(G_ASCII_DTOSTR_BUF_SIZE*sizeof(gchar)); + g_ascii_dtostr (buffer, G_ASCII_DTOSTR_BUF_SIZE, (gdouble) d); + return buffer; } #define PIOVER180 0.01745329252 @@ -245,3 +237,29 @@ void a_coords_utm_to_latlon( const struct UTM *utm, struct LatLon *latlon ) latlon->lon = longitude; } + +void a_coords_latlon_to_string ( const struct LatLon *latlon, + gchar **lat, + gchar **lon ) +{ + g_return_if_fail ( latlon != NULL ); + + vik_degree_format_t format = a_vik_get_degree_format (); + + switch (format) { + case VIK_DEGREE_FORMAT_DDD: + *lat = convert_lat_dec_to_ddd ( latlon->lat ); + *lon = convert_lon_dec_to_ddd ( latlon->lon ); + break; + case VIK_DEGREE_FORMAT_DMM: + *lat = convert_lat_dec_to_dmm ( latlon->lat ); + *lon = convert_lon_dec_to_dmm ( latlon->lon ); + break; + case VIK_DEGREE_FORMAT_DMS: + *lat = convert_lat_dec_to_dms ( latlon->lat ); + *lon = convert_lon_dec_to_dms ( latlon->lon ); + break; + default: + g_critical("Houston, we've had a problem. format=%d", format); + } +}