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

这篇具有很好参考价值的文章主要介绍了Java:计算地球上两个经纬度坐标之间的距离-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坐标点之间的距离(可用于计算里程等)文章来源地址https://www.toymoban.com/news/detail-785327.html

到了这里,关于Java:计算地球上两个经纬度坐标之间的距离-geodesy和geotools实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 根据经纬度计算两点之间的距离

    前言 在我们平时使用美团,饿了么等app进行订餐,或者使用猫眼进行订电影票的时候,都有一个距离的排序,表明该家店距离我们当前的位置,这种基于地理位置的服务,统一被称为LBS(Location Based Service),而LBS的实现则是借助于GIS,WC(无线通信)等信息技术来实现。而今

    2024年02月05日
    浏览(86)
  • 【 Java-小记录】墨卡托投影坐标转换经纬度方法

     墨卡托坐标转换 此方法转换结果最接近腾讯地图

    2023年04月18日
    浏览(44)
  • 经纬度转换为UTM坐标

    UTM(通用横向墨卡托投影): 是一种以米为单位的坐标系统,用于地图和GPS导航。将地球划分为60个纵向的区域。每个区域宽6度,从赤道开始往南北两级方向划分。每个区域都有一个特定的字母。 将经纬度值转化为弧度值 根据经纬度计算所在的UTM区域 计算UTM带号,即 zone

    2024年02月10日
    浏览(52)
  • JAVA计算两经纬度间的距离

    无需依赖外部jar,可直接计算距离。DistanceUtil.java 可根据精度来判断使用哪种方式(BigDecimal,double)。 在使用时具体保留位数可自行设置。 添加第三方jar包。 直接采用第三方jar包中的工具进行计算。DistanceUtil.java 将其结果放在一起对比,会发现第三方jar,Sphere更精准一些。

    2024年02月14日
    浏览(45)
  • 经纬度坐标为中心点生成米距离长度半径的圆形面,含java js源码+在线绘制,代码简单零依赖

    目录 java版源码 js版源码 在线绘制预览效果 关于计算的精确度 前些时间在更新我的坐标边界查询工具的时候,需要用到经纬度坐标点的距离计算,和以坐标点为中心生成一个指定距离为半径的圆,搜了一下没有找到现成简单又合适的代码,于是把自己压箱底的代码翻出来了

    2024年02月08日
    浏览(51)
  • 【Unity】坐标转换经纬度方法(应用篇)

    解决地图中经纬度坐标转换与unity坐标互转的问题。使用线性变换的方法,理论上可以解决小范围内所有坐标转换的问题。 之前有写过[Unity]坐标转换经纬度方法(原理篇),在实际使用中,由于步骤比较繁琐,基于之前的方法,详细说明使用方法。 案例资源下载地址 绑定脚本

    2024年02月10日
    浏览(38)
  • opendrive-经纬度投影坐标转横轴墨卡托投影坐标

    经纬度投影 xodr文件+proj=latlong,说明需要使用经纬度投影代表x,y xodr文件+proj=tmerc,说明需要使用横轴墨卡托投影(将经纬度投影转为墨卡托投影)代表x,y,z 将经纬度转为墨卡托(UTM)

    2024年01月23日
    浏览(63)
  • 经纬度转换 | 基于Python的经纬度与xy坐标(屏幕坐标)相互转换(可批量),并在平面坐标系上以特定点为坐标原点重新建立坐标系,输出各点新坐标

    用的更多的场景是把 经纬度转化为xy平面坐标 ,因为经纬度是方便我们确定地理位置的,我们可以很容易的从地图数据(可利用高德开放平台)上获取某一个地址它的经纬度,但是我们看到的地图是平面的,所以要利用各种投影把经纬度转换为平面坐标便于我们自己分析~

    2024年02月07日
    浏览(90)
  • 高德百度腾讯之间经纬度的转换

    提示:这里可以添加本文要记录的大概内容: 提示:以下是本篇文章正文内容,下面案例可供参考 百度地图: 高德地图: 腾讯地图 最后转换结果 可知,高德和腾讯使用的编码方式是一样的,所以最后转换的经纬度基本一样

    2024年02月13日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包