java计算两个经纬度相对的方向角

 package ejbModule.Map.mgr;
 
 
public class JWD {
    static double Rc = 6378137;  // 赤道半径
 
    static double Rj = 6356725;  // 极半径 
    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 static void main(String[] args) {
        // TODO Auto-generated method stub
//      JWD B = JWD.GetJWDB(113.344,23.1346, 0.112, 130);
//      System.out.println(B.m_Longitude);
//      System.out.println(B.m_Latitude);
        JWD A = new JWD(113.344,23.1346);
        JWD B = new JWD(113.33986835073915,23.136261252139477);
        System.out.println(JWD.angle(A, B));
    }
    public 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 * Math.PI/180.;
      m_RadLa = latitude * Math.PI/180.;
      Ec = Rj + (Rc - Rj) * (90.-m_Latitude) / 90.;
      Ed = Ec * Math.cos(m_RadLa);
    }
    public static JWD GetJWDB(JWD A, double distance, double angle)
    {
      double dx = distance*1000 * Math.sin(angle * Math.PI /180.);
      double dy = distance*1000 * Math.cos(angle * Math.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./Math.PI;
      double BWD = (dy/A.Ec + A.m_RadLa) * 180./Math.PI;
      JWD B = new JWD(BJD, BWD);
      return B;
    }
 
      
 
    //! 已知点A经纬度,根据B点据A点的距离,和方位,求B点的经纬度
    /*!
      * /param longitude 已知点A经度
      * /param latitude 已知点A纬度
      * /param distance B点到A点的距离
      * /param angle B点相对于A点的方位
      * /return B点的经纬度坐标
      */
    public static JWD GetJWDB(double longitude, double latitude, double distance, double angle)
    {
      JWD A = new JWD(longitude,latitude);
      return GetJWDB(A, distance, angle);
    }
     
     
    //! 计算点A 和 点B的经纬度,求他们的距离和点B相对于点A的方位
    /*!
      * \param A A点经纬度
      * \param B B点经纬度
      * \param angle B相对于A的方位, 不需要返回该值,则将其设为空
      * \return A点B点的角度
      */
    public static double angle(JWD A, JWD B)
    {
      double dx = (B.m_RadLo - A.m_RadLo) * A.Ed;
      double dy = (B.m_RadLa - A.m_RadLa) * A.Ec;
//    double out = Math.sqrt(dx * dx + dy * dy);
      double angle = 0.0;
       angle = Math.atan(Math.abs(dx ))*180./Math.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 angle;
    }
 
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值