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
**
** 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 <stdlib.h>
+#endif
+#ifdef HAVE_STRING_H
#include <string.h>
+#endif
+#ifdef HAVE_MATH_H
#include <math.h>
+#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
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 )
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);
+ }
+}