经纬度,表面的含义就是经纬度的平方和,然后开平方。。。一切都没问题。。

但问题不是简单的二维平面,在二维空间中,这样计算是没有问题。。。

但是。。。。。

百度上找了找,大概有三种方式,一个是根据反余弦,一个是根据sin和cosin,第三个是根据提供的一个第三方jar包计算的。。。。

反余弦

具体分析在这里

https://blog.csdn.net/jk940438163/article/details/83147557#commentsedit

package com.zhiliyuchi.web.rest.util;/*** @创建人:Young* @时 间: 2019/3/13* @描 述: TODO*/
public class Test {private static final double EARTH_RADIUS = 6371393; // 平均半径,单位:m;不是赤道半径。赤道为6378左右/*** @描述 反余弦进行计算* @参数  [lat1, lng1, lat2, lng2]* @返回值  double* @创建人  Young* @创建时间  2019/3/13 20:31**/public static double getDistance(Double lat1,Double lng1,Double lat2,Double lng2) {// 经纬度(角度)转弧度。弧度用作参数,以调用Math.cos和Math.sindouble radiansAX = Math.toRadians(lng1); // A经弧度double radiansAY = Math.toRadians(lat1); // A纬弧度double radiansBX = Math.toRadians(lng2); // B经弧度double radiansBY = Math.toRadians(lat2); // 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) {//121.717594,31.12055    121.817629,31.090867double distance = getDistance(31.12055, 121.717594,31.090867, 121.817629);System.out.println("距离" + distance  + "米");}
}

sin/cosin

package com.zhiliyuchi.web.rest.util;/*** @创建人:Young* @时 间: 2019/3/13* @描 述: 高德地图对应经纬度计算距离*/
public class LocationUtils {// 地球赤道半径private static double EARTH_RADIUS = 6378.137;private static double rad(double d) {return d * Math.PI / 180.0;}/*** @描述 经纬度获取距离,单位为米* @参数  [lat1, lng1, lat2, lng2]* @返回值  double* @创建人  Young* @创建时间  2019/3/13 20:33**/public static double getDistance(double lat1, double lng1, double lat2,double lng2) {double radLat1 = rad(lat1);double radLat2 = rad(lat2);double a = radLat1 - radLat2;double b = rad(lng1) - rad(lng2);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;s = Math.round(s * 10000d) / 10000d;s = s * 1000;return s;}public static void main(String[] args) {double distance = getDistance(31.12055, 131.717594,21.090867, 111.817629);System.out.println("距离" + distance + "米");}}

第三方jar包

maven库导包

        <dependency><groupId>org.gavaghan</groupId><artifactId>geodesy</artifactId><version>1.1.3</version></dependency>
package com.zhiliyuchi.web.rest.util;import org.gavaghan.geodesy.Ellipsoid;
import org.gavaghan.geodesy.GeodeticCalculator;
import org.gavaghan.geodesy.GeodeticCurve;
import org.gavaghan.geodesy.GlobalCoordinates;/*** @创建人:Young* @时 间: 2019/3/13* @描 述: TODO*/
public class test0 {public static void main(String[] args){// //121.717594,31.12055    121.817629,31.090867GlobalCoordinates source = new GlobalCoordinates(31.12055, 121.717594);GlobalCoordinates target = new GlobalCoordinates(31.090867, 121.817629);double meter1 = getDistanceMeter(source, target, Ellipsoid.Sphere);double meter2 = getDistanceMeter(source, target, Ellipsoid.WGS84);System.out.println("Sphere坐标系计算结果:"+meter1 + "米");System.out.println("WGS84坐标系计算结果:"+meter2 + "米");}public static double getDistanceMeter(GlobalCoordinates gpsFrom, GlobalCoordinates gpsTo, Ellipsoid ellipsoid){//创建GeodeticCalculator,调用计算方法,传入坐标系、经纬度用于计算距离GeodeticCurve geoCurve = new GeodeticCalculator().calculateGeodeticCurve(ellipsoid, gpsFrom, gpsTo);return geoCurve.getEllipsoidalDistance();}
}

进入jar中的源码

{double a = ellipsoid.getSemiMajorAxis();double b = ellipsoid.getSemiMinorAxis();double f = ellipsoid.getFlattening();double phi1 = Angle.toRadians(start.getLatitude());double lambda1 = Angle.toRadians(start.getLongitude());double phi2 = Angle.toRadians(end.getLatitude());double lambda2 = Angle.toRadians(end.getLongitude());double a2 = a * a;double b2 = b * b;double a2b2b2 = (a2 - b2) / b2;double omega = lambda2 - lambda1;double tanphi1 = Math.tan(phi1);double tanU1 = (1.0D - f) * tanphi1;double U1 = Math.atan(tanU1);double sinU1 = Math.sin(U1);double cosU1 = Math.cos(U1);double tanphi2 = Math.tan(phi2);double tanU2 = (1.0D - f) * tanphi2;double U2 = Math.atan(tanU2);double sinU2 = Math.sin(U2);double cosU2 = Math.cos(U2);double sinU1sinU2 = sinU1 * sinU2;double cosU1sinU2 = cosU1 * sinU2;double sinU1cosU2 = sinU1 * cosU2;double cosU1cosU2 = cosU1 * cosU2;double lambda = omega;double A = 0.0D;double B = 0.0D;double sigma = 0.0D;double deltasigma = 0.0D;boolean converged = false;for(int s = 0; s < 20; ++s) {double lambda0 = lambda;double sinlambda = Math.sin(lambda);double coslambda = Math.cos(lambda);double sin2sigma = cosU2 * sinlambda * cosU2 * sinlambda + (cosU1sinU2 - sinU1cosU2 * coslambda) * (cosU1sinU2 - sinU1cosU2 * coslambda);double sinsigma = Math.sqrt(sin2sigma);double cossigma = sinU1sinU2 + cosU1cosU2 * coslambda;sigma = Math.atan2(sinsigma, cossigma);double sinalpha = sin2sigma == 0.0D?0.0D:cosU1cosU2 * sinlambda / sinsigma;double alpha = Math.asin(sinalpha);double cosalpha = Math.cos(alpha);double cos2alpha = cosalpha * cosalpha;double cos2sigmam = cos2alpha == 0.0D?0.0D:cossigma - 2.0D * sinU1sinU2 / cos2alpha;double u2 = cos2alpha * a2b2b2;double cos2sigmam2 = cos2sigmam * cos2sigmam;A = 1.0D + u2 / 16384.0D * (4096.0D + u2 * (-768.0D + u2 * (320.0D - 175.0D * u2)));B = u2 / 1024.0D * (256.0D + u2 * (-128.0D + u2 * (74.0D - 47.0D * u2)));deltasigma = B * sinsigma * (cos2sigmam + B / 4.0D * (cossigma * (-1.0D + 2.0D * cos2sigmam2) - B / 6.0D * cos2sigmam * (-3.0D + 4.0D * sin2sigma) * (-3.0D + 4.0D * cos2sigmam2)));double C = f / 16.0D * cos2alpha * (4.0D + f * (4.0D - 3.0D * cos2alpha));lambda = omega + (1.0D - C) * f * sinalpha * (sigma + C * sinsigma * (cos2sigmam + C * cossigma * (-1.0D + 2.0D * cos2sigmam2)));double change = Math.abs((lambda - lambda0) / lambda);if(s > 1 && change < 1.0E-13D) {converged = true;break;}}double var96 = b * A * (sigma - deltasigma);double alpha1;double alpha2;if(!converged) {if(phi1 > phi2) {alpha1 = 180.0D;alpha2 = 0.0D;} else if(phi1 < phi2) {alpha1 = 0.0D;alpha2 = 180.0D;} else {alpha1 = 0.0D / 0.0;alpha2 = 0.0D / 0.0;}} else {double radians = Math.atan2(cosU2 * Math.sin(lambda), cosU1sinU2 - sinU1cosU2 * Math.cos(lambda));if(radians < 0.0D) {radians += 6.283185307179586D;}alpha1 = Angle.toDegrees(radians);radians = Math.atan2(cosU1 * Math.sin(lambda), -sinU1cosU2 + cosU1sinU2 * Math.cos(lambda)) + 3.141592653589793D;if(radians < 0.0D) {radians += 6.283185307179586D;}alpha2 = Angle.toDegrees(radians);}if(alpha1 >= 360.0D) {alpha1 -= 360.0D;}if(alpha2 >= 360.0D) {alpha2 -= 360.0D;}return new GeodeticCurve(var96, alpha1, alpha2);}

大同小异。。但是好像地球半径给的是

有点儿疑惑了。。。各需所求吧。。。

TIPS:

有一点,数据中地球的半径的值直接导致了后面计算的差异,所以,是取赤道,取平均,还是精确到指定的经纬度,酌情考虑。。。。

java 根据经纬度计算实际距离相关推荐

  1. JAVA根据经纬度计算两点距离

    Google private static final double EARTH_RADIUS = 6378137;//赤道半径 private static double rad(double d) ...

  2. APP Inventor中如何利用GPS经纬度计算GPS距离、速度、方向

         最近有空时研究了一下MIT APP InVentor,这是一个原来google验室的项目,目的是为了给Andriod APP的开发者提供一种简便快捷的开发模式,但后来该项目被停止,2012年 ...

  3. vue中引用高德地图根据经纬度计算两地距离

    vue中引用高德地图根据经纬度计算两地距离 一.示例图: npm安装 npm install vue-amap --save 在min.js文件中引入vue-amap import VueAMap f ...

  4. 根据经纬度计算两地距离

    最近工作需要,网上搜索了下根据经纬度计算两地距离的方法,发现要么是几何法,画图.作一堆辅助线,然后证明推理,要么二话不说直接套公式.这篇文章介绍一种容易理解的方式来求这个距离. 0b00 思路 地球是 ...

  5. js根据经纬度计算两点距离

    js根据经纬度计算两点距离 1.html <button type="button" οnclick="distanceByLnglat(116.95400,39. ...

  6. 百度地图根据经纬度计算距离php,详解js根据百度地图提供经纬度计算两点距离...

    正常在使用百度地图时,我们可以通过BMap的实例对象提供的方法计算距离: var map = new BMap.Map('map_canvas'); map.getDistance(point1 ,p ...

  7. mySQL函数根据经纬度计算两点距离

    mysql根据经纬度计算两点距离 定义自定义函数 DROP FUNCTION IF EXISTS func_calcDistance ; CREATE FUNCTION func_calcDistan ...

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

    Java实现 public final class DistanceUtils {/*** 地球半径,单位 km*/private static final double EARTH_RADIUS = ...

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

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

最新文章

  1. (转载)封装bilibili播放器,自定义边下边播和缓存功能
  2. JVM内存相关的核心参数?
  3. Google论文解读:轻量化卷积神经网络MobileNetV2 | PaperDaily #38
  4. 算法竞赛入门经典(第二版) | 例题5-1 大理石在哪 (普适查找)(UVa10474,Where is the Marble?)
  5. mysql数据库的分离_数据库分离和附加 (SQL Server)
  6. 最幸福的码农在用什么编程语言?
  7. 归并排序概念及其实现
  8. python程序设计搜题软件下载_智慧职教云课堂APPPython程序设计答案搜题公众号
  9. apollo权限管理
  10. 谁说数据分析很难?看完这7大分析套路后,还学不会的来找我
  11. 美团在ACL2021上提出基于对比学习的文本表示模型,效果提升8%
  12. 再谈mysql之执行计划explain
  13. mybatis报错:Could not find resource com/**/dao/Mapper.xml
  14. 你的领英账号总被封?实战总结避免和解决领英帐号被封的最强攻略
  15. Python程序员难招人?月入30K程序员告诉你答案
  16. 黑马程序员学习笔记-------c++提高编程
  17. 笔记本gtx1650最好用驱动_Intel EVO平台认证有啥用?只看真实性能 闭着眼买笔记本都不会错-Intel,EVO,笔记本,认证 ——快科技(驱动之家旗下媒体)-...
  18. 33V瞬变抑制二极管型号,怎么选型选用?
  19. 硬盘 测试软件 临界值,怕文件丢失?你该如何检测硬盘寿命状态呢?
  20. SpringBoot+vue邮箱登录(附带多种效验)

热门文章

  1. Chapte 3 Understanding Cloud Computing
  2. 特征挖掘(二):连续特征离散化方法
  3. rm -rfi 防止误删除数据
  4. java毕业设计陕菜食谱网站源码+lw文档+mybatis+系统+mysql数据库+调试
  5. COC建筑拖动的实现
  6. python中的truncate()神坑
  7. 郭台铭执念夏普,富士康转型梦福兮祸兮?
  8. C#NPOI 往excel里面追加一行或者一个Datatable
  9. Xcode 修改Copyright的组织信息
  10. 面向对象:面向对象程序设计