需求:根据经纬度获取两点之间的表面距离,以及计算两点之间的方向
参考:
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++,哪里写的不好,还请提出,谢谢
原文地址:http://blog.csdn.net/zy416548283/article/details/38758989