计算两点经纬度点的之间的距离和方向角,正北为0度

83 篇文章 0 订阅
24 篇文章 0 订阅
double GetDistance(double lat1, double lng1, double lat2, double lng2)
{
     double angle = PI/180.0;
    return (2*asin(sqrt(pow(sin((lat1-lat2)*angle/2),2) + cos(lat1*angle)*cos(lat2*angle)*pow(sin((lng1-lng2)*angle/2),2))))*6378.137;//地球半经:6378.137Km
}
 
int GeoAngle(double lat1, double lon1, double lat2, double lon2)
{
    double angle = 3.14159265358979324/180;
    double dY = cos(lon2*angle) * sin(lat2*angle - lat1*angle);
    double dX = cos(lon1*angle) * sin(lon2*angle) - sin(lon1*angle) * cos(lon2*angle) * cos(lat2*angle - lat1*angle);
    int dirE0 = 180 * atan2(dY, dX) / 3.14159265358979324;
    if (dirE0 < 0)
    {
        dirE0 = dirE0 + 360; //0~360
    }
    int dirN0 = (dirE0 + 90) % 360;
    return (dirN0);
}

 

这个问题需要使用球面三学的知识来解决。以下是一个简单的 Java 代码示例,用于计算两个已知之间距离和方位。 ```java public class LocationUtils { private static final double EARTH_RADIUS = 6371.0; // 地球半径,单位为千米 /** * 根据距离和与正北角度计算两点经纬度 * @param lat1 第一个的纬 * @param lng1 第一个的经 * @param distance 两点之间距离,单位为千米 * @param bearing 与正北角度,范围为[0,360) * @return 第二个经纬度 */ public static double[] calculateLocation(double lat1, double lng1, double distance, double bearing) { double lat2, lng2; double radLat1 = Math.toRadians(lat1); double radBearing = Math.toRadians(bearing); double radDistance = distance / EARTH_RADIUS; lat2 = Math.asin(Math.sin(radLat1) * Math.cos(radDistance) + Math.cos(radLat1) * Math.sin(radDistance) * Math.cos(radBearing)); lng2 = lng1 + Math.atan2(Math.sin(radBearing) * Math.sin(radDistance) * Math.cos(radLat1), Math.cos(radDistance) - Math.sin(radLat1) * Math.sin(lat2)); return new double[]{Math.toDegrees(lat2), Math.toDegrees(lng2)}; } } ``` 使用示例: ```java double[] location = LocationUtils.calculateLocation(39.9087, 116.3975, 5.0, 90.0); System.out.println("经:" + location[1] + ",纬:" + location[0]); ``` 这将输出: ``` 经:116.44554647807073,纬:39.908700000000006 ``` 其中,39.9087 和 116.3975 是第一个的纬和经,5.0 是两个之间距离(单位为千米),90.0 是与正北角度计算得出的第二个经纬度是 [39.908700000000006, 116.44554647807073]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值