原文https://blog.csdn.net/jk940438163/article/details/83147557

思路:

1. 地球本身是个不规则的球体,这里将其看着一个规制球体

2. 半径取平均值:6371.393千米 (戳这里还有测量方法说明)

3. 计算公式采用“球面距离公式”:S=R·arccos[cosβ1cosβ2cos(α1-α2)+sinβ1sinβ2](戳这里有具体说明)

4. 对公式的理解:设需要求距离的两点为A、B,球心为O。可以分解成3步:

① cosβ1cosβ2cos(α1-α2)+sinβ1sinβ2——求∠AOB的余弦值,这里是难点,得到这部分公式的推导过程比较复杂;

② arccos[∠AOB的余弦值]——求∠AOB的反余弦值,值域为[0,π],本质是 ∠AOB角度 / 180° * π;

③ R·∠AOB的反余弦值,等价于 R·∠AOB角度 / 180° * π,这里集合弧长公式很好理解

注意:

1. 经纬度,在本质上是角度

2. Java中的Math类提供的sin和con方法的参数是弧度,而不是角度

3. 公式里面的“arccos”是反余弦算法,在Math类中为acos()方法

private static final double EARTH_RADIUS = 6371393; // 平均半径,单位:m

/**

* 通过AB点经纬度获取距离

* @param pointA A点(经,纬)

* @param pointB B点(经,纬)

* @return 距离(单位:米)

*/

public static double getDistance(Point2D pointA, Point2D pointB) {

// 经纬度(角度)转弧度。弧度用作参数,以调用Math.cos和Math.sin

double radiansAX = Math.toRadians(pointA.getX()); // A经弧度

double radiansAY = Math.toRadians(pointA.getY()); // A纬弧度

double radiansBX = Math.toRadians(pointB.getX()); // B经弧度

double radiansBY = Math.toRadians(pointB.getY()); // B纬弧度

// 公式中“cosβ1cosβ2cos(α1-α2)+sinβ1sinβ2”的部分,得到∠AOB的cos值

double cos = Math.cos(radiansAY) * Math.cos(radiansBY) * Math.cos(radiansAX - radiansBX)

+ Math.sin(radiansAY) * Math.sin(radiansBY);

// System.out.println("cos = " + cos); // 值域[-1,1]

double acos = Math.acos(cos); // 反余弦值

// System.out.println("acos = " + acos); // 值域[0,π]

// System.out.println("∠AOB = " + Math.toDegrees(acos)); // 球心角 值域[0,180]

return EARTH_RADIUS * acos; // 最终结果

}

测试代码:附上百度地图坐标拾取系统,方便各位测试

public static void main(String[] args) {

// 北京 东单地铁站

Point2D pointDD = new Point2D.Double(116.425249, 39.914504);

// 北京 西单地铁站

Point2D pointXD = new Point2D.Double(116.382001, 39.913329);

System.out.println(getDistance(pointDD, pointXD));

System.out.println();

// 北京 天安门

Point2D pointTAM = new Point2D.Double(116.403882, 39.915139);

// 广州 越秀公园

Point2D pointGZ = new Point2D.Double(113.272422,23.147387);

System.out.println(getDistance(pointTAM, pointGZ));

System.out.println();

// 四川大学

Point2D pointSCDX = new Point2D.Double(104.090539,30.636951);

// 成都南站

Point2D pointCDNZ = new Point2D.Double(104.074238,30.612572);

System.out.println(getDistance(pointSCDX, pointCDNZ));

System.out.println();

}

彩蛋:SQL的实现——传入的经纬度 是 东单地铁站的

-- 北京 东单 116.425249, 39.914504

SELECT

`name`,

(

6371393 * ACOS(

COS(RADIANS(39.914504)) * COS(RADIANS(latitude)) * COS(RADIANS(116.425249 - longitude))

+ SIN(RADIANS(39.914504)) * SIN(RADIANS(latitude))

)

) AS distance, longitude, latitude

FROM

tbl_address

WHERE

`name` LIKE '北京%'

ORDER BY

distance;

运行结果:

结语:

这个方法应该是十分好理解的,唯一比较难的是公式中第一步那部分。

本来这里可以把完整的推到过程写出来,但由于过程比较繁杂,所以就算了。如果觉得有需要,可以在评论区提要求,我后面有空会补上。

另外,如果这篇博文对你有帮助,请在评论区举起你的小手,这将成为我继续写详细博客的动力!!谢谢!!!

最后,转载请指明出处~

java point类求两点间距离_JAVA 根据经纬度获取两点之间的距离(转载)相关推荐

  1. 根据经纬度获取两点之间的距离 -- 腾讯地图(PHP后台)

    项目需求:根据经纬度获取两点之间的距离,我这里用的是腾讯地图的api php代码: /*** 利用腾讯地图api* 计算两点地理坐标之间的距离*/function getDistance(){$key ...

  2. java point类求两点间距离_java编程:编Point类,有两属性x,y,一个方法distance(Point p1,Point p2),算两点距离,我用内部类做不...

    wendy 回答于:2017-02-20 import java.util.Scanner; public class Point { private double x; private double ...

  3. Java根据经纬度计算两点之间的距离

    1. 前言   在我们平时使用美团,饿了么等app进行订餐,或者使用猫眼进行订电影票的时候,都有一个距离的排序,表明该家店距离我们当前的位置,这种基于地理位置的服务,统一被称为LBS(Location ...

  4. php 如何根据经纬度计算距离,小程序实例:如何根据经纬度计算两点之间的距离(代码)...

    本篇文章给大家带来的内容是关于小程序实例:如何根据经纬度计算两点之间的距离(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助.//计算两点位置距离 getDistance: fun ...

  5. 根据经纬度计算两点之间的距离(单位米)

    package com.xiao.map;// 算法工程师!! public class MapUtils {private static double rad(double d) {return d ...

  6. 地理大圆距离 C语言,通过经纬度计算两点之间的距离

    2019独角兽企业重金招聘Python工程师标准>>> 项目里有一个需求是计算两台机器之间的距离,有了这两台机器的经纬度,距离就很好计算了. 有一个 球面余弦定律 可以用来可以计算球 ...

  7. 通过经纬度计算两点之间的距离的公式

    通过经纬度计算两点之间距离的常用公式如下: 设点 A 的纬度为 $lat_A$,经度为 $lon_A$,点 B 的纬度为 $lat_B$,经度为 $lon_B$,则两点之间的距离 $d$ 为: $d ...

  8. php根据经纬度计算两点之间的距离

    之前我们已经说过了如何根据IP获取当前用户的经纬度,不会获取的小童鞋可以去看一下之前的文章. 这回我们将功能再延伸一下,根据将纬度计算两点之间的距离. 废话不多说,直接上码: function get ...

  9. java 当前类相对路径_JAVA文件中获取该项目的相对路径方法

    1.基本概念的理解 绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如:C:\xyz\test.txt 代表了test.txt文件的绝对路径.http://www ...

最新文章

  1. ETH网络要爆炸,未来Token的最佳选择注定是BCH
  2. 关于私有云与存储风向的深度解读
  3. python教程:apscheduler模块使用教程
  4. Java SpringMVC实现PC端网页微信扫码支付完整版
  5. 【MPS最佳实践】媒体工作流转码
  6. RuoYi-Cloud 部署篇_02(linux环境 mysql+nginx版本)
  7. Java中的堆分配参数总结《对Java的分析总结》(二)
  8. ECMAScript 发展历史
  9. Java中调用FTP服务时inputStream获取一直为null
  10. Android studio for mac
  11. thymeleaf教程
  12. Form的method方法get和post的区别
  13. 全网最全-固定资本存量分省、市、地区、产业-含计算过程
  14. PowerDesigner 报错 Could not Initialize JavaVM!
  15. Milet谷仓:区块链电商先行者
  16. 机器学习(一) 贝叶斯法则与概念学习
  17. Android 酒店客房管理简单小程序
  18. stm8 RTC自动唤醒
  19. 逻辑拓扑与物理拓扑之间的区别
  20. King(差分约束)

热门文章

  1. Axles UVALive 7197
  2. 公链生态周报:BI指数周涨幅超20%,IOST主网账户突破30万 | 链塔智库
  3. Bootstrap系列之文本(Text)
  4. oppor9s计算机屏幕颜色,OPPO R9
  5. webpack的热重载/热更新HMR是如何实现的
  6. S27赛季即将来袭 教你用Java做游戏王者荣耀
  7. int,long int,short int所占字节
  8. 室内田园设计手法要灵活多变
  9. 创立于使用指南的谷歌云GPU服务器
  10. 定制Python计时器的类