绿色软件联盟:绿色软件下载
Hi,请  登录  或  注册

高德地图(点到线段的最短距离算法)不调用高德API

package com.sage.dss.util;

import java.math.BigDecimal;

/**

 * 提取自 AMapUtils(版本 com.amap.api:map2d:2.9.1)。

 * 修改了参数,解除对高德 API 的依赖。

 */

public class MapUtil {

    /** 

     * 此方法与高德API  distance方法算法一致

     * 计算两点间的距离,单位:米 

     */

    public static BigDecimal calculateLineDistance(double x1, double y1, double x2, double y2) {

    double lon1 = (Math.PI / 180) * x1;

    double lon2 = (Math.PI / 180) * x2;

    double lat1 = (Math.PI / 180) * y1;

    double lat2 = (Math.PI / 180) * y2;

    if (lon2 == lon1) {

return new BigDecimal(0);

}

    // 地球半径

    double R = 6378;

    // 两点间距离 km,如果想要米的话,结果*1000就可以了

    double d = Math.acos(Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos(lon2 - lon1)) * R;

    return new BigDecimal(d);

    }

    

    double PointToSegDist(double x, double y, double x1, double y1, double x2, double y2){

        double cross = (x2 - x1) * (x - x1) + (y2 - y1) * (y - y1);

        if (cross <= 0){

            return calculateLineDistance(x, y, x1, y1).doubleValue();

        }

        double d2 = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);

        if (cross >= d2){

            return calculateLineDistance(x, y, x2, y2).doubleValue();

        }

        BigDecimal l1 = calculateLineDistance(x, y, x1, y1);

        BigDecimal l2 = calculateLineDistance(x, y, x2, y2);

        BigDecimal l12 = calculateLineDistance(x1, y1, x2, y2);

        BigDecimal l = l1.add(l2).add(l12).divide(new BigDecimal(2), 6); // 半周长

        double s = Math.sqrt(l.multiply(l.subtract(l12).multiply(l.subtract(l1).multiply(l.subtract(l2)))).doubleValue());

        return new BigDecimal(s).multiply(new BigDecimal(2)).divide(l12, 6).doubleValue();

    }

}

赞(0)
标题:《高德地图(点到线段的最短距离算法)不调用高德API》
链接:https://www.lvruan.com/app/555453
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

相关推荐

  • 暂无文章

LvRuan.com=绿软=绿盟=绿色软件联盟
情怀第一 18年 老牌 下载站 绿色 安全 无广告 无捆绑

评论 抢沙发

登录

找回密码

注册