地球坐标系函数集锦-philbert

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;
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值