?? coordinateconv.cpp
字號(hào):
// CoordinateConv.cpp: implementation of the CCoordinateConv class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "CCoordinateTranslateDemo.h"
#include "CoordinateConv.h"
#include "math.h" // 數(shù)學(xué)庫(kù)
const double PI = 3.1415926;
// 角度轉(zhuǎn)化成弧度
inline double DTOR(double Degree)
{
return Degree * PI / 180.0;
}
// 弧度轉(zhuǎn)化成角度
inline double RTOD(double Radian)
{
return Radian * 180.0 / PI;
}
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CCoordinateConv::CCoordinateConv()
{
}
CCoordinateConv::~CCoordinateConv()
{
}
// 功 能:已知起點(diǎn)經(jīng)緯度和航向(方位)、航程(距離),求終點(diǎn)經(jīng)緯度
// 輸入值:起點(diǎn)經(jīng)緯度和航向(方位)、航程(距離)
// 返回值:終點(diǎn)經(jīng)緯度(引用形式)
void CCoordinateConv::StartLatLonCSToEndLatLon(double dBeginLat,
double dBeginLong,
double dOrient,
double dDist,
double& dEndLat,
double& dEndLong)
{
// 判斷值的有效性
ASSERT(dBeginLat>=0 && dBeginLat <= 90);
ASSERT(dBeginLong>=0 && dBeginLong <= 180);
ASSERT(dOrient>=0 && dOrient <= 360);
ASSERT(dDist>=0);
// 計(jì)算終點(diǎn)緯度
double deltaLat = dDist/1.8520 * cos(DTOR(dOrient)); // 終點(diǎn)和起點(diǎn)的緯差,單位海里
dEndLat = dBeginLat + deltaLat/60.0; // 海里轉(zhuǎn)化成度,除以60
// 計(jì)算終點(diǎn)經(jīng)度
double DMP = 7915.70447*(log10(tan(DTOR(45+dEndLat/2.0))) - log10(tan(DTOR(45+dBeginLat/2.0)))); // 計(jì)算緯度漸長(zhǎng)率差,單位:分
double deltaLong = tan(DTOR(dOrient)) * DMP; // 終點(diǎn)和起點(diǎn)的經(jīng)差,單位海里
dEndLong = dBeginLong + deltaLong/60.0; // 海里轉(zhuǎn)化成度,除以60
}
// 功 能:已知起點(diǎn)和終點(diǎn)經(jīng)緯度,求航向(方位)、航程(距離)
// 輸入值:起點(diǎn)和終點(diǎn)經(jīng)緯度
// 返回值:終點(diǎn)經(jīng)緯度(引用形式)
void CCoordinateConv::LongLatToXY(double dBeginLat,
double dBeginLong,
double dEndLat,
double dEndLong,
double& dOrient,
double& dDist)
{
// 判斷值的有效性
ASSERT(dBeginLat>=0 && dBeginLat <= 90);
ASSERT(dBeginLong>=0 && dBeginLong <= 180);
ASSERT(dEndLat>=0 && dEndLat <= 180);
ASSERT(dEndLong>=0 && dEndLong <= 180);
// 計(jì)算航向(方位)
double DMP = 7915.70447*(log10(tan(DTOR(45+dEndLat/2.0))) - log10(tan(DTOR(45+dBeginLat/2.0)))); // 計(jì)算緯度漸長(zhǎng)率差,單位:分
double tmpdOrient = atan((dEndLong-dBeginLong)*60/DMP); //dEndLong-dBeginLong單位是度,而DMP單位是分,故*60
tmpdOrient = RTOD(fabs(tmpdOrient));
// 由于tmpdOrient的角度值在[0,90]之間,應(yīng)討論
if(dEndLong >= dBeginLong) // 向東
{
if(dEndLat >= dBeginLat) // 向北[0 90] NE
{
dOrient = tmpdOrient;
}
else // 向南(90 180] SE
{
dOrient = 180 - tmpdOrient;
}
}
else // 向西
{
if(dEndLat >= dBeginLat) // 向北[270 360) NW
{
dOrient = 360 - tmpdOrient;
} // 向南(90 180] SW
else
{
dOrient = 180 + tmpdOrient;
}
}
// 計(jì)算航程(距離)
BOOL bNear270 = IsNearRightAngle(dOrient); // 判斷是否在90/270度附近
if(!bNear270)
{
dDist = (dEndLat - dBeginLat)*60 / cos(DTOR(dOrient)) * 1.852;
}
else
{
// 在緯度較低、緯差不大、航程不遠(yuǎn)的情況下(即dEndLat - dBeginLat 不大),為簡(jiǎn)化計(jì)算,可用平均緯度代替中分緯度
if(fabs(dEndLat - dBeginLat) < 5.0) // 平均緯度 (dEndLat + dBeginLat)/2.0)
{
dDist = (dEndLong - dBeginLong)*60 * cos(DTOR((dEndLat + dBeginLat)/2.0)) / sin(DTOR(dOrient)) * 1.852;
}
else // 中分緯度 (acos((dEndLat - dBeginLat)*60/DMP))
{
dDist = (dEndLong - dBeginLong)*60 * cos(acos((dEndLat - dBeginLat)*60/DMP)) / sin(DTOR(dOrient)) * 1.852;
}
}
}
// 功 能:判斷航向是否接近90/270
// 輸入值:航向
// 返回值:是否接近90/270度標(biāo)志
BOOL CCoordinateConv::IsNearRightAngle(double dOrient)
{
BOOL bNewRightAngle = FALSE;
// 確保dOrient在[0,360]
if(dOrient < 0)
{
AfxMessageBox("航向/方位角為負(fù)值,請(qǐng)轉(zhuǎn)化成[0 360]之間");
dOrient = 360 + int(dOrient)%360 + (dOrient - int(dOrient));
}
if(dOrient > 360)
{
AfxMessageBox("航向/方位角為大于360,請(qǐng)轉(zhuǎn)化成[0 360]之間");
dOrient = (int)dOrient%360 + (dOrient - int(dOrient));
}
// 判斷是否接近90/270
double Angle = (int)dOrient%180;
if((Angle > 80) && (Angle < 100) )
{
bNewRightAngle = TRUE;
}
else
{
bNewRightAngle = FALSE;
}
return bNewRightAngle;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -