分享
 
 
 

一个经纬度相关计算的C++类

王朝c/c++·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

写了一个经纬度距离计算的类

--------------CJWD.h--------------

#ifndef __JWD_AND_HELPER_20051005

#define __JWD_AND_HELPER_20051005

#include "stdafx.h"

#include <math.h>

#include <iostream>

using namespace std;

#ifndef PI

#define PI 3.14159265;

#endif

static double Rc = 6378137; // 赤道半径

static double Rj = 6356725; // 极半径

namespace CDYW{

class JWD

{

public:

double m_LoDeg, m_LoMin, m_LoSec; // longtitude 经度

double m_LaDeg, m_LaMin, m_LaSec;

double m_Longitude, m_Latitude;

double m_RadLo, m_RadLa;

double Ec;

double Ed;

public:

// 构造函数, 经度: loDeg 度, loMin 分, loSec 秒; 纬度: laDeg 度, laMin 分, laSec秒

JWD(double loDeg, double loMin, double loSec, double laDeg, double laMin, double laSec)

{

m_LoDeg=loDeg; m_LoMin=loMin; m_LoSec=loSec; m_LaDeg=laDeg; m_LaMin=laMin; m_LaSec=laSec;

m_Longitude = m_LoDeg + m_LoMin / 60 + m_LoSec / 3600;

m_Latitude = m_LaDeg + m_LaMin / 60 + m_LaSec / 3600;

m_RadLo = m_Longitude * PI / 180.;

m_RadLa = m_Latitude * PI / 180.;

Ec = Rj + (Rc - Rj) * (90.- m_Latitude) / 90.;

Ed = Ec * cos(m_RadLa);

}

//!

JWD(double longitude, double latitude)

{

m_LoDeg = int(longitude);

m_LoMin = int((longitude - m_LoDeg)*60);

m_LoSec = (longitude - m_LoDeg - m_LoMin/60.)*3600;

m_LaDeg = int(latitude);

m_LaMin = int((latitude - m_LaDeg)*60);

m_LaSec = (latitude - m_LaDeg - m_LaMin/60.)*3600;

m_Longitude = longitude;

m_Latitude = latitude;

m_RadLo = longitude * PI/180.;

m_RadLa = latitude * PI/180.;

Ec = Rj + (Rc - Rj) * (90.-m_Latitude) / 90.;

Ed = Ec * cos(m_RadLa);

}

};

class CJWDHelper

{

public:

CJWDHelper() {};

~CJWDHelper() {};

//! 计算点A 和 点B的经纬度,求他们的距离和点B相对于点A的方位

/*!

* \param A A点经纬度

* \param B B点经纬度

* \param angle B相对于A的方位, 不需要返回该值,则将其设为空

* \return A点B点的距离

*/

static double distance(JWD A, JWD B, double *angle)

{

double dx = (B.m_RadLo - A.m_RadLo) * A.Ed;

double dy = (B.m_RadLa - A.m_RadLa) * A.Ec;

double out = sqrt(dx * dx + dy * dy);

if( angle != NULL)

{

*angle = atan(fabs(dx/dy))*180./PI;

// 判断象限

double dLo = B.m_Longitude - A.m_Longitude;

double dLa = B.m_Latitude - A.m_Latitude;

if(dLo > 0 && dLa <= 0) {

*angle = (90. - *angle) + 90.;

}

else if(dLo <= 0 && dLa < 0) {

*angle = *angle + 180.;

}

else if(dLo < 0 && dLa >= 0) {

*angle = (90. - *angle) + 270;

}

}

return out/1000;

}

//! 计算点A 和 点B的经纬度,求他们的距离和点B相对于点A的方位

/*!

* \param longitude1 A点经度

* \param latitude1 A点纬度

* \param longitude2 B点经度

* \param latitude2 B点纬度

* \param angle B相对于A的方位, 不需要返回该值,则将其设为空

* \return A点B点的距离

*/

static double distance(

double longitude1, double latitude1,

double longitude2, double latitude2,

double *angle)

{

JWD A(longitude1,latitude1);

JWD B(longitude2,latitude2);

return distance(A, B, angle);

}

//! 已知点A经纬度,根据B点据A点的距离,和方位,求B点的经纬度

/*!

* \param A 已知点A

* \param distance B点到A点的距离

* \param angle B点相对于A点的方位

* \return B点的经纬度坐标

*/

static JWD GetJWDB(JWD A, double distance, double angle)

{

double dx = distance*1000 * sin(angle * PI /180.);

double dy = distance*1000 * cos(angle * PI /180.);

//double dx = (B.m_RadLo - A.m_RadLo) * A.Ed;

//double dy = (B.m_RadLa - A.m_RadLa) * A.Ec;

double BJD = (dx/A.Ed + A.m_RadLo) * 180./PI;

double BWD = (dy/A.Ec + A.m_RadLa) * 180./PI;

JWD B(BJD, BWD);

return B;

}

//! 已知点A经纬度,根据B点据A点的距离,和方位,求B点的经纬度

/*!

* \param longitude 已知点A经度

* \param latitude 已知点A纬度

* \param distance B点到A点的距离

* \param angle B点相对于A点的方位

* \return B点的经纬度坐标

*/

static JWD GetJWDB(double longitude, double latitude, double distance, double angle)

{

JWD A(longitude,latitude);

return GetJWDB(A, distance, angle);

}

};

}

#endif

=========== 测试程序==========

#include "stdafx.h"

#include <math.h>

#include <iostream>#include "CJWD.h"

using namespace std;using namespace CDYW;

double Rc = 6378137; // 赤道半径

double Rj = 6356725; // 极半径// 绵阳

double jd1 = 104.740999999;

double wd1 = 31.4337;// 成都

double jd2 = 104.01;

double wd2 = 30.40; int main(int argc, char* argv[])

{

double angle = 0;

cout << "A(绵阳): JD = " << jd1 << " WD = " << wd1 << endl;

cout << "B(成都): JD = " << jd2 << " WD = " << wd2 << endl;

cout << "--------------------" << endl;

cout << D_jw(wd1,jd1,wd2,jd2, angle) << endl;

cout << "angle: " << angle <<endl;

cout << "==============" <<endl;

JWD A(jd1,wd1),B(jd2,wd2);

double distance = CJWDHelper::distance(jd1,wd1,jd2,wd2, &angle);

//cout << CJWDHelper::distance(A,B, &angle) << endl;

cout << distance << endl;

cout << "angle: " << angle <<endl;

cout << "==============" <<endl;

JWD C = CJWDHelper::GetJWDB(A, distance, angle);

cout << "JD = " << C.m_Longitude << " WD = " << C.m_Latitude << endl;

cout << "==============" <<endl;

cout << A.m_LoDeg << " " << A.m_LoMin << " " << A.m_LoSec << endl; return 0;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有