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

Posted 程序媛一枚~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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°

效果图

19:27:27.992 [main] INFO com.demo.LatLngUtil - 度分转经纬度:126.267141 40.0897315
19:27:27.998 [main] INFO com.demo.LatLngUtil - 经纬度转度分:116°9’ 40°5’
19:27:27.998 [main] INFO com.demo.LatLngUtil - 度分秒转经纬度:116.4188333 40.0897222
19:27:27.998 [main] INFO com.demo.LatLngUtil - 经纬度转度分秒:116°9’37.02" 40°5’23.03"

2. 源码

package com.demo;

import lombok.extern.slf4j.Slf4j;


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

    /**
     * 将经纬度转换为度分秒格式
     *
     * @param du 116.418847        40.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 Object 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;
    

    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));
    

参考

以上是关于Java 度分秒转经纬度,经纬度转度分秒,度分转经纬度,经纬度转度分的主要内容,如果未能解决你的问题,请参考以下文章

Java转Double类型经纬度为度分秒格式

如何将WGS84坐标转换成经纬度坐标(度分秒的形式)?

经纬度转换-----度分秒以及经纬度和米

GPS模块获取的数据转换成经纬度(度分秒的格式),C语言

如何将GPS数据转换为度分秒

如何将度分秒转换为度小数