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

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);
    }
  • 16
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
坐标转换问题 坐标转换问题的详细了解对于测量很重要,那么请和我一起来讨论这个问题。 首先,我们要弄清楚几种坐标表示方法。大致有三种坐标表示方法:经纬度和高程,空间直角坐标,平面坐标和高程。 我们通常说的WGS-84坐标是经纬度和高程这一种,北京54坐标是平面坐标和高程着一种。 现在,再搞清楚转换的严密性问题,在同一个椭球里的转换都是严密的,而在不同的椭球之间的转换这时不严密的。举个例子,在WGS-84坐标和北京54坐标之间是不存在一套转换参数可以全国通用的,在每个地方会不一样,因为它们是两个不同的椭球基准。 那么,两个椭球间的坐标转换应该是怎样的呢?一般而言比较严密的是用七参数法,即X平移,Y平移,Z平移,X旋转,Y旋转,Z旋转,尺度变化K。要求得七参数就需要在一个地区需要3个以上的已点,如果区域范围不大,最远点间的距离不大于30Km(经验值),这可以用三参数,即X平移,Y平移,Z平移,而将X旋转,Y旋转,Z旋转,尺度变化K视为0,所以三参数只是七参数的一种特例。在本软件中提供了计算三参数、七参数的功能。 在一个椭球的不同坐标系中转换需要用到四参数转换,举个例子,在深圳既有北京54坐标又有深圳坐标,在这两种坐标之间转换就用到四参数,计算四参数需要两个已点。本软件提供计算四参数的功能。 现在举个例子说明:在珠江有一个测区,需要完成WGS-84坐标到珠江坐标系(54椭球)的坐标转换,整个转换过程是 这样的: WGS-84经纬度 WGS-84空间直角 七参数转换 北京54空间直角 北京54经纬度 坐标投影 北京54平面坐标 四参数转换 珠江平面坐标 三个已计算七参数 一个已计算三参数 投影参数设置 两个已计算四参数 本软件使用说明: 本软件采用文件化管理,用户可以将一种转换作为一个文件保存下来,下次使用时从文件菜单中选择打开这个文件来调用所有已有的转换参数。 实例一: 转换要求: 用户在一个佛山测区内使用RTK GPS接收机接受了一些点的WGS-84的坐标,现在希望将其转换为北京54和佛山坐标系下的坐标。用户有佛山测区的一些控制点,这些控制点有WGS-84坐标,也有北京-54坐标也有佛山坐标。 分析: WGS-84坐标和北京54坐标是不同两个椭球的坐标转换,所以要求得三参数或七参数,而北京54和佛山坐标都是同一个椭球,所以他们之间的转换是地方坐标转换,需要求得地方转化四参数,因为要求得到的北京54是平面坐标所以需要设置投影参数。: 步骤: 1. 新建坐标转换文件,便于下次使用转换是不用重新输入,直接打开即可。 2. 设置投影参数。 3. 用一个已点(WGS84坐标和北京54坐标),计算不同椭球转换的三参数(或七参数)。 4. 确定转换参数。 5. 打开七参数转换,完成WGS84到北京54的转换。 6. 利用多个已点(北京54坐标和佛山坐标),计算同一个椭球的地方坐标转换(四参数)。 7. 确定转换参数 8. 同时打开七参数和四参数。完成WGS-84到佛山坐标的转换。 实例二: 转换要求: 用户在一个测区内有一些点的北京54的坐标,现在希望将其转换为国家80坐标。用户有测区的一些控制点,这些控制点既有北京-54坐标也有国家80坐标。 文件转换 用户如果需要转换的是一个文件里的所有的点,可以用文件转换来完成。 1. 确定转换关系: 按照上面的步骤完成1~8步的操作,这样就确立了转换关系,也就是说文件里所有的点都按照上面确定的转换关系来完成转换。 2. 确定转换格式: 在主界面中选择文件转换,点击格式按钮。 新建格式:在名称,扩展名中输入相应的内容,然后自己选择数据列表中的内容并添加来确定格式,如果列表中没有的就用其他来表示,完成后点击完成新建。 选择格式:在格式列表中选择格式 文件转换方式:转换后的文件有三种方式,如原来的文件是C:\File.txt文件,用户选择其中的一种,这样转换后就会根据这个方式来完成新建文件。却省是在文件扩展名后+1,即转换后会新生成一个C:\File.txt1文件。 在上述工作完成后,单击确定按钮即可。 3. 选择转换文件并完成转换 单击浏览按钮,打开文件选择对话框,选择文件并确定,在左边会显示文件,用户单击 =〉按钮即可完成转换,右边会显示出转换后的文件名和路径,用户可以通过双击列表中的文件即可查看文件内容。 实例三: 转换要求: 用户在番禹工作,要求完成从WGS-84到国家80的转换,由于测区范围比较大,需要进行七参数转换。 注意:这个例子同样适合于直接从WGS-84坐标转换为地方坐标转换。 分析: 首先分析坐标:因为七参数转换模型的特点,要求转换的坐标不能相差太大, WGS-84的坐标为:023:09:33.6274 112:55:41.2119 62.536 国际80坐标为: 562589.8110 290115.8140 70.3590 用WGS-84不加任何参数转化为平面坐标为:2562588.851341 390232.479605 可以看到 X的大数差-2000000 Y的大数差-100000 所以改变投影参数里的X,Y常数改正为 X常数:0-2000000=-2000000 Y常数:500000-100000=400000 一、设置投影参数 二、计算七参数 选择坐标转换菜单下的“计算七参数“,打开如图对话框 选择好源坐标和目标坐标的类型,源坐标和目标坐标的椭球基准,输入源坐标和目标坐标,点击“增加“按钮,就会将刚才的公共点坐标输入到列表中,同样的方法至少输入三个已点到列表中,点击“计算“按钮,就可以看到计算的结果,同时在”RMS”中会显示使用这套参数後计算後每个点的坐标中误差,如果发现误差过大,可能坐标中由输入错误的,这时可以通过在列表中选择不同的站点计算,直到满意为止。完成后点击“确定“按钮。 三、七参数设置 单击“确定“按钮即可设置好了七参数 四、完成转换 选择“七参数转换“打钩,就可以完成了,完成后点击保存,下次就可以使用同样的参数。 上述的方法同样适合于从WGS-84直接转换为地方坐标,关键是确定好投影参数的X,Y常数。
坐标转换问题的详细了解对于测量很重要,那么请和我一起来讨论这个问题。 首先,我们要弄清楚几种坐标表示方法。大致有三种坐标表示方法:经纬度和高程,空间直角坐标,平面坐标和高程。 我们通常说的WGS-84坐标是经纬度和高程这一种,北京54坐标是平面坐标和高程着一种。 现在,再搞清楚转换的严密性问题,在同一个椭球里的转换都是严密的,而在不同的椭球之间的转换是不严密的。举个例子,在WGS-84坐标和北京54坐标之间是不存在一套转换参数可以全国通用的,在每个地方会不一样,因为它们是两个不同的椭球基准。 那么,两个椭球间的坐标转换应该是怎样的呢?一般而言比较严密的是用七参数法(包括布尔莎模型,一步法模型,海尔曼特等),即X平移,Y平移,Z平移,X旋转,Y旋转,Z旋转,尺度变化K。要求得七参数就需要在一个地区需要3个以上的已点,如果区域范围不大,最远点间的距离不大于30Km(经验值),这可以用三参数(莫洛登斯基模型),即X平移,Y平移,Z平移,而将X旋转,Y旋转,Z旋转,尺度变化K视为0,所以三参数只是七参数的一种特例。在本软件中提供了计算三参数、七参数的功能。 在一个椭球的不同坐标系中转换可能会用到平面转换,现阶段一般分为四参数和平面网格拟合两种方法,以四参数法在国内用的较多,举个例子,在深圳既有北京54坐标又有深圳坐标,在这两种坐标之间转换就用到四参数,计算四参数需要两个已点。更精确的可以提供网格拟合数据,本软件提供计算和应用四参数的功能,也提供了网格拟合的功能

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yfs1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值