Java 度分秒转经纬度,经纬度转度分秒,度分转经纬度,经纬度转度分

这篇博客将介绍如何使用Java进行度分秒与经纬度互转,度分与经纬度互转。

全球经纬度的取值范围为:纬度-90 ~ 90,经度-180 ~ 180
度分转换: 将度分单位数据转换为度单位数据,公式:度=度+分/60

例如: 经度 = 116°20.12’,纬度 = 39°12.34’
经度 = 116 + 20.12 / 60 = 116.33533°
纬度 = 39 + 12.34 / 60 = 39.20567°

效果图

20:23:52.718 [main] INFO com.demo.LatLngUtil - 度分转经纬度:126.267141 40.0897315
20:23:52.731 [main] INFO com.demo.LatLngUtil - 经纬度转度分:116°9’ 40°5’
20:23:52.733 [main] INFO com.demo.LatLngUtil - 度分秒转经纬度:116.4188333 40.0897222
20:23:52.733 [main] INFO com.demo.LatLngUtil - 经纬度转度分秒:116°9’37.02" 40°5’23.03"
20:23:52.733 [main] INFO com.demo.LatLngUtil - 度分秒转经纬度2:116.5309944 39.9220889

2. 源码

package com.demo;

import lombok.extern.slf4j.Slf4j;


/*************************************
 *Class Name: LatLngUtil
 *Description: <度分秒,度分,与经纬度互转工具类>
 *@author: Seminar
 *@create: 2021/5/24
 *@since 1.0.0
 *************************************/
@Slf4j
public class LatLngUtil {
    
    

    /**
     * 将经纬度转换为度分秒格式
     *
     * @param du 116.41884740.0897315
     * @return 116°25'7.85"       40°5'23.03"
     */
    public static String latLng2Dfm(double du) {
    
    
        int du1 = (int) du;
        double tp = (du - du1) * 60;
        int fen = (int) tp;
        String miao = String.format("%.2f", Math.abs(((tp - fen) * 60)));
        return du1 + "°" + Math.abs(fen) + "'" + miao + "\"";
    }

    /**
     * 度分秒转经纬度
     *
     * @param dms 116°25'7.85"
     * @return 116.418847
     */
    public static double dfm2LatLng(String dms) {
    
    
        if (dms == null) return 0;
        try {
    
    
            dms = dms.replace(" ", "");
            String[] str2 = dms.split("°");
            if (str2.length < 2) return 0;
            int d = Integer.parseInt(str2[0]);
            String[] str3 = str2[1].split("\'");
            if (str3.length < 2) return 0;
            int f = Integer.parseInt(str3[0]);
            String str4 = str3[1].substring(0, str3[1].length() - 1);
            double m = Double.parseDouble(str4);

            double fen = f + (m / 60);
            double du = (fen / 60) + Math.abs(d);
            if (d < 0) du = -du;
            return Double.parseDouble(String.format("%.7f", du));
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
        return 0;
    }

    /**
     * 将经纬度转换为度分格式
     *
     * @param du 116.418847      40.0897315
     * @return 116°25'  40°5'
     */
    private static String latLng2Df(double du) {
    
    
        int du1 = (int) du;
        double tp = (du - du1) * 60;
        int fen = (int) tp;
        return du1 + "°" + Math.abs(fen) + "'";
    }

    /**
     * 度分转经纬度
     * 全球经纬度的取值范围为:纬度-90~90,经度-180~180
     * 度分转换: 将度分单位数据转换为度单位数据,公式:度=度+分/60
     * 例如: 经度 = 116°20.12',纬度 = 39°12.34'
     * 经度 = 116 + 20.12 / 60 = 116.33533°
     * 纬度 = 39 + 12.34 / 60 = 39.20567°
     *
     * @param dm 4005.38389 ddmm.mmmmm
     * @return 40.0897315
     * 11616.02846 dddmm.mmmmm
     * 116.267141
     */
    public static double df2LatLng(String dm) {
    
    
        if (dm == null) {
    
    
            return 0;
        }
        try {
    
    
            dm = dm.replace(" ", "");
            int d = parseInteger(dm.substring(0, dm.lastIndexOf(".") - 2));
            double fen = Double.parseDouble(dm.substring(2));

            double lat = (fen / 60) + Math.abs(d);
            if (lat < 0) {
    
    
                lat = -lat;
            }
            return Double.parseDouble(String.format("%.7f", lat));
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
        return 0;
    }

    /**
     * dms转经纬度
     * 41951158     14371952
     * 116.5309944  39.9220889
     *
     * @param dms dms 经纬度
     * @return
     */
    public static double dfm2Du(Double dms) {
    
    
        int degree = (int) (dms / 360000);
        int minute = (int) ((dms - degree * 360000) / 6000);
        double second = (double) ((dms - degree * 360000 - minute * 6000) / 100.00);
        double digitalDegree = 0.0;
        double num = 60;
        digitalDegree += degree;
        digitalDegree += minute / num;
        digitalDegree += (second / (num * num));

        return Double.parseDouble(String.format("%.7f", digitalDegree));
    }

    public static Integer parseInteger(String str) {
    
    
        if (str == null || str.isEmpty()) {
    
    
            return 0;
        }
        return Integer.valueOf(str);
    }

    public static void main(String[] args) {
    
    
        double dfLng = 11616.02846; // 经度  dddmm.mmmmm
        double dfLat = 4005.38389; // 纬度 ddmm.mmmm
        double lng = 116.1602846;
        double lat = 40.0897315;

        log.info("   度分转经纬度:{} {}", df2LatLng(String.valueOf(dfLng)), df2LatLng(String.valueOf(dfLat)));
        log.info("   经纬度转度分:{} {}", latLng2Df(lng), latLng2Df(lat));

        String dfmLng = "116°25'7.85"; // 经度  ddd°mm'm.mm"
        String dfmLat = "40°5'23.03"; // 纬度 dd°mm'm.mm"
        log.info(" 度分秒转经纬度:{} {}", dfm2LatLng(dfmLng), dfm2LatLng(dfmLat));
        log.info(" 经纬度转度分秒:{} {}", latLng2Dfm(lng), latLng2Dfm(lat));


        Double dfmLng2 = 41951158d; // 经度
        Double dfmLat2 = 14371952d; // 纬度
        log.info("度分秒转经纬度2:{} {}", dfm2Du(dfmLng2), dfm2Du(dfmLat2));
    }

}

参考

猜你喜欢

转载自blog.csdn.net/qq_40985985/article/details/124448314