1
0
Fork 0

Use simgear formatting of lat/lon values

The code was basically moved into Simgear, this is just closing the
circle.
This commit is contained in:
James Turner 2018-06-27 11:27:12 +01:00
parent 2403e95559
commit ea5608b769

View file

@ -20,14 +20,12 @@
//
// $Id$
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include "config.h"
#include <simgear/compiler.h>
#include <simgear/structure/exception.hxx>
#include <simgear/props/props_io.hxx>
#include <simgear/misc/strutils.hxx>
#include <simgear/timing/sg_time.hxx>
#include <simgear/misc/sg_path.hxx>
#include <simgear/scene/model/particles.hxx>
@ -369,167 +367,33 @@ SGConstPropertyNode_ptr FGProperties::_longDeg;
SGConstPropertyNode_ptr FGProperties::_latDeg;
SGConstPropertyNode_ptr FGProperties::_lonLatformat;
/*
* Format the latitude and longitude floats into a character array using a variety of coordinate formats.
*/
static void
formatLatLongString (double deg, int format, char *buf, char c) {
double min, sec;
int sign = deg < 0.0 ? -1 : 1;
deg = fabs(deg);
using namespace simgear;
if (format == 0) {
// d.dddddd' (DDD format).
snprintf(buf, 32, "%3.6f%c", deg, c);
} else if (format == 1) {
// d mm.mmm' (DMM format) -- uses a round-off factor tailored to the
// required precision of the minutes field (three decimal places),
// preventing minute values of 60.
min = (deg - int(deg)) * 60.0;
if (min >= 59.9995) {
min -= 60.0;
deg += 1.0;
}
snprintf(buf, 32, "%d*%06.3f'%c", int(deg), fabs(min), c);
} else if (format == 2) {
// d mm'ss.s" (DMS format) -- uses a round-off factor tailored to the
// required precision of the seconds field (one decimal place),
// preventing second values of 60.
min = (deg - int(deg)) * 60.0;
sec = (min - int(min)) * 60.0;
if (sec >= 59.95) {
sec -= 60.0;
min += 1.0;
if (min >= 60.0) {
min -= 60.0;
deg += 1.0;
}
}
snprintf(buf, 32, "%d*%02d'%04.1f\"%c", int(deg), int(min), fabs(sec), c);
} else if (format == 3) {
// d.dddddd' (signed DDD format).
snprintf(buf, 32, "%3.6f", sign*deg);
} else if (format == 4) {
// d mm.mmm' (signed DMM format).
min = (deg - int(deg)) * 60.0;
if (min >= 59.9995) {
min -= 60.0;
deg += 1.0;
}
if (sign == 1) {
snprintf(buf, 32, "%d*%06.3f'", int(deg), fabs(min));
} else {
snprintf(buf, 32, "-%d*%06.3f'", int(deg), fabs(min));
}
} else if (format == 5) {
// d mm'ss.s" (signed DMS format).
min = (deg - int(deg)) * 60.0;
sec = (min - int(min)) * 60.0;
if (sec >= 59.95) {
sec -= 60.0;
min += 1.0;
if (min >= 60.0) {
min -= 60.0;
deg += 1.0;
}
}
if (sign == 1) {
snprintf(buf, 32, "%d*%02d'%04.1f\"", int(deg), int(min), fabs(sec));
} else {
snprintf(buf, 32, "-%d*%02d'%04.1f\"", int(deg), int(min), fabs(sec));
}
} else if (format == 6) {
// dd.dddddd X, ddd.dddddd X (zero padded DDD format).
if (c == 'N' || c == 'S') {
snprintf(buf, 32, "%09.6f%c", deg, c);
} else {
snprintf(buf, 32, "%010.6f%c", deg, c);
}
} else if (format == 7) {
// dd mm.mmm' X, ddd mm.mmm' X (zero padded DMM format).
min = (deg - int(deg)) * 60.0;
if (min >= 59.9995) {
min -= 60.0;
deg += 1.0;
}
if (c == 'N' || c == 'S') {
snprintf(buf, 32, "%02d*%06.3f'%c", int(deg), fabs(min), c);
} else {
snprintf(buf, 32, "%03d*%06.3f'%c", int(deg), fabs(min), c);
}
} else if (format == 8) {
// dd mm'ss.s" X, dd mm'ss.s" X (zero padded DMS format).
min = (deg - int(deg)) * 60.0;
sec = (min - int(min)) * 60.0;
if (sec >= 59.95) {
sec -= 60.0;
min += 1.0;
if (min >= 60.0) {
min -= 60.0;
deg += 1.0;
}
}
if (c == 'N' || c == 'S') {
snprintf(buf, 32, "%02d*%02d'%04.1f\"%c", int(deg), int(min), fabs(sec), c);
} else {
snprintf(buf, 32, "%03d*%02d'%04.1f\"%c", int(deg), int(min), fabs(sec), c);
}
} else if (format == 9) {
// dd* mm'.mmm X, ddd* mm'.mmm X (Trinity House Navigation standard).
min = (deg - int(deg)) * 60.0;
if (min >= 59.9995) {
min -= 60.0;
deg += 1.0;
}
if (c == 'N' || c == 'S') {
snprintf(buf, 32, "%02d* %02d'.%03d%c", int(deg), int(min), int(SGMisc<double>::round((min-int(min))*1000)), c);
} else {
snprintf(buf, 32, "%03d* %02d'.%03d%c", int(deg), int(min), int(SGMisc<double>::round((min-int(min))*1000)), c);
}
} else {
// Empty the buffer for all invalid formats.
buf[0] = '\0';
}
}
const char *
FGProperties::getLongitudeString ()
const char* FGProperties::getLongitudeString ()
{
static char buf[32];
double d = _longDeg->getDoubleValue();
int format = _lonLatformat->getIntValue();
char c = d < 0.0 ? 'W' : 'E';
formatLatLongString(d, format, buf, c);
return buf;
const double d = _longDeg->getDoubleValue();
auto format = static_cast<strutils::LatLonFormat>(_lonLatformat->getIntValue());
const char c = d < 0.0 ? 'W' : 'E';
static char longitudeBuffer[64];
const auto s = strutils::formatLatLonValueAsString(d, format, c);
memcpy(longitudeBuffer, s.c_str(), s.size() + 1);
return longitudeBuffer;
}
const char *
FGProperties::getLatitudeString ()
const char* FGProperties::getLatitudeString ()
{
static char buf[32];
double d = _latDeg->getDoubleValue();
int format = _lonLatformat->getIntValue();
char c = d < 0.0 ? 'S' : 'N';
formatLatLongString(d, format, buf, c);
return buf;
const double d = _latDeg->getDoubleValue();
auto format = static_cast<strutils::LatLonFormat>(_lonLatformat->getIntValue());
const char c = d < 0.0 ? 'S' : 'N';
static char latitudeBuffer[64];
const auto s = strutils::formatLatLonValueAsString(d, format, c);
memcpy(latitudeBuffer, s.c_str(), s.size() + 1);
return latitudeBuffer;
}
FGProperties::FGProperties ()
{
}