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

相关文章
|
4月前
|
SQL 存储 Java
java流式计算Stream
java流式计算Stream
29 0
|
4月前
|
Java
承压计算 Java
承压计算 Java
29 1
|
2月前
|
搜索推荐 Java 大数据
Java中的数据流处理与流式计算实现
Java中的数据流处理与流式计算实现
|
2月前
|
并行计算 Java 大数据
Java中的高效并行计算与多线程编程技术
Java中的高效并行计算与多线程编程技术
|
3月前
|
Java 测试技术 API
滚雪球学Java(52):一步一步教你使用Java Calendar类进行日期计算
【6月更文挑战第6天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
30 3
滚雪球学Java(52):一步一步教你使用Java Calendar类进行日期计算
|
3月前
|
Java API
探讨Java集合的组内平均值计算
探讨Java集合的组内平均值计算
24 1
|
2月前
|
并行计算 监控 Java
Java中的并行计算与任务分发策略
Java中的并行计算与任务分发策略
|
2月前
|
并行计算 Java 大数据
Java中的高效并行计算与多线程编程技术
Java中的高效并行计算与多线程编程技术
|
3月前
|
XML Java 定位技术
详尽分享经纬坐标(BLH)数据创建.kml文件小工具设计Java版
详尽分享经纬坐标(BLH)数据创建.kml文件小工具设计Java版
35 0
|
3月前
|
Java 容器
中缀表达式计算(java)
中缀表达式计算(java)