Calculating the distance between 2 latitudes and longitudes that are saved in a text file?

I've looked around and still couldn't find anything to help me really! I've written a program to calculate the distance between 2 cities using their Latitudes and Longitudes, the cities details are saved in a file then loaded in my program into a BST! So far everything works fine except when i run the codes that is suppose to calculate the distance i get the same answer for every cities! Am not quite sure as to why i keep getting the same answer for every cities! Please help point me into the right direction?

here are the codes to calculate the distance

#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;

Answers


As it is said, Haversine formula is your answer:

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

for people who need in swift:

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

Using 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;

This is the method that I would use for finding the distance

Or this, not concidering the "bend" of the Earth


Need Your Help

How to set up Grafana so that no password is necessary to view dashboards

grafana

Despite these settings, Grafana still requires the use of a password to view Dashboards. Can someone please help me with the correct settings?