以下是计算两经纬度之间距离的代码,分为:头文件、源代码和测试代码三部分。、
具体如下:
// LatLonDistanceDlg.h : 头文件 // #pragma once typedef struct { double dLongitude; double dLatitude; }MyLatLong_T,*pMyLatLong_T; // CLatLonDistanceDlg 对话框 class CLatLonDistanceDlg : public CDialog { ...... void DistanceOfTwoPositions(MyLatLong_T ll_PosStart, MyLatLong_T ll_PosEnd, double &dis); // 实现 protected: ...... }; // LatLonDistanceDlg.cpp : 实现文件 // // 常量定义 const double gConstPI = 3.1415926536; // WGS-84 长轴半径 #define EARTH_LONG_RADIUS_WGS84 6378137.0 // 单位: 米 // WGS-84 地球扁率(earth flattening) #define EARTH_FLATTENING_WGS84 298.257223563 // meters per sea mile #define METERS_PER_SEA_MILE 1852.0 // 输入参数: MyLatLong_T 是个结构,包括经度和纬度 // 输出参数: dDistance 就是返回的大圆距离 void CLatLonDistanceDlg::DistanceOfTwoPositions(MyLatLong_T StartLatLong, MyLatLong_T EndLatLong, double &dDistance) { double DInRadians; double dTmpVal = 0.0; double dFi = 0.0; double dFi2 = 0.0; double dDrda = EndLatLong.dLongitude - StartLatLong.dLongitude; double dTmp = 0.0; double dTmp2 = 0.0; dDrda = dDrda * gConstPI / 180.0; // in radians dFi = StartLatLong.dLatitude; dFi2 = EndLatLong.dLatitude; dFi = dFi * gConstPI / 180.0; // in radians dFi2 = dFi2 * gConstPI / 180.0; // in radians dTmpVal = sin(dFi) * sin(dFi2) + cos(dFi) * cos(dFi2) * cos(dDrda); if(fabs(dTmpVal) > 1.0) { AfxMessageBox(L"Invalidate value of arccos!"); // Use Unicode Character Set return ; } DInRadians = acos(dTmpVal); // in radians dTmp = (sin(dFi) + sin(dFi2)); dTmp2 = (sin(dFi) - sin(dFi2)); dTmpVal = ((3 * sin(DInRadians) - DInRadians) * dTmp * dTmp ) / (1 + cos(DInRadians)); dTmpVal = dTmpVal - ((3 * sin(DInRadians) + DInRadians) * dTmp2 * dTmp2) / (1 - cos(DInRadians)); dDistance = EARTH_LONG_RADIUS_WGS84 * DInRadians + (EARTH_LONG_RADIUS_WGS84 / (4 * EARTH_FLATTENING_WGS84)) * dTmpVal;//in meters } // 测试代码 // TODO: 在此添加额外的初始化代码 { // 深圳百合酒店 纬度:22.601369,经度114.115145 // 深圳百合星城 纬度:22.601334,经度114.115807 // 深圳布吉农批 纬度:22.583596,经度114.112227 MyLatLong_T LatLon; MyLatLong_T LatLon2; MyLatLong_T LatLon3; double dDis = 0.0; LatLon.dLatitude = 22.601369; LatLon.dLongitude = 114.115145; LatLon2.dLatitude = 22.601334; LatLon2.dLongitude = 114.115807; LatLon3.dLatitude = 22.583596; LatLon3.dLongitude = 114.112227; DistanceOfTwoPositions(LatLon,LatLon2,dDis); TRACE("%f\r\n",dDis); // 68.177865 DistanceOfTwoPositions(LatLon,LatLon3,dDis); TRACE("%f\r\n",dDis); // 1990.891295 }