计算地图上点与线段距离

将地球看做一个标准球体,计算点到线段的距离。

计算两点间的球面距离

/**
 *
 * a点经度,a点纬度,b点经度,b点纬度
 *
 */
public static double calcP2P(double alon, double alat, double blon, double blat) {
        double R = 6378.137;// 地球半径(千米)
        // 判断点是在北半球还是南半球,本程序中输入的数据若为负则表示在南边球
        double distance = 0.0D;

        double _alat = (alat) * (Math.PI / 180); // 弧度
        double _alon = (alon) * (Math.PI / 180);
        double _blat = (blat) * (Math.PI / 180);
        double _blon = (blon) * (Math.PI / 180);

        double c = Math.sin(_alat) * Math.sin(_blat) + Math.cos(_alat) * Math.cos(_blat) * Math.cos(_alon - _blon); // Java中三角函数角度以弧度制表示
        if (c > 1) {
            c = 1;
        }
        distance = Math.acos(c) * R; // 弧长公式:弧长 = 弧度 * 半径
        if (distance <= 0.01) { // GPS误差
            distance = 0.0D;
        }
        return distance;
}

计算点到线段的距离

/**
 *
 * x,y--点的经度和纬度
 * x1,y1--线段某个端点的经度和纬度
 * x2,y2--线段另外一个端点的经度和纬度
 *
 */
public static double calcP2L(double x, double y, double x1, double y1, double x2, double y2) {
        double d1 = (x2 - x1) * (x - x1) + (y2 - y1) * (y - y1);
        if (d1 < 0) {
            return calcP2P(x, y, x1, y1);
        }
        double d2 = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);
        if (d1 >= d2) {
            return calcP2P(x, y, x2, y2);
        }
        double r = d1 / d2;
        double px = x1 + (x2 - x1) * r;
        double py = y1 + (y2 - y1) * r;
        return calcP2P(x, y, px, py);
    }


转载于:https://my.oschina.net/u/1428349/blog/269703

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值