C++ 控制台 - 使用方位角和距离的新 lat/lon 坐标

C++ Console - New lat/lon coordinate using azimuth and range

我需要帮助理解我在搜索过程中找到的这段代码。我已经被困了 2 周试图得到它,它阻碍了我的项目。老实说,我正在努力学习,而不仅仅是一个脚本小子,但这比我项目的其余部分要复杂得多,即使我正在尝试。 (例如,我今天刚在尝试理解这段代码时了解了 auto。)

我正在开发一个天气应用程序,我知道雷达站点的 lat/lon。我需要雷达根据雷达告诉我的 azimuth/range 检测到的特征的 lat/lon(例如,271 度和 7 海里)。我需要了解如何使用下面的代码将 azimuth/range 转换为新的经纬度坐标。我不需要其他功能,只是为了能够放置我的变量(起始坐标、方位角和范围)并获得结果。下面的代码看起来做的远不止这些,这让我很困惑。

我在接近结尾处看到以下代码:

auto coordinate = CoordinateToCoordinate(latitude1, longitude1, angle, meters);

...这看起来是我需要的部分。我知道它是如何计算的,但是一旦我深入挖掘,我就会感到困惑。我已经尝试过多次破解代码,以至于我放弃了,甚至没有任何示例。

我希望能够手动设置我的变量(例如 cin>>)并将纬度和经度输出到一个变量中,我可以将该变量保存到一个文本文件中。除了实际的转换本身,我可以自己做所有事情(摄取起始变量并将结果写入文本文件)。

我如何使用下面的代码开始使用它?

我的示例变量是:

Original Latitude = 29.4214

Original Longitude = -98.0142

Azimuth from Origin = 271 degrees 

Range from Origin =   6 nautical miles (I can convert to meters if needed, 
in this case it's 11112 meters)

实际未经编辑的代码如下, a copy at this link. 如果我得到帮助,我不会只是 copy/paste,我会在完成后返回完整的代码。我真的很想边走边理解,这样我就可以更好地处理这些高级主题,并且以后不会受到限制。代码如下:

#include<iostream>
#include<iomanip>
#include<cmath>


// Source: // http://w...content-available-to-author-only...o.uk/scripts/latlong.html

static const double PI = 3.14159265358979323846, earthDiameterMeters = 6371.0 * 2 * 1000;

double degreeToRadian (const double degree) { return (degree * PI / 180); };
double radianToDegree (const double radian) { return (radian * 180 / PI); };

double CoordinatesToAngle (double latitude1,
                           const double longitude1,
                           double latitude2,
                           const double longitude2)
{
  const auto longitudeDifference = degreeToRadian(longitude2 - longitude1);
  latitude1 = degreeToRadian(latitude1);
  latitude2 = degreeToRadian(latitude2);

  using namespace std;
  const auto x = (cos(latitude1) * sin(latitude2)) -
                 (sin(latitude1) * cos(latitude2) * cos(longitudeDifference));
  const auto y = sin(longitudeDifference) * cos(latitude2);

  const auto degree = radianToDegree(atan2(y, x));
  return (degree >= 0)? degree : (degree + 360);
}

double CoordinatesToMeters (double latitude1,
                            double longitude1,
                            double latitude2,
                            double longitude2)
{
  latitude1 = degreeToRadian(latitude1);
  longitude1 = degreeToRadian(longitude1);
  latitude2 = degreeToRadian(latitude2);
  longitude2 = degreeToRadian(longitude2);

  using namespace std;
  auto x = sin((latitude2 - latitude1) / 2), y = sin((longitude2 - longitude1) / 2);
#if 1
  return earthDiameterMeters * asin(sqrt((x * x) + (cos(latitude1) * cos(latitude2) * y * y)));
#else
  auto value = (x * x) + (cos(latitude1) * cos(latitude2) * y * y);
  return earthDiameterMeters * atan2(sqrt(value), sqrt(1 - value));
#endif
}

std::pair<double,double> CoordinateToCoordinate (double latitude,
                                                 double longitude,
                                                 double angle,
                                                 double meters)
{
  latitude = degreeToRadian(latitude);
  longitude = degreeToRadian(longitude);
  angle = degreeToRadian(angle);
  meters *= 2 / earthDiameterMeters;

  using namespace std;
  pair<double,double> coordinate;

  coordinate.first = asin((sin(latitude) * cos(meters))
                        + (cos(latitude) * sin(meters) * cos(angle)));
  coordinate.second = longitude + atan2((sin(angle) * sin(meters) * cos(latitude)),
                                        cos(meters) - (sin(latitude) * sin(coordinate.first)));

  coordinate.first = radianToDegree(coordinate.first);
  coordinate.second = radianToDegree(coordinate.second);

  return coordinate;
}

int main ()
{
  using namespace std;
  const auto latitude1 = 12.968460, longitude1 = 77.641308,
             latitude2 = 12.967862, longitude2 = 77.653130;

  cout << std::setprecision(10);
  cout << "(" << latitude1 << "," << longitude1 << ") --- "
          "(" << latitude2 << "," << longitude2 << ")\n";

  auto angle = CoordinatesToAngle(latitude1, longitude1, latitude2, longitude2);
  cout << "Angle =  " << angle << endl;

  auto meters = CoordinatesToMeters(latitude1, longitude1, latitude2, longitude2);
  cout << "Meters = " << meters << endl;

  auto coordinate = CoordinateToCoordinate(latitude1, longitude1, angle, meters);
  cout << "Destination = (" << coordinate.first << "," << coordinate.second << ")\n";
}

我想你只是想要这样的东西:

#include <iostream>

std::pair<double,double> CoordinateToCoordinate (double latitude,
                                             double longitude,
                                             double angle,
                                             double meters)
{
...
...
}

using namespace std;

int main() {

   double lat, lon, angle, dist;

   cout << "Enter lat:";   cin >> lat;
   cout << "Enter lon:";   cin >> lon;
   cout << "Enter angle:"; cin >> angle;
   cout << "Enter dist:";  cin >> dist;

   auto coordinate = CoordinateToCoordinate(lat, lon, angle, dist);
   cout << "Destination = (" << coordinate.first << "," << coordinate.second << ")\n";
}