Java经纬度小数与度分秒相互转换工具类示例详解

 更新时间:2023年07月28日 09:29:01   作者:Mcband  
这篇文章主要介绍了Java经纬度小数与度分秒相互转换工具类,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

在工作中遇到对经纬度的小数和度分秒进行互相转换的需求,类似以下:

一.编写工具类

请求参数

package com.sinosoft.springbootplus.lft.business.touristres.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
/**
 * <pre>
 *经纬度转换实体
 * </pre>
 *
 * @author mc
 * @date 2023-06-13
 */
@Data
@Accessors(chain = true)
@ApiModel(value = "经纬度转换实体", description = "经纬度转换实体")
public class LatitudeLongitudeConvertDto {
    /**
     * 类型
     */
    @ApiModelProperty(value = "0:度数,1:小数")
    @NotNull(message = "经纬度类型不能为空")
    private String type;
    /**
     * 经度
     */
    @ApiModelProperty(value = "经度")
    private Double longitude;
    /**
     * 纬度
     */
    @ApiModelProperty(value = "纬度")
    private Double latitude ;
    /**
     * 经度-度
     */
    @ApiModelProperty(value = "东经-度")
    private Integer eastMeasure;
    /**
     * 经度-分
     */
    @ApiModelProperty(value = "东经-分")
    private Integer eastDivide;
    /**
     * 经度-秒
     */
    @ApiModelProperty(value = "东经-秒")
    private Double eastSecond;
    /**
     * 纬度-度
     */
    @ApiModelProperty(value = "北纬-度")
    private Integer northMeasure ;
    /**
     * 纬度-分
     */
    @ApiModelProperty(value = "北纬-分")
    private Double northDivide;
    /**
     * 纬度-秒
     */
    @ApiModelProperty(value = "北纬-秒")
    private Double northSecond;
}

转换后实体

package com.sinosoft.springbootplus.lft.business.touristres.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
/**
 * <pre>
 * 经纬度转换 viewObject
 * </pre>
 *
 * @author mc
 * @date 2023-06-13
 */
@Data
@Accessors(chain = true)
@ApiModel(value = "经纬度转换实体", description = "经纬度转换实体")
public class LatitudeLongitudeConvertVo {
    /**
     * 经度
     */
    @ApiModelProperty(value = "经度")
    private Double longitude;
    /**
     * 纬度
     */
    @ApiModelProperty(value = "纬度")
    private Double latitude ;
    /**
     * 东经-度
     */
    @ApiModelProperty(value = "东经-度")
    private Integer eastMeasure;
    /**
     * 东经-分
     */
    @ApiModelProperty(value = "东经-分")
    private Integer eastDivide;
    /**
     * 东经-秒
     */
    @ApiModelProperty(value = "东经-秒")
    private Double eastSecond;
    /**
     * 北纬-度
     */
    @ApiModelProperty(value = "北纬-度")
    private Integer northMeasure ;
    /**
     * 北纬-分
     */
    @ApiModelProperty(value = "北纬-分")
    private Integer northDivide;
    /**
     * 北纬-秒
     */
    @ApiModelProperty(value = "北纬-秒")
    private Double northSecond;
}

service层

 /**
     * 经纬度转换
     */
    public LatitudeLongitudeConvertVo latitudeLongitudeConvert(LatitudeLongitudeConvertDto latitudeLongitudeConvertDto) {
        LatitudeLongitudeConvertVo latitudeLongitudeConvertVo = LatitudeLongitudeConvert.INSTANCE.latitudeLongitudeConvertDto2LatitudeLongitudeConvertVo(latitudeLongitudeConvertDto);
        //小数->时分秒
        if (DECIMAL.equals(latitudeLongitudeConvertDto.getType())) {
            //纬度
            DegreeMinuteSecondVo latDegreeMinuteSecondVo = LongitudeAndLatitudeUtils.convertToSexagesimal(latitudeLongitudeConvertDto.getLatitude());
            //经度
            DegreeMinuteSecondVo lngDegreeMinuteSecondVo = LongitudeAndLatitudeUtils.convertToSexagesimal(latitudeLongitudeConvertDto.getLongitude());
            latitudeLongitudeConvertVo.setEastMeasure(lngDegreeMinuteSecondVo.getMeasure());
            latitudeLongitudeConvertVo.setEastDivide(lngDegreeMinuteSecondVo.getDivide());
            latitudeLongitudeConvertVo.setEastSecond(lngDegreeMinuteSecondVo.getSecond());
            latitudeLongitudeConvertVo.setNorthMeasure(latDegreeMinuteSecondVo.getMeasure());
            latitudeLongitudeConvertVo.setNorthDivide(latDegreeMinuteSecondVo.getDivide());
            latitudeLongitudeConvertVo.setNorthSecond(latDegreeMinuteSecondVo.getSecond());
        }
        //时分秒->小数
        if (DEGREES.equals(latitudeLongitudeConvertDto.getType())) {
            //经度
            double lng = LongitudeAndLatitudeUtils.Dms2D(latitudeLongitudeConvertDto.getEastMeasure(), latitudeLongitudeConvertDto.getEastDivide(), latitudeLongitudeConvertDto.getEastSecond());
            //纬度
            double lat = LongitudeAndLatitudeUtils.Dms2D(latitudeLongitudeConvertDto.getNorthMeasure(), latitudeLongitudeConvertDto.getNorthDivide(), latitudeLongitudeConvertDto.getNorthSecond());
            latitudeLongitudeConvertVo.setLatitude(lat);
            latitudeLongitudeConvertVo.setLongitude(lng);
        }
        return latitudeLongitudeConvertVo;
    }

工具类

package com.sinosoft.springbootplus.lft.business.touristres.utils;
import com.sinosoft.springbootplus.lft.business.touristres.vo.DegreeMinuteSecondVo;
import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
import java.text.DecimalFormat;
public class LongitudeAndLatitudeUtils {
    /**
     *
     * @param du  Integer类型
     * @param min  double类型
     * @param sec  double类型
     * @return   double(经纬度转换之后的小数)
     */
    public static double Dms2D(Integer du,double min,double sec ){
        double jwd = 0.00;
        String limit = "";
        min /= 60;
        sec /= 3600;
        double xiaoshu = min + sec;
        DecimalFormat df = new DecimalFormat("0.000000");
        String format = df.format(xiaoshu);
        if (format.substring(0, 1).equals("1")) {
            du += 1;
            limit = String.valueOf(du);
        }
        String xs = format.substring(1, format.length() - 1);
        String stringXs = limit + xs;
        jwd = Double.parseDouble(stringXs)+du;
        return jwd;
    }
    /**
     * 将小数度数转换为度分秒格式
     * @param num
     * @return
     */
    public static DegreeMinuteSecondVo convertToSexagesimal(double num){
        DecimalFormat df = new DecimalFormat("0.00");
        DegreeMinuteSecondVo degreeMinuteSecondVo = new DegreeMinuteSecondVo();
        int du=(int)Math.floor(Math.abs(num));    //获取整数部分
        double temp=getdPoint(Math.abs(num))*60;
        int fen=(int)Math.floor(temp); //获取整数部分
        double miao=getdPoint(temp)*60;
        String format = df.format(miao);
        if(num<0){
            degreeMinuteSecondVo.setMeasure(-du);
        }else{
            degreeMinuteSecondVo.setMeasure(du);
        }
        degreeMinuteSecondVo.setDivide(fen);
        degreeMinuteSecondVo.setSecond(Double.parseDouble(format));
        return degreeMinuteSecondVo;
    }
    //获取小数部分
    private static double getdPoint(double num){
        double d = num;
        int fInt = (int) d;
        BigDecimal b1 = new BigDecimal(Double.toString(d));
        BigDecimal b2 = new BigDecimal(Integer.toString(fInt));
        double dPoint = b1.subtract(b2).floatValue();
        return dPoint;
    }
}

如果对精度有要求,可以使用以下代码对精度进行控制

double miao = 1.11111;
//0.00是控制在几位小数
DecimalFormat df = new DecimalFormat("0.00");
String format = df.format(miao);

到此这篇关于java经纬度小数与度分秒相互转换工具类的文章就介绍到这了,更多相关java经纬度小数与度分秒转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java程序去调用并执行shell脚本及问题总结(推荐)

    Java程序去调用并执行shell脚本及问题总结(推荐)

    这篇文章主要介绍了Java程序去调用并执行shell脚本及问题总结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • Java8 List集合如何移除满足条件的元素

    Java8 List集合如何移除满足条件的元素

    这篇文章主要介绍了Java8 List集合如何移除满足条件的元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Gradle进阶使用结合Sonarqube进行代码审查的方法

    Gradle进阶使用结合Sonarqube进行代码审查的方法

    今天小编就为大家分享一篇关于Gradle进阶使用结合Sonarqube进行代码审查的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Springboot 2.x集成kafka 2.2.0的示例代码

    Springboot 2.x集成kafka 2.2.0的示例代码

    kafka近几年更新非常快,也可以看出kafka在企业中是用的频率越来越高。本文主要为大家介绍了Springboot 2.x集成kafka 2.2.0的示例代码,需要的可以参考一下
    2022-04-04
  • 详解spring boot Websocket使用笔记

    详解spring boot Websocket使用笔记

    本篇文章主要介绍spring boot Websocket使用笔记,在springboot项目中使用websocket做推送,这里整理了详细的代码,有需要的小伙伴可以参考下。
    2017-03-03
  • SpringBoot开发之整合Mybatis详解

    SpringBoot开发之整合Mybatis详解

    这篇文章主要介绍了SpringBoot开发之整合Mybatis详解,MyBatis是一个半自动的ORM框架,它允许我们通过编写SQL语句来操作数据库,使用MyBatis,我们可以通过定义映射文件(XML文件)或使用注解的方式将Java对象与数据库表进行映射,需要的朋友可以参考下
    2023-09-09
  • Java多线程之ThreadLocal原理总结

    Java多线程之ThreadLocal原理总结

    这篇文章主要介绍了Java多线程ThreadLocal原理,同一个ThreadLocal所包含的对象,在不同的Thread中有不同的副本,文章中有详细的代码示例,需要的朋友参考一下
    2023-04-04
  • Java 中运行字符串表达式的方法

    Java 中运行字符串表达式的方法

    这篇文章主要介绍了Java 中运行字符串表达式的方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-11-11
  • java实现打字游戏小程序

    java实现打字游戏小程序

    这篇文章主要为大家详细介绍了java实现打字游戏小程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10
  • 如何使用idea里面自带的翻译插件

    如何使用idea里面自带的翻译插件

    这篇文章主要介绍了idea里面自带的翻译插件,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11

最新评论