]> err.no Git - mapper/blobdiff - src/latlon.c
More map widget integration changes
[mapper] / src / latlon.c
index e8a78d72a5d01e889017242fb9d758b668cdfa91..dceab08620fb891e04f71b8390c440e86507dae3 100644 (file)
  * 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)
@@ -123,13 +148,13 @@ return lrint(lon/180*LATLON_MAX);
 }
 
 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;
 }
@@ -190,7 +215,7 @@ return ((2.f * atan2(sqrt(a), sqrt(1.f - a))) * EARTH_RADIUS);
  *
  */
 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;
 
@@ -204,8 +229,51 @@ y=sin(dlon)*cos(lat2);
 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;
+}
+}
+