const double PI = 3.1415926;
const double HALF_CIRCLE_ANGLE = 180.0;
/**********************************************************************
* 函数名称: CalcDistance
* 功能描述: 在地球坐标系中,计算两点之间的距离
* 输入参数: 两个端点的坐标
* 输出参数: 距离
* 返 回 值: 无
* 其它说明:
* 修改日期 版本号 修改人 修改内容
***********************************************************************/
float __stdcall CalcDistance(float x1Long,float y1Lat,float x2Long,float y2Lat)
{
float radLat1 = y1Lat * 3.1415926 / 180.0;
float radLat2 = y2Lat * 3.1415926 / 180.0;
float a = radLat1 - radLat2;
float b = x1Long * 3.1415926 / 180.0 - x2Long* 3.1415926 / 180.0;
float s = 2 * asin(sqrt(pow(sin(a/2),2) +
cos(radLat1)*cos(radLat2)*pow(sin(b/2),2)));
s =s*6378.137 *1000;
return s;
}
/**********************************************************************
* 函数名称: CalcAngleByLonLat
* 功能描述:
* 计算A,B点练成的线段与正北的夹角
* 输入参数: d0,d1,d2,d3
* 输出参数:初始覆盖半径
* 返 回 值: 无
* 其它说明: 无
* 修改日期 版本号 修改人 修改内容
***********************************************************************/
double __stdcall CalcAngleByLonLat(double lonA, double latA, double lonB, double latB)
{
double dBearing ;
double dLonToLatRadio ;
double deltaX ;
double deltaY ;
double dAngle ;
dLonToLatRadio = fabs(cos(PI*latA/HALF_CIRCLE_ANGLE));
lonA = lonA * dLonToLatRadio;
lonB = lonB * dLonToLatRadio;
deltaX = lonB - lonA;
deltaY = latB - latA;
if (deltaX == 0 && deltaY >= 0)
{
dBearing = 0;
}
else if (deltaX == 0 && deltaY < 0)
{
dBearing = HALF_CIRCLE_ANGLE;
}
if (deltaX != 0)
{
dAngle = atan2(deltaX,deltaY)*HALF_CIRCLE_ANGLE/PI;
}
if (deltaX != 0 && dAngle < 0)
{
dBearing = 360 + dAngle;
}
else if (deltaX!=0 && dAngle >= 0)
{
dBearing = dAngle;
}
return dBearing;
}
/**********************************************************************
* 函数名称: GetLinePoint
* 功能描述: 在地球坐标系中,在直线的一端点及直线方向、长度已知情况下,计算另一端点坐标
* 输入参数: 直线与正北方向的夹角,长度,一端点的坐标
* 输出参数: 另一个顶点的坐标信息
* 返 回 值: 无
* 其它说明: 无
* 修改日期 版本号 修改人 修改内容
***********************************************************************/
void __stdcall GetLinePoint(TSectorPoint *OriginalPoint, double dAngle,double dLength,TSectorPoint *point)
{
double dLonDistance = dLength * sin(dAngle * PI / 180.0);
double dLatDistance = dLength * cos(dAngle * PI / 180.0);
double radLat0 = OriginalPoint->dCellLat * PI / 180.0;
double radLon0 = OriginalPoint->dCellLon * PI / 180.0;
if(dAngle<0.0)
{
dAngle += 360.0;
}
if(dAngle>360.0)
{
dAngle -=360.0;
}
point->dCellLat = (radLat0 + dLatDistance/(6378.137 *1000))*180.0/PI;
if(dAngle < 180.0)//0~180
{
point->dCellLon = (radLon0+ (asin(sqrt(pow(sin(dLonDistance/(6378.137 *1000*2)),2) / (pow(cos(radLat0),2))))*2))*180.0/PI;
}
else//180~360
{
point->dCellLon = (radLon0- (asin(sqrt(pow(sin(dLonDistance/(6378.137 *1000*2)),2) / (pow(cos(radLat0),2))))*2))*180.0/PI;
}
//如果经度超过180
if(point->dCellLon > 180)
{
point->dCellLon = point->dCellLon - 360.0;
}
else if(point->dCellLon < -180.0)
{
point->dCellLon = point->dCellLon + 360.0;
}
//如果纬度超过90
if(point->dCellLat > 90.0)
{
point->dCellLat = point->dCellLat - 180.0;
}
else if(point->dCellLat < -90.0)
{
point->dCellLat = point->dCellLat + 180.0;
}
}