计算保存在文本文件中的2个纬度和经度之间的距离?

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

这是计算距离的代码

#include  #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 << "-------------------" <> userResponse; cout <search(userResponse)) //check if the entered city already exist { hasbeenfound = true; } else{ cout << "City not Found" << endl; cout <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 << "-------------------" <> userResponse; cout <search(userResponse)) //check if the entered city already exist { hasbeenfound = true; } else{ cout << "City not Found" <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; 

正如所说,Haversine公式是你的答案:

 #include  #include  #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)); } 

对于急需的人:

  // 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.. } 

使用boost.geometry

 typedef boost::geometry::model::point< double, 2, boost::geometry::cs::spherical_equatorial > 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; 

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

或者说,这并不能说明地球的“弯曲” 在此处输入图像描述