首页 > 其他分享 >获取两个经纬度距离

获取两个经纬度距离

时间:2024-11-20 09:18:07浏览次数:1  
标签:radLat1 rad radLat2 经纬度 double 距离 获取 param Math

/**
 * 距离工具类 用于计算两个金纬度距离
 * @author zhengcj
 * @description:
 * @date 2024/11/19 10:27
 */
public class CalculationLogLatDistanceUtils {
    /**
     * 地球赤道半径(km)
     * */
    public final static double EARTH_RADIUS = 6378.137;

    /**
     * 转化为弧度(rad)
     * */
    public static double rad(double d) {
        return d * Math.PI / 180.0;
    }

    /**
     * 求两经纬度距离
     *
     * @param lon1
     *            第一点的经度
     * @param lat1
     *            第一点的纬度
     * @param lon2
     *            第二点的经度
     * @param lat2
     *            第二点的纬度
     * @return 两点距离,单位km
     * */
    public static double GetDistanceOne(double lon1, double lat1, double lon2,
                                        double lat2) {
        double r1 = rad(lat1);
        double r2 = rad(lon1);
        double a = rad(lat2);
        double b = rad(lon2);
        double s = Math.acos(Math.cos(r1) * Math.cos(a) * Math.cos(r2 - b)
                + Math.sin(r1) * Math.sin(a))
                * EARTH_RADIUS;
        return s;
    }

    /**
     * 求两经纬度距离(google maps源码中)
     *
     * @param lon1
     *            第一点的经度
     * @param lat1
     *            第一点的纬度
     * @param lon2
     *            第二点的经度
     * @param lat2
     *            第二点的纬度
     * @return 两点距离,单位km
     * */
    public static double GetDistanceTwo(double lon1, double lat1, double lon2,
                                        double lat2) {
        double radLat1 = rad(lat1);
        double radLat2 = rad(lat2);
        double a = radLat1 - radLat2;
        double b = rad(lon1) - rad(lon2);
        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)
                + Math.cos(radLat1) * Math.cos(radLat2)
                * Math.pow(Math.sin(b / 2), 2)));
        s = s * EARTH_RADIUS;
        return s;
    }

    /**
     * 求两经纬度距离
     *
     * @param lon1
     *            第一点的经度
     * @param lat1
     *            第一点的纬度
     * @param lon2
     *            第二点的经度
     * @param lat2
     *            第二点的纬度
     * @return 两点距离,单位km
     * */
    public static double GetDistanceThree(double lon1, double lat1,
                                          double lon2, double lat2) {
        double radLat1 = rad(lat1);
        double radLat2 = rad(lat2);
        double radLon1 = rad(lon1);
        double radLon2 = rad(lon2);
        if (radLat1 < 0)
            radLat1 = Math.PI / 2 + Math.abs(radLat1);// south
        if (radLat1 > 0)
            radLat1 = Math.PI / 2 - Math.abs(radLat1);// north
        if (radLon1 < 0)
            radLon1 = Math.PI * 2 - Math.abs(radLon1);// west
        if (radLat2 < 0)
            radLat2 = Math.PI / 2 + Math.abs(radLat2);// south
        if (radLat2 > 0)
            radLat2 = Math.PI / 2 - Math.abs(radLat2);// north
        if (radLon2 < 0)
            radLon2 = Math.PI * 2 - Math.abs(radLon2);// west
        double x1 = Math.cos(radLon1) * Math.sin(radLat1);
        double y1 = Math.sin(radLon1) * Math.sin(radLat1);
        double z1 = Math.cos(radLat1);

        double x2 = Math.cos(radLon2) * Math.sin(radLat2);
        double y2 = Math.sin(radLon2) * Math.sin(radLat2);
        double z2 = Math.cos(radLat2);

        double d = Math.pow((x1 - x2), 2) + Math.pow((y1 - y2), 2)
                + Math.pow((z1 - z2), 2);
        // // 余弦定理求夹角
        // double theta = Math.acos((2 - d) / 2);

        d = Math.pow(EARTH_RADIUS, 2) * d;
        // //余弦定理求夹角
        double theta = Math.acos((2 * Math.pow(EARTH_RADIUS, 2) - d)
                / (2 * Math.pow(EARTH_RADIUS, 2)));

        double dist = theta * EARTH_RADIUS;
        return dist;
    }

}

 

标签:radLat1,rad,radLat2,经纬度,double,距离,获取,param,Math
From: https://www.cnblogs.com/zhengOK/p/18556119

相关文章

  • 如何利用Spring Boot搭建Web应用来获取和整合数据?
    以下是利用SpringBoot搭建Web应用来获取和整合数据的基本步骤:创建SpringBoot项目•可以通过SpringInitializr(在线工具或者集成在IDE中的插件)创建项目,选择需要的依赖,比如Web依赖(包含SpringMVC等用于构建Web应用的关键组件),还有对应数据库连接的依赖(如使用MySQL就添加MySQL......
  • 3243.新增道路查询的最短距离
    给你一个整数 n 和一个二维整数数组 queries。有 n 个城市,编号从 0 到 n-1。初始时,每个城市 i 都有一条单向道路通往城市 i+1( 0<=i<n-1)。queries[i]=[ui,vi] 表示新建一条从城市 ui 到城市 vi 的单向道路。每次查询后,你需要找到从城市 0 到......
  • 【每日一题】3243. 新增道路查询后的最短距离 I
    给你一个整数 n 和一个二维整数数组 queries。有 n 个城市,编号从 0 到 n-1。初始时,每个城市 i 都有一条单向道路通往城市 i+1( 0<=i<n-1)。queries[i]=[ui,vi] 表示新建一条从城市 ui 到城市 vi 的单向道路。每次查询后,你需要找到从城市 0 到城市......
  • 实时信息获取神器:深入体验ChatGPT的全新搜索功能
    OpenAI最近发布了新的ChatGPT搜索功能,这一功能旨在让用户能够实时搜索并获取最新的网络信息。这不仅拓宽了ChatGPT的应用范围,还为用户提供了更强大的信息获取渠道。用户现在可以像在搜索引擎中一样,输入问题来找到特定的答案,无论是最新的新闻、体育赛事结果、天气预报,还是股......
  • 获取用户基本信息(UnionID 机制)
    获取用户基本信息(UnionID机制)在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的。对于不同公众号,同一用户的openid不同)。公众号可通过本接口来根据OpenID获取用户基本信息,包括语言和关注时间。请注意,如果开发者有......
  • 获取用户基本信息(UnionID 机制)
    获取用户基本信息(UnionID机制)在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的。对于不同公众号,同一用户的openid不同)。公众号可通过本接口来根据OpenID获取用户基本信息,包括语言和关注时间。请注意,如果开发者有......
  • php购物商城在线购物商城电商系统php期末作业课程设计大作业php+mysql+html源码获取
    一、功能介绍php+mysql+html+css实现的一个在线购物商城,实现了下单等核心购物流程登录注册首页商品列表商品详情商品购买我的订单后台管理登录退出商品管理订单管理用户管理源码获取方式请私聊二、效果展示三、代码展示四、项目总结这是用php+......
  • 51单片机关于超声波测距(可用串口助手显示距离)
    *************************************************************************************声明:我使用的单片机的型号是stc89c51rc,大家请根据自己的实际情况来配置****************************************************************************************************......
  • [Java] 获取操作系统类型
    需求描述在进行Java开发时,我们有时需要根据不同的操作系统执行不同的操作,例如在Windows系统下执行不同的命令,或者在Linux系统下调用不同的库函数。因此,判断当前运行的操作系统是十分重要的。此文将介绍如何使用Java判断当前操作系统,并给出相应的代码示例。代码示例OsUt......
  • 线性码、汉明重量、汉明距离
    点个关注吧谢谢!有升学问题等可以私信一、线性码(LinearCode)定义1:qqq阶线性码CC......