diff options
-rw-r--r-- | navit/coord.c | 36 | ||||
-rw-r--r-- | navit/gui/gtk/gui_gtk_statusbar.c | 2 | ||||
-rw-r--r-- | navit/osd/core/osd_core.c | 48 |
3 files changed, 72 insertions, 14 deletions
diff --git a/navit/coord.c b/navit/coord.c index af169465d..7180dd593 100644 --- a/navit/coord.c +++ b/navit/coord.c @@ -312,15 +312,15 @@ coord_print(enum projection pro, struct coord *c, FILE *out) { /** * @brief Converts a lat/lon into a text formatted text string. - * @param lat The latitude - * @param lng The longitude + * @param lat The latitude (if lat is 360 or greater, the latitude will be omitted) + * @param lng The longitude (if lng is 360 or greater, the longitude will be omitted) * @param fmt The format to use. - * @li DEGREES=>(45.5000N 100.9000S) - * @li DEGREES_MINUTES=>(45 30.))00N 100 120.54.0000S) - * @li DEGREES_MINUTES_SECONDS=>(4530.0000N 12054.0000S) + * @li DEGREES=>Degrees with decimal places, i.e. 20.5000°N 110.5000°E + * @li DEGREES_MINUTES=>Degrees and minutes, i.e. 20°30.00'N 110°30.00'E + * @li DEGREES_MINUTES_SECONDS=>Degrees, minutes and seconds, i.e. 20°30'30.00"N 110°30'30"E * * - * @param buffer A buffer large enough to hold the output + a terminating NULL (26 bytes) + * @param buffer A buffer large enough to hold the output + a terminating NULL (up to 31 bytes) * @param size The size of the buffer * */ @@ -331,6 +331,7 @@ void coord_format(float lat,float lng, enum coord_format fmt, char * buffer, int char lng_c='E'; float lat_deg,lat_min,lat_sec; float lng_deg,lng_min,lng_sec; + int size_used=0; if (lng < 0) { lng=-lng; @@ -350,13 +351,28 @@ void coord_format(float lat,float lng, enum coord_format fmt, char * buffer, int { case DEGREES_DECIMAL: - snprintf(buffer,size,"%02.6f%c %03.7f%c",lat,lat_c,lng,lng_c); + if (lat<360) + size_used+=snprintf(buffer+size_used,size-size_used,"%02.6f°%c",lat,lat_c); + if ((lat<360)&&(lng<360)) + size_used+=snprintf(buffer+size_used,size-size_used," "); + if (lng<360) + size_used+=snprintf(buffer+size_used,size-size_used,"%03.7f°%c",lng,lng_c); break; case DEGREES_MINUTES: - snprintf(buffer,size,"%02.0f %07.4f%c %03.0f %07.4f%c",floor(lat_deg),lat_min , lat_c, floor(lng), lng_min, lng_c); - break; + if (lat<360) + size_used+=snprintf(buffer+size_used,size-size_used,"%02.0f°%07.4f' %c",floor(lat_deg),lat_min,lat_c); + if ((lat<360)&&(lng<360)) + size_used+=snprintf(buffer+size_used,size-size_used," "); + if (lng<360) + size_used+=snprintf(buffer+size_used,size-size_used,"%03.0f°%07.4f' %c",floor(lng_deg),lng_min,lng_c); + break; case DEGREES_MINUTES_SECONDS: - snprintf(buffer,size,"%02.0f%07.4f%c %03.0f%07.4f%c",floor(lat), fmod(lat*60,60), lat_c, floor(lng), fmod(lng*60,60), lng_c); + if (lat<360) + size_used+=snprintf(buffer+size_used,size-size_used,"%02.0f°%02.0f'%05.2f\" %c",floor(lat_deg),floor(lat_min),lat_sec,lat_c); + if ((lat<360)&&(lng<360)) + size_used+=snprintf(buffer+size_used,size-size_used," "); + if (lng<360) + size_used+=snprintf(buffer+size_used,size-size_used,"%03.0f°%02.0f'%05.2f\" %c",floor(lng_deg),floor(lng_min),lng_sec,lng_c); break; diff --git a/navit/gui/gtk/gui_gtk_statusbar.c b/navit/gui/gtk/gui_gtk_statusbar.c index f31cf0786..368134a3e 100644 --- a/navit/gui/gtk/gui_gtk_statusbar.c +++ b/navit/gui/gtk/gui_gtk_statusbar.c @@ -58,7 +58,7 @@ statusbar_gps_update(struct statusbar_priv *this, int sats, int qual, double lng char *dirs[]={_("N"),_("NE"),_("E"),_("SE"),_("S"),_("SW"),_("W"),_("NW"),_("N")}; char *dir; int dir_idx; - char pos_text[26]; + char pos_text[36]; coord_format(lat,lng,DEGREES_MINUTES_SECONDS,pos_text,sizeof(pos_text)); dir=dirs[dir_idx]; diff --git a/navit/osd/core/osd_core.c b/navit/osd/core/osd_core.c index 8baf0a5e4..aca567218 100644 --- a/navit/osd/core/osd_core.c +++ b/navit/osd/core/osd_core.c @@ -757,8 +757,50 @@ osd_text_format_attr(struct attr *attr, char *format) case attr_position_magnetic_direction: return g_strdup_printf("%d",attr->u.num); case attr_position_coord_geo: - coord_format(attr->u.coord_geo->lat,attr->u.coord_geo->lng,DEGREES_MINUTES_SECONDS,buffer,sizeof(buffer)); - return g_strdup(buffer); + if (format) { + if (!strcmp(format,"pos_degmin")) + { + coord_format(attr->u.coord_geo->lat,attr->u.coord_geo->lng,DEGREES_MINUTES,buffer,sizeof(buffer)); + return g_strdup(buffer); + } + else if (!strcmp(format,"pos_deg")) + { + coord_format(attr->u.coord_geo->lat,attr->u.coord_geo->lng,DEGREES_DECIMAL,buffer,sizeof(buffer)); + return g_strdup(buffer); + } + else if (!strcmp(format,"lat_degminsec")) + { + coord_format(attr->u.coord_geo->lat,360,DEGREES_MINUTES_SECONDS,buffer,sizeof(buffer)); + return g_strdup(buffer); + } + else if (!strcmp(format,"lat_degmin")) + { + coord_format(attr->u.coord_geo->lat,360,DEGREES_MINUTES,buffer,sizeof(buffer)); + return g_strdup(buffer); + } + else if (!strcmp(format,"lat_deg")) + { + coord_format(attr->u.coord_geo->lat,360,DEGREES_DECIMAL,buffer,sizeof(buffer)); + return g_strdup(buffer); + } + else if (!strcmp(format,"lng_degminsec")) + { + coord_format(360,attr->u.coord_geo->lng,DEGREES_MINUTES_SECONDS,buffer,sizeof(buffer)); + return g_strdup(buffer); + } + else if (!strcmp(format,"lng_degmin")) + { + coord_format(360,attr->u.coord_geo->lng,DEGREES_MINUTES,buffer,sizeof(buffer)); + return g_strdup(buffer); + } + else if (!strcmp(format,"lng_deg")) { + coord_format(360,attr->u.coord_geo->lng,DEGREES_DECIMAL,buffer,sizeof(buffer)); + return g_strdup(buffer); + } + } else { //Covers format==pos_degminsec too + coord_format(attr->u.coord_geo->lat,attr->u.coord_geo->lng,DEGREES_MINUTES_SECONDS,buffer,sizeof(buffer)); + return g_strdup(buffer); + } case attr_destination_time: if (!format || (strcmp(format,"arrival") && strcmp(format,"remaining"))) break; @@ -779,7 +821,7 @@ osd_text_format_attr(struct attr *attr, char *format) tm.tm_min = 0; tm.tm_hour = 0; days = (mktime(&text_tm0) - mktime(&tm) + 43200) / 86400; - } + } return format_time(&text_tm, days); case attr_length: case attr_destination_length: |