* Different Lat/Lon and related functions
* (conversion, distances, etc)
*/
-#define _GNU_SOURCE
+#include "config.h"
#include <math.h>
#include <glib.h>
+#include <glib/gi18n.h>
+#include <glib/gstdio.h>
#include "latlon.h"
#include "osm.h"
-/* Int ranges for integerized lat/lon */
-#define LATLON_MAX 2147483646
-#define LATLON_MIN -2147483646
+void
+latlon_init(void)
+{
+DEG_FORMAT_TEXT[DDPDDDDD] = "-dd.ddddd°";
+DEG_FORMAT_TEXT[DD_MMPMMM] = "-dd°mm.mmm'";
+DEG_FORMAT_TEXT[DD_MM_SSPS] = "-dd°mm'ss.s\"";
+DEG_FORMAT_TEXT[DDPDDDDD_NSEW] = "dd.ddddd° S";
+DEG_FORMAT_TEXT[DD_MMPMMM_NSEW] = "dd°mm.mmm' S";
+DEG_FORMAT_TEXT[DD_MM_SSPS_NSEW] = "dd°mm'ss.s\" S";
+
+UNITS_TEXT[UNITS_KM] = _("km");
+UNITS_TEXT[UNITS_MI] = _("mi.");
+UNITS_TEXT[UNITS_NM] = _("n.m.");
+}
+
+gfloat
+angle_diff(gfloat a, gfloat b)
+{
+gfloat tmax, tmin, t;
+
+tmax=MAX(a,b);
+tmin=MIN(a,b);
-#define EARTH_RADIUS (3440.06479f)
+t=tmax-tmin;
+if (t>180) t-=360;
+
+return t;
+}
static inline gdouble
magnitude(gdouble x1, gdouble y1, gdouble x2, gdouble y2)
}
gdouble
-mp_int2lon(gint lon)
+mp_int2lon(gint32 lon)
{
return (gdouble)lon/LATLON_MAX*180;
}
gdouble
-mp_int2lat(gint lat)
+mp_int2lat(gint32 lat)
{
return 0;
}
*
*/
gdouble
-calculate_course(gdouble lat1, gdouble lon1, gdouble lat2, gdouble lon2)
+calculate_course_rad(gdouble lat1, gdouble lon1, gdouble lat2, gdouble lon2)
{
gdouble c,dlon,x,y;
x=cos(lat1)*sin(lat2)-sin(lat1)*cos(lat2)*cos(dlon);
c=atan2(y,x);
-/* Fixup for compass */
+return c;
+}
+
+gdouble
+calculate_course(gdouble lat1, gdouble lon1, gdouble lat2, gdouble lon2)
+{
+gdouble c;
+
+c=calculate_course_rad(lat1, lon1, lat2, lon2);
+
c*=180.f/M_PIl;
c=c+360 % 360;
return c;
}
+
+void
+deg_format(DegFormat degformat, gdouble coor, gchar * scoor, gchar neg_char, gchar pos_char)
+{
+gdouble min;
+gdouble acoor=fabs(coor);
+
+switch (degformat) {
+ case DDPDDDDD:
+ g_sprintf(scoor, "%.5f°", coor);
+ break;
+ case DDPDDDDD_NSEW:
+ g_sprintf(scoor, "%.5f° %c", acoor, coor < 0.f ? neg_char : pos_char);
+ break;
+ case DD_MMPMMM:
+ g_sprintf(scoor, "%d°%06.3f'", (int)coor, (acoor - (int)acoor) * 60.0);
+ break;
+ case DD_MMPMMM_NSEW:
+ g_sprintf(scoor, "%d°%06.3f' %c", (int)acoor, (acoor - (int)acoor) * 60.0, coor < 0.f ? neg_char : pos_char);
+ break;
+ case DD_MM_SSPS:
+ min = (acoor - (int)acoor) * 60.0;
+ g_sprintf(scoor, "%d°%02d'%04.1f\"", (int)coor, (int)min, ((min - (int)min) * 60.0));
+ break;
+ case DD_MM_SSPS_NSEW:
+ min = (acoor - (int)acoor) * 60.0;
+ g_sprintf(scoor, "%d°%02d'%04.1f\" %c", (int)acoor, (int)min, ((min - (int)min) * 60.0), coor < 0.f ? neg_char : pos_char);
+ break;
+ default:
+ g_return_if_reached();
+ break;
+}
+}
+