static void convert_datum(const waypoint *wpt, double *dest_lat, double *dest_lon) { double alt; if (datum_index == DATUM_WGS84 ) { *dest_lat = wpt->latitude; *dest_lon = wpt->longitude; } else GPS_Math_WGS84_To_Known_Datum_M(wpt->latitude, wpt->longitude, 0.0, dest_lat, dest_lon, &alt, datum_index); }
/* @func GPS_Math_WGS84_To_UTM_EN ************************************** ** ** Transform WGS84 lat/lon to UTM zone, easting and northing ** ** @param [r] lat [double] WGS84 latitude (deg) ** @param [r] lon [double] WGS84 longitude (deg) ** @param [w] E [double *] easting (metres) ** @param [w] N [double *] northing (metres) ** @param [w] zone [int32 *] zone number ** @param [w] zc [char *] zone character ** ** @return [int32] success ************************************************************************/ int32 GPS_Math_WGS84_To_UTM_EN(double lat, double lon, double *E, double *N, int32 *zone, char *zc) { double phi; double lambda; double H; GPS_Math_WGS84_To_Known_Datum_M(lat,lon,0,&phi,&lambda,&H,77); if(!GPS_Math_NAD83_To_UTM_EN(phi,lambda,E,N,zone,zc)) return 0; return 1; }
/* @func GPS_Math_WGS84_To_UKOSMap_M *********************************** ** ** Convert WGS84 lat/lon to Ordnance survey map code and easting and ** northing. Uses Molodensky ** ** @param [r] lat [double] WGS84 latitude (deg) ** @param [r] lon [double] WGS84 longitude (deg) ** @param [w] mE [double *] map easting (metres) ** @param [w] mN [double *] map northing (metres) ** @param [w] map [char *] map two letter code ** ** @return [int32] success ************************************************************************/ int32 GPS_Math_WGS84_To_UKOSMap_M(double lat, double lon, double *mE, double *mN, char *map) { double alat; double alon; double aht; double aE; double aN; GPS_Math_WGS84_To_Known_Datum_M(lat,lon,30,&alat,&alon,&aht,86); GPS_Math_Airy1830LatLonToNGEN(alat,alon,&aE,&aN); if(!GPS_Math_EN_To_UKOSNG_Map(aE,aN,mE,mN,map)) return 0; return 1; }
static void unicsv_waypt_disp_cb(const waypoint *wpt) { double lat, lon, alt; char *cout = NULL; const char *shortname; garmin_fs_t *gmsd; #ifdef UNICSV_GC_READY const geocache_data *gc_data = NULL; #endif unicsv_waypt_ct++; shortname = (wpt->shortname) ? wpt->shortname : ""; gmsd = GMSD_FIND(wpt); if (unicsv_datum_idx == DATUM_WGS84) { lat = wpt->latitude; lon = wpt->longitude; alt = wpt->altitude; } else { GPS_Math_WGS84_To_Known_Datum_M(wpt->latitude, wpt->longitude, 0.0, &lat, &lon, &alt, unicsv_datum_idx); } gbfprintf(fout, "%d%s", unicsv_waypt_ct, unicsv_fieldsep); switch(unicsv_grid_idx) { case grid_lat_lon_ddd: cout = pretty_deg_format(lat, lon, 'd', unicsv_fieldsep, 0); gbfputs(cout, fout); break; case grid_lat_lon_dmm: cout = pretty_deg_format(lat, lon, 'm', unicsv_fieldsep, 0); gbfputs(cout, fout); break; case grid_lat_lon_dms: { char *sep, *tmp; cout = pretty_deg_format(lat, lon, 's', unicsv_fieldsep, 0); sep = strchr(cout, ','); *sep = '\0'; tmp = strenquote(cout, UNICSV_QUOT_CHAR); gbfprintf(fout, "%s%s", tmp, unicsv_fieldsep); xfree(tmp); tmp = strenquote(sep+1, UNICSV_QUOT_CHAR); gbfputs(tmp, fout); xfree(tmp); } break; case grid_bng: { char map[3]; double north, east; if (! GPS_Math_WGS84_To_UKOSMap_M(wpt->latitude, wpt->longitude, &east, &north, map)) unicsv_fatal_outside(wpt); gbfprintf(fout, "%s%s%5.0f%s%5.0f", map, unicsv_fieldsep, east, unicsv_fieldsep, north); break; } case grid_utm: { int zone; char zonec; double north, east; if (! GPS_Math_Known_Datum_To_UTM_EN(lat, lon, &east, &north, &zone, &zonec, unicsv_datum_idx)) unicsv_fatal_outside(wpt); gbfprintf(fout, "%02d%s%c%s%.0f%s%.0f", zone, unicsv_fieldsep, zonec, unicsv_fieldsep, east, unicsv_fieldsep, north); break; } case grid_swiss: { double north, east; if (! GPS_Math_WGS84_To_Swiss_EN(wpt->latitude, wpt->longitude, &east, &north)) unicsv_fatal_outside(wpt); gbfprintf(fout, "%.f%s%.f", east, unicsv_fieldsep, north); break; } default: gbfprintf(fout, "%.*f%s%.*f", llprec, lat, unicsv_fieldsep, llprec, lon); break; } if (cout) xfree(cout); if FIELD_USED(fld_shortname) unicsv_print_str(shortname); if FIELD_USED(fld_altitude) { if (wpt->altitude != unknown_alt) gbfprintf(fout, "%s%.1f", unicsv_fieldsep, wpt->altitude); else gbfputs(unicsv_fieldsep, fout); } if FIELD_USED(fld_description) unicsv_print_str(wpt->description); if FIELD_USED(fld_notes) unicsv_print_str(wpt->notes); if FIELD_USED(fld_symbol) unicsv_print_str((wpt->icon_descr != NULL) ? wpt->icon_descr : "Waypoint"); if FIELD_USED(fld_depth) { if WAYPT_HAS(wpt, depth) gbfprintf(fout, "%s%.3f", unicsv_fieldsep, wpt->depth); else gbfputs(unicsv_fieldsep, fout); }