X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/50a14534a51f892500ee82f867e8ab2f85b936ae..f5f53833288f037fee5e21a39b4d6ddf005994db:/src/coords.c diff --git a/src/coords.c b/src/coords.c index df2391bc..25eb900c 100644 --- a/src/coords.c +++ b/src/coords.c @@ -6,6 +6,8 @@ I (Evan Battaglia ) have only made some small changes suc renaming functions and defining LatLon and UTM structs. 2004-02-10 -- I also added a function of my own -- a_coords_utm_diff() -- that I felt belonged in coords.c 2004-02-21 -- I also added a_coords_utm_equal(). +2005-11-23 -- Added a_coords_dtostr() for lack of a better place. + */ /* coords.h - include file for coords routines ** @@ -33,16 +35,38 @@ renaming functions and defining LatLon and UTM structs. ** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ** SUCH DAMAGE. */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#ifdef HAVE_STDLIB_H #include +#endif +#ifdef HAVE_STRING_H #include +#endif +#ifdef HAVE_MATH_H #include +#endif #include "viking.h" +#include "globals.h" +#include "degrees_converters.h" -#ifdef WINDOWS -#define M_PI 3.14159265358979 -#endif +/** + * Convert a double to a string WITHOUT LOCALE. + * + * Following GPX specifications, decimal values are xsd:decimal + * So, they must use the period separator, not the localized one. + * + * The returned value must be freed by g_free. + */ +char *a_coords_dtostr ( double d ) +{ + 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 @@ -74,11 +98,14 @@ double a_coords_utm_diff( const struct UTM *utm1, const struct UTM *utm2 ) double a_coords_latlon_diff ( const struct LatLon *ll1, const struct LatLon *ll2 ) { static struct LatLon tmp1, tmp2; + gdouble tmp3; tmp1.lat = ll1->lat * PIOVER180; tmp1.lon = ll1->lon * PIOVER180; tmp2.lat = ll2->lat * PIOVER180; tmp2.lon = ll2->lon * PIOVER180; - return EquatorialRadius * acos(sin(tmp1.lat)*sin(tmp2.lat)+cos(tmp1.lat)*cos(tmp2.lat)*cos(tmp1.lon-tmp2.lon)); + tmp3 = EquatorialRadius * acos(sin(tmp1.lat)*sin(tmp2.lat)+cos(tmp1.lat)*cos(tmp2.lat)*cos(tmp1.lon-tmp2.lon)); + // For very small differences we can sometimes get NaN returned + return isnan(tmp3)?0:tmp3; } void a_coords_latlon_to_utm( const struct LatLon *latlon, struct UTM *utm ) @@ -222,3 +249,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); + } +}