地图原点半径距离经纬度计算

需求

已知地图中心点经纬度,求取指定半径的矩形四个角的经纬度
如图
在这里插入图片描述

已知中心点经纬度(centerLatitude,centerLongitude)和半径长度radius,求
在这里插入图片描述

分析

假设地球为一半径为R的表面光滑圆球体,
表面上同一经线圈上相差1"两点间的距离为 2πR/360/3600
表面上同一纬线圈上相差1"两点间的距离为 2πR×cos(纬度)/360/3600
当R取半径平均值6371km时,
地球表面上同一经线圈上相差1"两点间的距离约为30.887m
地球表面上同一纬线圈上相差1"两点间的距离约为30.887m×cos(纬度)

即我们可以求得距离中心点半径的四条经纬度线,也就是左右两条经度线和上下两条维度线
然后交叉的四个点就是我们需要的经纬度值
在这里插入图片描述

代码

    /**
     * 假设地球为一半径为R的表面光滑圆球体,
     * 表面上同一经线圈上相差1"两点间的距离为 2πR/360/3600
     * 表面上同一纬线圈上相差1"两点间的距离为 2πR×cos(纬度)/360/3600
     * <p>
     * 当R取半径平均值6371km时,
     * 地球表面上同一经线圈上相差1"两点间的距离约为30.887m
     * 地球表面上同一纬线圈上相差1"两点间的距离约为30.887m×cos(纬度)
     *
     * @param centerLatitude  中心维度
     * @param centerLongitude 中心经度
     * @param radius          半径距离
     */
    private static void calculateLl(double centerLongitude, double centerLatitude, Double radius) {

        //地球周长
        Double perimeter = 2 * Math.PI * 6371000;
        //纬度latitude的地球周长:centerLatitude
        Double perimeter_latitude = perimeter * Math.cos(Math.PI * centerLatitude / 180);

        //一米对应的经度(东西方向)1M实际度
        double longitude_per_mi = 360 / perimeter_latitude;
        double latitude_per_mi = 360 / perimeter;
        System.out.println("经度(东西方向)1M实际度==" + longitude_per_mi);
        System.out.println("纬度(南北方向)1M实际度==" + latitude_per_mi);

        Double leftLo = centerLongitude - (radius * longitude_per_mi);  //左边经度
        Double rightLo = centerLongitude + (radius * longitude_per_mi); //右边经度
        Double topLa = centerLatitude + (radius * latitude_per_mi);     //上边经度
        Double bottomLa = centerLatitude - (radius * latitude_per_mi);  //下边经度

        System.out.println("左边经度=" + leftLo);
        System.out.println("右边经度" + rightLo);
        System.out.println("上边经度" + topLa);
        System.out.println("下边经度" + bottomLa);
    }

    public static void main(String[] args) {
        // 中心点是深圳市,半径一公里
        calculateLl(114.057939,22.543527, 1000D);
    }

执行结果

经度(东西方向)1M实际度==9.737253785006766E-6
纬度(南北方向)1M实际度==8.993216059187306E-6
左边经度=114.048201746215
右边经度114.06767625378501
上边经度22.55252021605919
下边经度22.534533783940812

最后组合一下就是我们要的结果

左上=(leftLo,topLa)=(114.048201746215,22.55252021605919)
左下=(leftLo,bottomLa)=(114.048201746215,22.534533783940812)
右上=(rightLo,topLa)=(114.06767625378501,22.55252021605919)
右下=(rightLo,bottomLa)=(114.06767625378501,22.534533783940812)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cy谭

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

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

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

打赏作者

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

抵扣说明:

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

余额充值