前言

之前做过的很多项目中都有涉及到根据经纬度计算两点之间的距离,然后做排序。这个场景在很多外卖App或者小程序上经常看到,例如距离2km,<100m等等。

工具类1

public class LocationUtil {/*** 地球半径,单位 km*/private static final double EARTH_RADIUS = 6371;private LocationUtil() {}/*** 根据经纬度,计算两点间的距离** @param longitude1 第一个点的经度* @param latitude1  第一个点的纬度* @param longitude2 第二个点的经度* @param latitude2  第二个点的纬度* @return 返回距离 单位米*/public static int getDistance(double longitude1, double latitude1, double longitude2, double latitude2) {// 纬度double lat1 = Math.toRadians(latitude1);double lat2 = Math.toRadians(latitude2);// 经度double lng1 = Math.toRadians(longitude1);double lng2 = Math.toRadians(longitude2);// 纬度之差double a = lat1 - lat2;// 经度之差double b = lng1 - lng2;// 计算两点距离的公式double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(b / 2), 2)));// 弧长乘地球半径, 返回单位: 千米s = s * EARTH_RADIUS;//转成米return (int) Math.round(s * 1000);}public static void main(String[] args) {int d = getDistance(116.353454, 39.996059, 116.308479, 39.983171);System.out.println(d);}

注意:最后计算的s返回的是km(千米),项目需要可以x1000转成了m,需要转成km可以在业务代码中自己做处理或者交给前端同学去处理均可。

工具类2

public class DistanceUtil {private static final double EARTH_RADIUS = 6371;private static final String LESS = "<";private static final String M = "m";private static final String KM = "km";private static final int ONE_HUNDRED = 100;private static final int THOUSAND_AND_ONE_HUNDRED = 1100;private static final int ONE_THOUSAND = 1000;private static final BigDecimal BIG_DECIMAL_THOUSAND = new BigDecimal(1000);public static final String DISTANCE_DEFAULT_STR = "—";/*** @param lat1 当前纬度* @param lon1 当前经度* @param lat2 目标纬度* @param lon2 目标经度* @return*/public static double distance(double lat1, double lon1, double lat2, double lon2) {lat1 = convertDegreesToRadians(lat1);lon1 = convertDegreesToRadians(lon1);lat2 = convertDegreesToRadians(lat2);lon2 = convertDegreesToRadians(lon2);double vLat = Math.abs(lat1 - lat2);double vLon = Math.abs(lon1 - lon2);double h = haverSin(vLat) + Math.cos(lat1) * Math.cos(lat2) * haverSin(vLon);return Math.round(2 * EARTH_RADIUS * Math.asin(Math.sqrt(h)) * 1000);}private static double haverSin(double theta) {double v = Math.sin(theta / 2);return v * v;}private static double convertDegreesToRadians(double degrees) {return degrees * Math.PI / 180;}/*** 格式化距离* @param distance* @return*/public static String formatDistance(double distance) {String distanceStr = DISTANCE_DEFAULT_STR;if (ObjectUtil.isNull(distance) || distance <= -1) {return distanceStr;}if (distance < ONE_HUNDRED) {distanceStr = LESS + ONE_HUNDRED + M;} else if (distance >= ONE_HUNDRED && distance < ONE_THOUSAND) {distanceStr = new BigDecimal(distance).setScale(0, BigDecimal.ROUND_DOWN).toString();distanceStr = distanceStr + M;} else if (distance >= ONE_THOUSAND) {distanceStr = new BigDecimal(distance).divide(BIG_DECIMAL_THOUSAND).setScale(1, BigDecimal.ROUND_DOWN).toString();distanceStr = distanceStr + KM;}return distanceStr;}
}

注意:这和第一种的计算方式其实是一样的,只是用的形式不一样,可以自定义格式化一些前端需要的数据格式。

Demo

private List<AddressInfoModel> buildResultList(AddressListParam param, List<QrorderingCustomerAddressDO> list) {Float longitude = null;Float latitude = null;this.fillParam(param, longitude, latitude);List<AddressInfoModel> resultList = Lists.newArrayList();AddressInfoModel addressInfoModel;for (QrorderingCustomerAddressDO addressDO : list) {addressInfoModel = FsBeanUtil.map(addressDO, AddressInfoModel.class);int distance = LocationUtil.getDistance(Double.valueOf(longitude), Double.valueOf(latitude), Double.valueOf(addressDO.getLongitude()), Double.valueOf(addressDO.getLatitude()));addressInfoModel.setDistance(distance);if (distance > param.getDeliveryArea()) {addressInfoModel.setDistributionScope(CommonConstant.CONSTANT_ONE);} else {addressInfoModel.setDistributionScope(CommonConstant.CONSTANT_TWO);}resultList.add(addressInfoModel);}//按照距离降序排序resultList.sort(Comparator.comparingInt(o -> o.getDistance()));return resultList;}

根据经纬度计算地球两点之间的距离相关推荐

  1. 如何通过经纬度粗略计算地球两点之间的距离?直接上代码

    通过两点的经纬度,就可以知道两点之间大致的夹角是多少度(相对地心来说).这个可以通过三角函数大致求得,当然这样求出来的角度不是很准,但足够用了. 可以通过下列式子计算两点之间的夹角.x1,y1为第一个 ...

  2. 计算地球表面两点之间的距离

    若知道地球表面两点之间的经纬度,那么便可以计算两点之间的实际距离,其数学公式推导可参考:     https://download.csdn.net/download/niu_88/10759266 ...

  3. 用计算python两点之间的距离math_自学生信Python(第二天)|计算出两点之间的距离...

    计算出两点之间的距离 日常旁白:本人是一枚生物学的学生,由于对生物信息学特别感兴趣,于是想自学生物信息学(新手莫怪).了解到生物信息学要有编程基础,尤其是要会一门编程语言,例如:R语言.Python. ...

  4. 如果知道两点的经纬度 如何算两点之间的距离

    同纬度不同经度 (赤道除外) h X 111 X COSD=G (h=两地经度差 D=当地的地理纬度 G=实际距离) 跨纬度的需要构造个三角 比如说AB两点不同经纬度(A经B纬) 那就先算出与A点共线 ...

  5. C++第一次实验-求两点之间的距离

    一.问题及代码 /* 文件名称:Test4.cpp * 作 者:胡嘉威 * 完成日期: 2017 年 2 月 28 日 * 版 本 号:v1.0 * 对任务及求解方法的描述部分:输入两个点的坐标,求两 ...

  6. 根据经纬度计算地球上两点之间的距离——Haversine公式介绍及计算步骤

    目录 摘要 1.半正矢公式(Haversine Formula)介绍 2.半正矢公式应用 3.半正矢公式计算 3.1 主要思路 3.2 计算步骤 3.2.1 平面向量计算方法 3.2.2 空间向量计算 ...

  7. 给定经纬度计算距离_根据经纬度计算地球上两点之间的距离js实现代码

    利用JS实现的根据经纬度计算地球上两点之间的距离 最近用到了根据经纬度计算地球表面两点间距离的公式,然后就用JS实现了一下. 计算地球表面两点间的距离大概有两种办法. 第一种是默认地球是一个光滑的球面 ...

  8. php 计算两点时间距离,PHP计算地球上两点之间的距离(示例详解)

    给定经度和纬度,求地球上两点之间的距离.首先我们需要了解该问题的解决思路,然后再用PHP代码来实现计算. 此问题可以用半正矢(haversine)公式求解: 大圆距离或正交距离是球面(或地球表面)上两 ...

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

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

最新文章

  1. CxImage类库的简介
  2. 把view或者div绘制 canvas ,导出图片功能实现完整源码附效果图(兼容H5和小程序)
  3. 无限循环的ViewPager
  4. sql如何遍历几百万的表_Oracle PL/SQL调优技巧分享
  5. 大神推荐:国内较强的NLP高校实验室有哪些?
  6. DCMTK:DSRTree和DSRTreeNodeCursor类的测试程序
  7. csv文件用excel打开有多行是空的,用sublime打开空白行没有''处理方案
  8. maven零基础从配置到运行helloworld(java maven helloworld)
  9. 如何在JUnit 5中替换规则
  10. C++成员函数重载、覆盖和隐藏的区别
  11. jdk1.8新特性_Lambda表达式的引入
  12. (转载)构建public APIs与CORS
  13. python压缩数据数组长度_python – 如何解压缩字节数组中的gzipped数据?
  14. Windows10下VB6.0开发——写入数据到文件操作
  15. StandardWrapper
  16. CRT链接ubuntu报错The remote system refused the connection
  17. 一个通用的pytorch使用预训练模型训练本地数据代码--resnet101为例
  18. jsp登录注册页面代码
  19. 程序员为了讨好大舅子,竟自学自动化编程
  20. PPT文件太大怎么办?如何压缩PPT?这几招帮你搞定

热门文章

  1. 阿里巴巴面试题目总结
  2. bugku web题 33-40 wp
  3. c语言scanf输入后没反应,c语言scanf无法输入值
  4. 微信小程序接口安全优化(AES加密)
  5. 共指消解/指代消解/Coreference Resolution中概念/术语的总结
  6. 复试加分政策!准备好这些还有机会逆袭!
  7. ecu故障现象_发动机不能启动的原因和故障排除方法
  8. ASEMI整流桥KBPC3510W参数特性,KBPC3510W封装尺寸
  9. Flutter(二十一)——dio库
  10. 一款成功的全球服游戏该如何进行架构选型与设计?