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

时间: 2024-11-05 15:58:48

C++ 封装一个经纬度的类的相关文章

block传值以及利用block封装一个网络请求类

1.block在俩个UIViewController间传值 最近刚学了几招block 的高级用法,其实就是利用block语法在俩个UIViewController之间传值,在这里分享给初学者,同时也方便我自己理解.我们知道UINavigationController类管理UIViewController的时候,利用的是"栈"的思想,在这里不做过多解释,切入正题,假设我们现在有俩个UIViewController,viewC1和viewC2,viewC1比viewC2先进入到UINavi

Direct-X学习笔记--封装一个网格模型类

之前学习了网格模型的导入,绘制,了解了X文件等相关知识,但是,那样绘制比较麻烦,而且绘制一个模型需要好多代码,完全是面向过程的思维,这次,学习一下怎么把网格模型的导入以及绘制等功能封装在一个类中.顺便加深一下对World Transform的理解.感觉自己的3D思维还是没有培养起来,想绘制一个对象,绘制出来和想象中的位置相差甚远. 一.复习一下网格模型相关知识 网格模型就是一个我们在美术工具中制作好的资源,通过一些API接口我们可以将美术童鞋做好的模型很方便的导入程序中.我们只需要了解怎样从文件

PHP封装一个上传类

<?php //print_r($_FILES['pic']); //print_r($_SERVER); header("Content-type:text/html; charset=utf-8"); date_default_timezone_set("PRC"); define("ROOT",$_SERVER['DOCUMENT_ROOT']); class Upload{ protected $allowExt=array('jp

封装一个错误重试类

/// <summary> /// 错误重试处理 /// </summary> public static class RetryHandle { /// <summary> /// 重试 /// </summary> /// <param name="count">重试次数</param> /// <param name="actionFunc">执行方法</param>

爬取当当网的图书信息之封装一个工具类

把这个类名取为Tool 封装一个下载网页的方法GetHtml public static string GetHtml(string url) { try { WebClient wb = new WebClient(); return wb.DownloadString(url); } catch { return ""; } } 传入的是这个网页的URL,这个方法能帮我们把网页下载下来封装一个匹配图书类URL的的方法 public static ArrayList GetList(

Python+Selenium进阶版(八)- Python自定义封装一个简单的Log类

目标:如何写一个Python日志类,用来输出不同级别的日志信息到本地文件夹下的日志文件里. 练习场景: 我们需要封装一个简单的日志类,主要有以下内容: 1.生成的日志文件格式是 年月日分秒.log 2.生成的XXX.log文件存储在项目根目录下Logs文件夹下 3.这个日志类,支持INFO,ERROR两种日志级别 4.日志里,每行日志输出,时间日期+执行类名称+日志级别+日志描述 解决思路: 1.在根目录下新建一个Logs的文件夹,获取这个Log的相对路径: 2.日志的保存命名,需要系统时间:

1.使用C++封装一个链表类LinkList

 使用C++封装一个链表类LinkList.写出相应一个测试用例 链表需要提供 添加 修改删除 除重 合并 排序创建 销毁等接口. 不能调用库函数或者使用STL等类库 题目延伸***********逆置链表********** LinkNode.h #ifndef LINKNODE_H #define LINKNODE_H #include <iostream> class LinkNode { public: int m_idata; LinkNode* m_pnext; }; #end

封装一个类搞定90%安卓客户端与服务器端交互

本实例封装了一个处理安卓客户端与服务器端交互的几个方法,对于中文乱码问题本实例也找到了解决方案.本例可以处理的场景如下: 1.与服务器端交互json数据. 2.Get方式与服务器端交互数据. 3.Post方式与服务器端交互数据. 4.HttpClient方式与服务器端交互数据. 5.上传文件到服务器端. 6.从服务器端下载文件. 7.从服务器端读取文本文件. 实例截图: 本篇文章将实例代码完整贴出,希望以本文作为一个交流的平台,大家集思广益封装出更好的处理类.交流地址: http://blog.

Swift:简单封装一个工具类模板

创建模板类(封装一个类)新建一个名字叫做 Product 的类 Product.swift File 的内容 class Product { var name: String var description: String var price: Double var stock: Int init(name: String, description: String, price: Double, stock: Int) { self.name = name self.description =