已知多个坐标点 ,计算距离中心坐标点最近点的距离

发布时间:2024年01月11日
Maven坐标
        <!--用于计算两点之间的距离-->
        <dependency>
            <groupId>org.gavaghan</groupId>
            <artifactId>geodesy</artifactId>
            <version>1.1.3</version>
        </dependency>

坐标实体
@Data
public class GeoPoint {

    private double latitude;
    private double longitude;

    public GeoPoint(double latitude, double longitude) {
        this.latitude = latitude;
        this.longitude = longitude;
    }
}
工具类

import org.gavaghan.geodesy.Ellipsoid;
import org.gavaghan.geodesy.GeodeticCalculator;
import org.gavaghan.geodesy.GeodeticCurve;
import org.gavaghan.geodesy.GlobalCoordinates;
/**
 * @author : Cookie
 * date : 2024/1/11
 */
public class GeoUtils {
    /**
     * 计算两个经纬度之间的距离
     *
     * @param geoPoint1 第一个经纬度
     * @param geoPoint2 第二个经纬度
     * @return 返回的距离,单位m
     */
    public static double getDistanceMeter(GeoPoint geoPoint1, GeoPoint geoPoint2) {
        GlobalCoordinates gpsFrom = new GlobalCoordinates(geoPoint1.getLongitude(), geoPoint1.getLatitude());
        GlobalCoordinates gpsTo = new GlobalCoordinates(geoPoint2.getLongitude(), geoPoint2.getLatitude());

        GeodeticCurve geoCurve = new GeodeticCalculator().calculateGeodeticCurve(Ellipsoid.WGS84, gpsFrom, gpsTo);
        return geoCurve.getEllipsoidalDistance();
    }

    /**
     * 获取距离中心点最近的点
     *
     * @param center 中心点
     * @param points 所有点
     * @return 距离中心点最近的点
     */
    public static GeoPoint getNearestPointToCenter(GeoPoint center, GeoPoint[] points) {

        // 定义最小距离
        double minDistance = Double.MAX_VALUE;
        // 定义最近的点
        GeoPoint nearestPoint = null;
        // 遍历所有点
        for (GeoPoint point : points) {
            // 计算距离
            double distance = GeoUtils.getDistanceMeter(center, point);
            // 如果距离小于最小距离
            if (distance < minDistance) {
                // 更新最小距离和最近的点
                minDistance = distance;
                nearestPoint = point;
            }
        }
        // 返回最近的点
        return nearestPoint;
    }

    /**
     * 获取中心点
     *
     * @param points 所有点
     * @return 中心点
     */
    public static GeoPoint getCenterPoint(GeoPoint[] points) {
        // 计算中心点的纬度
        double latitude = 0;
        for (GeoPoint point : points) {
            latitude += point.getLatitude();
        }
        latitude /= points.length;

        // 计算中心点的经度
        double longitude = 0;
        for (GeoPoint point : points) {
            longitude += point.getLongitude();
        }
        longitude /= points.length;

        // 返回中心点
        return new GeoPoint(latitude, longitude);
    }

}
测试
    public static void main(String[] args) {
        GeoPoint[] points = new GeoPoint[]{
                new GeoPoint(39.939123, 116.395645),
                new GeoPoint(39.929456, 116.393645),
                new GeoPoint(39.959789, 116.397645)};
        // 计算中心点
        GeoPoint center = getCenterPoint(points);
        System.out.println(center);
        // 计算距离中心点最近的点
        GeoPoint nearestPoint = getNearestPointToCenter(center, points);
        System.out.println(nearestPoint);
        // 计算距离 单位m
        double distance = getDistanceMeter(center, nearestPoint);
        System.out.println(distance);
    }
文章来源:https://blog.csdn.net/qq_47910339/article/details/135519053
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。