您当前的位置:首页 > 计算机 > 编程开发 > Java

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

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

两个点的经纬度

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