Java:计算地球上两个经纬度坐标之间的距离-geodesy和geotools实现

简介: Java:计算地球上两个经纬度坐标之间的距离-geodesy和geotools实现

目录

方式一:自定义公式计算

方式二:geodesy计算距离

方式三:geotools计算距离

两个点的经纬度


latitude纬度 longitude经度 地点

22.678611 113.805695 深圳同泰万怡酒店

22.716473 113.826391 深圳宝安中天美景华美达酒店

各种计算方式


计算方式 距离

Elasticsearch:7.12.1 4715.088099751495

自定义公式计算 4720.367727793572

org.gavaghan/geodesy 4715.085736444097

org.geotools/gt-referencing 4701.260219872655

方式一:自定义公式计算

package com.example.demo.util;


public class GeoUtil {

   /**

    * 地球半径,单位m

    */

   private static final double EARTH_RADIUS = 6378137;


   /**

    * 根据经纬度,计算两点间的距离

    *

    * @param longitude1 第一个点的经度

    * @param latitude1  第一个点的纬度

    * @param longitude2 第二个点的经度

    * @param latitude2  第二个点的纬度

    * @return 返回距离,单位m

    */

   public static double 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)));

       // 弧长乘地球半径, 返回单位: 米

       return s * EARTH_RADIUS;

   }


   public static void main(String[] args) {

       double distance = GeoUtil.getDistance(113.805695, 22.678611, 113.826391, 22.716473);

       System.out.println(distance);

       // 4720.367727793572

   }

}




方式二:geodesy计算距离

依赖


<!--用于计算两点之间的距离-->

<dependency>

   <groupId>org.gavaghan</groupId>

   <artifactId>geodesy</artifactId>

   <version>1.1.3</version>

</dependency>


示例


package com.example.demo;


import org.gavaghan.geodesy.Ellipsoid;

import org.gavaghan.geodesy.GeodeticCalculator;

import org.gavaghan.geodesy.GeodeticCurve;

import org.gavaghan.geodesy.GlobalCoordinates;

import org.junit.jupiter.api.Test;


public class GeoTest {


   @Test

   public void testGetDistance3() {

       //创建GeodeticCalculator,调用计算方法,传入坐标系、经纬度用于计算距离

       GeodeticCurve geoCurve = new GeodeticCalculator().calculateGeodeticCurve(

               Ellipsoid.Sphere,

               new GlobalCoordinates(22.678611, 113.805695),

               new GlobalCoordinates(22.716473, 113.826391)

       );


       System.out.println(geoCurve.getEllipsoidalDistance());

       // WGS84 4701.260219874908

       // Sphere 4715.085736444097

   }

}




参考

计算两个坐标经纬度之间的距离(5种方式)


方式三:geotools计算距离

文档


https://geotools.org/

依赖


<repositories>

   <repository>

       <id>osgeo</id>

       <name>OSGeo Release Repository</name>

       <url>https://repo.osgeo.org/repository/release/</url>

       <snapshots><enabled>false</enabled></snapshots>

       <releases><enabled>true</enabled></releases>

   </repository>

   <repository>

       <id>osgeo-snapshot</id>

       <name>OSGeo Snapshot Repository</name>

       <url>https://repo.osgeo.org/repository/snapshot/</url>

       <snapshots><enabled>true</enabled></snapshots>

       <releases><enabled>false</enabled></releases>

   </repository>

</repositories>


<dependencies>

   <dependency>

       <groupId>org.geotools</groupId>

       <artifactId>gt-referencing</artifactId>

       <version>27.2</version>

   </dependency>

</dependencies>




注意:geotools不在central中央仓库,需要配置下载源


如果配置了镜像 ~/.m2/settings.xml,不能设置为*


<mirrors>

   <mirror>

       <id>aliyunmaven</id>

       <mirrorOf>central</mirrorOf>

       <name>阿里云公共仓库</name>

       <url>https://maven.aliyun.com/repository/public</url>

   </mirror>

</mirrors>


代码示例


package com.example.demo.util;


import org.geotools.referencing.GeodeticCalculator;

import org.geotools.referencing.crs.DefaultGeographicCRS;


public class DemoUtil {


   public static double getDistance(double longitude1, double latitude1, double longitude2, double latitude2) {

       // 84坐标系构造GeodeticCalculator

       GeodeticCalculator geodeticCalculator = new GeodeticCalculator(DefaultGeographicCRS.WGS84);

       // 起点经纬度

       geodeticCalculator.setStartingGeographicPoint(longitude1, latitude1);

       // 末点经纬度

       geodeticCalculator.setDestinationGeographicPoint(longitude2, latitude2);

       // 计算距离,单位:米

       return geodeticCalculator.getOrthodromicDistance();

   }


   public static void main(String[] args) {

       double distance = DemoUtil.getDistance(113.805695, 22.678611, 113.826391, 22.716473);

       System.out.println(distance);

       // 4701.260219872655

   }

}


参考

GeoTools依赖使用Maven下载失败解决办法记录

Java计算两个GPS坐标点之间的距离(可用于计算里程等)

————————————————

版权声明:本文为CSDN博主「彭世瑜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/mouday/article/details/130674646

相关文章
|
2月前
|
Java
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
29 0
|
2月前
|
存储 Java
Java:编写程序,计算两个数的和、差、积、商和余数。docx
Java:编写程序,计算两个数的和、差、积、商和余数。docx
|
2月前
|
算法 Java
算法:Java计算二叉树从根节点到叶子结点的最大路径和
算法:Java计算二叉树从根节点到叶子结点的最大路径和
|
2月前
|
存储 Java
Java 编程实例:相加数字、计算单词数、字符串反转、元素求和、矩形面积及奇偶判断
Java中相加两个数字可通过简单赋值实现,如`int sum = x + y;`。若要用户输入数字相加,可使用`Scanner`类读取。计算单词数,可使用`split()`方法或`StringTokenizer`类。反转字符串,可用`for`循环或`StringBuilder`的`reverse()`方法。计算数组元素总和,可遍历数组累加。矩形面积通过长度乘以宽度得出。判断奇偶性,利用模2运算或位运算检查最低位。更多内容,可关注微信公众号`Let us Coding`。
50 0
|
6月前
|
Java 云计算
阿里云国际站代理商:Java计算当前时间处于某段时间内的第几周、第几个月
@luotuoemo飞机@TG阿里云国际站代理商:Java计算当前时间处于某段时间内的第几周、第几个月,以上就是使用Java代码计算当前时间处于某段时间内的第几周和第几个月的全部内容。通过该篇文章,我们可以了解到如何使用Java的Calendar类以及日期函数来计算时间段内的周数和月数,掌握相应的计算方法和实践技巧。在开发过程中,合理运用这些方法,可以方便地获取时间相关的信息,满足业务需求,提高开发效率。希望本文能对读者在使用阿里云国际站代理商开发Java应用时计算时间段的周数和月数提供一些帮助与启示。
|
11天前
|
安全 Java
【亮剑】Java中的`Future`接口代表异步计算结果,常与`ExecutorService`配合启动任务并获取结果
【4月更文挑战第30天】Java中的`Future`接口代表异步计算结果,常与`ExecutorService`配合启动任务并获取结果。`Future`接口提供`isDone()`、`get()`、`get(timeout, unit)`和`cancel(mayInterruptIfRunning)`等方法。`FutureTask`是`Future`的实现类,可作为`Runnable`执行并返回结果。
|
1月前
|
Java
JAVA输入任意一个数字,实现递减求和(计算任意整数n的和)
JAVA输入任意一个数字,实现递减求和(计算任意整数n的和)
17 0
|
6月前
|
SQL 存储 Java
如何使用 Java 设计一个简单的成绩计算程序
如何使用 Java 设计一个简单的成绩计算程序
|
2月前
|
Java
Java计算每个月的天数
Java计算每个月的天数
|
2月前
|
机器学习/深度学习 算法 Java
Java计算阶乘递归函数的实现
Java计算阶乘递归函数的实现