7

我环顾四周,仍然找不到任何可以帮助我的东西!我编写了一个程序来使用它们的纬度和经度计算两个城市之间的距离,城市的详细信息保存在一个文件中,然后在我的程序中加载到 BST 中!到目前为止,一切正常,除了当我运行假设计算距离的代码时,我得到每个城市的相同答案!我不太确定为什么我在每个城市都得到相同的答案!请帮我指出正确的方向?

这是计算距离的代码

#include <cmath> 
#define pi 3.14159265358979323846

string userResponse;
float globalLat1, globalLon1, globalLat2, globalLon2;

for(int j= 0; j < 2; j++){
        string whatever;
        if (j==0){
          bool hasbeenfound = false;
           do{
                //ask the user to enter their first city of their choice
                 whatever = "first ";
                  cout << "Enter your " + whatever + "City" << endl;
                  cout << "-------------------" << endl;
                  cin >> userResponse;
                  cout << endl;
                  if (Cities->search(userResponse)) //check if the entered city already exist
                  {
                  hasbeenfound = true;
                  }
                  else{
                       cout << "City not Found" << endl;
                       cout << endl;
                       }
                  //globalCity1 = Cities->sRootName;
                  globalLat1 = Cities->sLatitude;
                  globalLon1 = Cities->sLongitude;
                  }
                  while(hasbeenfound == false); //while the entered city hasn't been found, repeat the process

               }else
               {
                   bool hasbeenfound = false;
                    do{
                        //ask the user to enter their second city of their choice
                              whatever = "second ";
                              cout << endl;
                              cout << "Enter your " + whatever + "City" << endl;
                              cout << "-------------------" << endl;
                              cin >> userResponse;
                              cout << endl;
                              if (Cities->search(userResponse)) //check if the entered city already exist
                              {
                              hasbeenfound = true;
                              }
                              else{
                                   cout << "City not Found" << endl;
                                   }
                              //globalCity2 = Cities->sRootName;
                              globalLat2 = Cities->sLatitude;
                              globalLon2 = Cities->sLongitude;
                              }
                    while(hasbeenfound == false); //while the entered city hasn't been found, repeat the process

                       }
                    }

// This function converts decimal degrees to radians
double deg2rad(double deg) {
return (deg * pi / 180);
};

//  This function converts radians to decimal degrees
double rad2deg(double rad) {
return (rad * 180 / pi);
};

//distance calculations
cout << endl;
distan = sin(globalLat1)) * sin(deg2rad(globalLat2)) + cos(deg2rad(globalLat1)) * cos(deg2rad(globalLat2)) * cos(globalLon2 - globalLon1);
distan = rad2deg(distan);
distan = distan * 60 * 1.1515;
distan = (6371 * pi * distan)/180;
cout << "The Distance between the to cities is: " << distan << " kilometers" << endl;
4

4 回答 4

30

据说,Haversine 公式是您的答案:

#include <math.h>
#include <cmath> 
#define earthRadiusKm 6371.0

// This function converts decimal degrees to radians
double deg2rad(double deg) {
  return (deg * M_PI / 180);
}

//  This function converts radians to decimal degrees
double rad2deg(double rad) {
  return (rad * 180 / M_PI);
}

/**
 * Returns the distance between two points on the Earth.
 * Direct translation from http://en.wikipedia.org/wiki/Haversine_formula
 * @param lat1d Latitude of the first point in degrees
 * @param lon1d Longitude of the first point in degrees
 * @param lat2d Latitude of the second point in degrees
 * @param lon2d Longitude of the second point in degrees
 * @return The distance between the two points in kilometers
 */
double distanceEarth(double lat1d, double lon1d, double lat2d, double lon2d) {
  double lat1r, lon1r, lat2r, lon2r, u, v;
  lat1r = deg2rad(lat1d);
  lon1r = deg2rad(lon1d);
  lat2r = deg2rad(lat2d);
  lon2r = deg2rad(lon2d);
  u = sin((lat2r - lat1r)/2);
  v = sin((lon2r - lon1r)/2);
  return 2.0 * earthRadiusKm * asin(sqrt(u * u + cos(lat1r) * cos(lat2r) * v * v));
}
于 2012-04-18T08:20:21.623 回答
2

使用boost.geometry

typedef boost::geometry::model::point<
    double, 2, boost::geometry::cs::spherical_equatorial<boost::geometry::degree>
> spherical_point;

spherical_point p(lon1_degree, lat1_degree);
spherical_point q(lon2_degree, lat2_degree);
double dist = boost::geometry::distance(p, q);
double const earth_radius = 6371.0; // Km
double dist_km = dist*earth_radius;
于 2018-11-03T11:14:34.873 回答
1

对于需要快速的人:

  // Haversine formula:

    func deg2rad(_ deg: Double) ->Double {
        return deg * Double.pi  / 180.0
    }

    func distanceEarth(lat1d: Double, lon1d: Double, lat2d: Double, lon2d: Double) ->Double {
    let  earthRadiusKm = 6371.0

    let lat1r = deg2rad(lat1d);
    let lon1r = deg2rad(lon1d);
    let lat2r = deg2rad(lat2d);
    let lon2r = deg2rad(lon2d);
    let u = sin((lat2r - lat1r)/2);
    let v = sin((lon2r - lon1r)/2);
    return 2.0 * earthRadiusKm * asin(sqrt(u * u + cos(lat1r) * cos(lat2r) * v * v));
}

//test here.... https://andrew.hedges.name/experiments/haversine/


func doTestHaversine(){

    let km = distanceEarth(lat1d: 38.898556, lon1d: -77.037852, lat2d: 38.897147, lon2d: -77.043934)
     print(km)  // should show : 0.549 or similar..
}
于 2018-08-29T19:28:13.657 回答
-8

这是我用来查找距离的方法 这可能更容易

或者这个,不考虑地球的“弯曲”在此处输入图像描述

于 2012-04-17T20:57:39.617 回答