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:
parent
2403e95559
commit
ea5608b769
1 changed files with 21 additions and 157 deletions
|
@ -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 ()
|
||||
{
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue