2025年3月25日 星期二 甲辰(龙)年 月廿四 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Java

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

时间:05-24来源:作者:点击数:20

两个点的经纬度

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计算距离

文档

依赖

  • <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
  • }
  • }
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门