需求:根据经纬度获取两点之间的表面距离,以及计算两点之间的方向
参考:
Android获取经纬度、计算距离、方位角 帖子里有讲公式,我就不重复了.这里没有写方位角的函数,因为暂时没用到其实很简单.
计算地球两个经纬度之间的距离和方向,这里计算的方向区分的更加具体
以后会不断地重构这个类.
/* * JWD.h * * Created on: 2014年8月22日 * Author: zy */ #ifndef JWD_H_ #define JWD_H_ #include<math.h> class JWD { public: JWD(double longitude, double latitude); virtual ~JWD(); //求弧度 double Radian(double d) { return d*PI / 180.0; //角度1? = π / 180 } double GetDistance(JWD B); void GetDirection(JWD B); private: double m_longitude; //经度,点分十进制的形式(谷歌地图可以获取这个数据),东经为正,西经为负 double m_latitude ; //纬度,北纬为正,南纬为负 //常数据成员通过初始化列表来获得初值,C++11可以给非静态成员常量初始化 const double PI; const double EARTH_RADIUS; }; #endif /* JWD_H_ */
/* * JWD.cpp * * Created on: 2014年8月22日 * Author: zy */ #include "JWD.h" #include<string> #include <iostream> JWD::JWD(double longitude, double latitude):PI(3.1415927),EARTH_RADIUS(6378.137) { // TODO Auto-generated constructor stub m_longitude = longitude; m_latitude = latitude; } JWD::~JWD() { // TODO Auto-generated destructor stub } //返回单位是米 double JWD::GetDistance(JWD B) { double radLatitudeA = Radian(this->m_latitude); double radLatitudeB = Radian(B.m_latitude); double radLongitudeA = Radian(this->m_longitude); double radLongitudeB = Radian(B.m_longitude); double radLatitudeDiff = radLatitudeA - radLatitudeB; double radLongitudeDiff = radLongitudeA - radLongitudeB; //公式 double dst = 2 * asin((sqrt(pow(sin(radLatitudeDiff / 2), 2) + cos(radLatitudeA) * cos(radLatitudeB) * pow(sin(radLongitudeDiff / 2), 2) ))); dst = dst * EARTH_RADIUS; dst= round(dst * 10000000) / 10000; return dst; } //获取B点在A的什么方向? void JWD::GetDirection(JWD B) { //注意这里获得的位数,常量PI要取大点 double aRad = atan2(B.m_latitude-this->m_latitude,B.m_longitude-this->m_longitude); std::string str; std::cout << aRad << std::endl; if (aRad > -PI/4 && (aRad <= PI/4)) { str = "东"; } else if(aRad > PI/4 && (aRad <= PI*3/4)) { str = "北"; }else if ((aRad > PI*3/4 && (aRad <= PI)) || (aRad >=-PI && (aRad <= -PI*3/4))) { str = "西"; } else if (aRad >= -PI*3/4 && (aRad <= -PI/4)) { str = "南"; } std::cout << str << std::endl; } int main() { JWD A(116.41615, 39); JWD B(118, -40); double distance = A.GetDistance(B); std::cout<< distance << "m" <<std::endl; A.GetDirection(B); B.GetDirection(A); return 0; }
输出结果如下:
8.79572e+06m -1.55075 南 1.59084 北
说明:
1.方向那里,因为我只需要4个方向就可以了,不需要8个方向,你可以根据你的需求来进行修改;
2.函数经过了测试,距离这里可以使用这个小网页来验证:经纬度计算距离的验证;
3.谷歌地图上查看经纬度,打开谷歌地图实验室,里面可以设置;
4.刚刚入门C++,哪里写的不好,还请提出,谢谢
时间: 2024-11-05 15:58:48