首页 > 代码库 > C++ 封装一个经纬度的类

C++ 封装一个经纬度的类

需求:根据经纬度获取两点之间的表面距离,以及计算两点之间的方向

参考:

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++,哪里写的不好,还请提出,谢谢

C++ 封装一个经纬度的类