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

相关文章
|
1月前
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
57 2
|
1月前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
2月前
|
机器学习/深度学习 算法 搜索推荐
让星星⭐月亮告诉你,Java冒泡排序及其时间复杂度计算
冒泡排序是一种简单的排序算法,通过多次遍历数组,每次比较相邻元素并交换位置,将较小的元素逐步移至数组前端。第一轮结束后,最小值会位于首位;第二轮则将次小值置于第二位,依此类推。经过 (n-1) 轮遍历后,数组完成排序。冒泡排序的时间复杂度为 O(n²),在最优情况下(已排序数组)时间复杂度为 O(n)。示例代码展示了如何实现冒泡排序。
56 1
|
2月前
|
分布式计算 资源调度 Hadoop
Hadoop-10-HDFS集群 Java实现MapReduce WordCount计算 Hadoop序列化 编写Mapper和Reducer和Driver 附带POM 详细代码 图文等内容
Hadoop-10-HDFS集群 Java实现MapReduce WordCount计算 Hadoop序列化 编写Mapper和Reducer和Driver 附带POM 详细代码 图文等内容
104 3
|
1月前
|
Java API Apache
java集合的组内平均值怎么计算
通过本文的介绍,我们了解了在Java中计算集合的组内平均值的几种方法。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。无论是使用传统的循环方法,还是利用Java 8的Stream API,亦或是使用第三方库(如Apache Commons Collections和Guava),都可以有效地计算集合的组内平均值。希望本文对您理解和实现Java中的集合平均值计算有所帮助。
36 0
|
2月前
|
消息中间件 Java Kafka
Flink-04 Flink Java 3分钟上手 FlinkKafkaConsumer消费Kafka数据 进行计算SingleOutputStreamOperatorDataStreamSource
Flink-04 Flink Java 3分钟上手 FlinkKafkaConsumer消费Kafka数据 进行计算SingleOutputStreamOperatorDataStreamSource
54 1
|
4月前
|
Rust JavaScript Java
简单对比Java、Python、Go、Rust等常见语言计算斐波拉契数的性能
简单对比Java、Python、Go、Rust等常见语言计算斐波拉契数的性能
|
5月前
|
搜索推荐 Java 大数据
Java中的数据流处理与流式计算实现
Java中的数据流处理与流式计算实现
|
5月前
|
并行计算 Java 大数据
Java中的高效并行计算与多线程编程技术
Java中的高效并行计算与多线程编程技术
|
6月前
|
Java API
探讨Java集合的组内平均值计算
探讨Java集合的组内平均值计算
50 1