根据经纬度计算地球两点之间的距离
前言
之前做过的很多项目中都有涉及到根据经纬度计算两点之间的距离,然后做排序。这个场景在很多外卖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;}
根据经纬度计算地球两点之间的距离相关推荐
- 如何通过经纬度粗略计算地球两点之间的距离?直接上代码
通过两点的经纬度,就可以知道两点之间大致的夹角是多少度(相对地心来说).这个可以通过三角函数大致求得,当然这样求出来的角度不是很准,但足够用了. 可以通过下列式子计算两点之间的夹角.x1,y1为第一个 ...
- 计算地球表面两点之间的距离
若知道地球表面两点之间的经纬度,那么便可以计算两点之间的实际距离,其数学公式推导可参考: https://download.csdn.net/download/niu_88/10759266 ...
- 用计算python两点之间的距离math_自学生信Python(第二天)|计算出两点之间的距离...
计算出两点之间的距离 日常旁白:本人是一枚生物学的学生,由于对生物信息学特别感兴趣,于是想自学生物信息学(新手莫怪).了解到生物信息学要有编程基础,尤其是要会一门编程语言,例如:R语言.Python. ...
- 如果知道两点的经纬度 如何算两点之间的距离
同纬度不同经度 (赤道除外) h X 111 X COSD=G (h=两地经度差 D=当地的地理纬度 G=实际距离) 跨纬度的需要构造个三角 比如说AB两点不同经纬度(A经B纬) 那就先算出与A点共线 ...
- C++第一次实验-求两点之间的距离
一.问题及代码 /* 文件名称:Test4.cpp * 作 者:胡嘉威 * 完成日期: 2017 年 2 月 28 日 * 版 本 号:v1.0 * 对任务及求解方法的描述部分:输入两个点的坐标,求两 ...
- 根据经纬度计算地球上两点之间的距离——Haversine公式介绍及计算步骤
目录 摘要 1.半正矢公式(Haversine Formula)介绍 2.半正矢公式应用 3.半正矢公式计算 3.1 主要思路 3.2 计算步骤 3.2.1 平面向量计算方法 3.2.2 空间向量计算 ...
- 给定经纬度计算距离_根据经纬度计算地球上两点之间的距离js实现代码
利用JS实现的根据经纬度计算地球上两点之间的距离 最近用到了根据经纬度计算地球表面两点间距离的公式,然后就用JS实现了一下. 计算地球表面两点间的距离大概有两种办法. 第一种是默认地球是一个光滑的球面 ...
- php 计算两点时间距离,PHP计算地球上两点之间的距离(示例详解)
给定经度和纬度,求地球上两点之间的距离.首先我们需要了解该问题的解决思路,然后再用PHP代码来实现计算. 此问题可以用半正矢(haversine)公式求解: 大圆距离或正交距离是球面(或地球表面)上两 ...
- php 如何根据经纬度计算距离,小程序实例:如何根据经纬度计算两点之间的距离(代码)...
本篇文章给大家带来的内容是关于小程序实例:如何根据经纬度计算两点之间的距离(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助.//计算两点位置距离 getDistance: fun ...
最新文章
- CxImage类库的简介
- 把view或者div绘制 canvas ,导出图片功能实现完整源码附效果图(兼容H5和小程序)
- 无限循环的ViewPager
- sql如何遍历几百万的表_Oracle PL/SQL调优技巧分享
- 大神推荐:国内较强的NLP高校实验室有哪些?
- DCMTK:DSRTree和DSRTreeNodeCursor类的测试程序
- csv文件用excel打开有多行是空的,用sublime打开空白行没有''处理方案
- maven零基础从配置到运行helloworld(java maven helloworld)
- 如何在JUnit 5中替换规则
- C++成员函数重载、覆盖和隐藏的区别
- jdk1.8新特性_Lambda表达式的引入
- (转载)构建public APIs与CORS
- python压缩数据数组长度_python – 如何解压缩字节数组中的gzipped数据?
- Windows10下VB6.0开发——写入数据到文件操作
- StandardWrapper
- CRT链接ubuntu报错The remote system refused the connection
- 一个通用的pytorch使用预训练模型训练本地数据代码--resnet101为例
- jsp登录注册页面代码
- 程序员为了讨好大舅子,竟自学自动化编程
- PPT文件太大怎么办?如何压缩PPT?这几招帮你搞定