13 LatCheck(decimal_lat);
14 LonCheck(decimal_lon);
46void Position::LatCheck(
double lat) {
47 if (lat > 90 || lat < -90){
48 std::stringstream msg;
49 msg <<
"The provided latitude (" << lat
50 <<
") is outside the acceptable range. "
56void Position::LonCheck(
double lon) {
57 if (lon > 180 || lon < -180){
58 std::stringstream msg;
59 msg <<
"The provided longitude (" << lon
60 <<
") is outside the acceptable range."
62 throw ValueError(msg.str());
67 double earth_radius = 6372.8;
68 double curr_longitude = this->
longitude() * M_PI / 180;
69 double curr_latitude = this->
latitude() * M_PI / 180;
70 double tarlongitude = target.
longitude() * M_PI / 180;
71 double tarlatitude = target.
latitude() * M_PI / 180;
72 double dlong = tarlongitude - curr_longitude;
73 double dlat = tarlatitude - curr_latitude;
75 double half_chord_length_sq =
76 pow(sin(dlat / 2), 2) +
77 pow(sin(dlong / 2), 2) * cos(curr_latitude) * cos(tarlatitude);
79 double angular_distance =
80 2 * atan2(sqrt(half_chord_length_sq), sqrt(1 - half_chord_length_sq));
81 return earth_radius * angular_distance;
85 std::stringstream lat_string;
86 std::stringstream lon_string;
91 lat_string << ToStringHelperLat(format, lat);
92 lon_string << ToStringHelperLon(format, lon);
95 lat_string << ToStringHelperLat(format, lat);
96 lon_string << ToStringHelperLon(format, lon);
99 lat_string << ToStringHelperLat(format, lat);
100 lon_string << ToStringHelperLon(format, lon);
103 return lat_string.str() + lon_string.str() +
"/";
106double Position::SetPrecision(
double value,
double precision)
const {
107 if (precision == 0) {
110 return (floor((value * pow(10, precision) + 0.5)) / pow(10, precision));
113std::string Position::ToStringHelperLat(
int mode,
double lat)
const {
114 std::stringstream lat_string;
116 lat_string << ToStringHelper(lat);
118 lat = modf(lat, &lat_int);
119 if (((
int)lat_int) / 10 == 0) {
124 lat_string << std::setprecision(7) << fabs(lat_int + lat);
127 lat_string << abs((
int)lat_int) << ToStringHelperDM(lat);
130 lat_string << abs((
int)lat_int) << ToStringHelperDMS(lat);
133 return lat_string.str();
136std::string Position::ToStringHelperLon(
int mode,
double lon)
const {
137 std::stringstream lon_string;
139 lon_string << ToStringHelper(lon);
140 lon = modf(lon, &lon_int);
141 if (((
int)lon_int) / 100 == 0) {
142 if (((
int)lon_int) / 10 == 0) {
149 lon_string << std::setprecision(7) << fabs(lon_int + lon);
152 lon_string << abs((
int)lon_int) << ToStringHelperDM(lon);
155 lon_string << abs((
int)lon_int) << ToStringHelperDMS(lon);
158 return lon_string.str();
161std::string Position::ToStringHelper(
double value)
const {
162 std::stringstream temp;
171std::string Position::ToStringHelperDM(
double value)
const {
172 std::stringstream temp;
173 value = fabs(value) * 60;
174 if (((
int)fabs(value)) / 10 == 0) {
177 temp << std::setprecision(5) << value;
182std::string Position::ToStringHelperDMS(
double value)
const {
183 std::stringstream temp;
185 value = fabs(value) * 60;
186 value = modf(value, &value_int);
187 if (((
int)value_int) / 10 == 0) {
190 temp << fabs(value_int);
192 if ((
int)fabs(value) / 10 == 0) {
195 temp << std::setprecision(1) << std::fixed << value;
For values that are too big, too small, etc.
taken directly from OsiSolverInterface.cpp on 2/17/14 from https://projects.coin-or....
#define CYCLUS_DECIMAL_SECOND_MULTIPLIER