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中反射详解

    Java中反射详解

    本文主要介绍了Java中反射的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • Java设计模式之抽象工厂模式实例详解

    Java设计模式之抽象工厂模式实例详解

    这篇文章主要介绍了Java设计模式之抽象工厂模式,结合实例形式分析了抽象工厂模式的概念、功能、定义与使用方法,需要的朋友可以参考下
    2017-09-09
  • Easycode自动化springboot的curd

    Easycode自动化springboot的curd

    这篇文章主要介绍了Easycode自动化springboot的curd,围绕主题的相关资料展开详细内容,具有一定的参考价值,需要的小伙伴可以参考一下,希望给对你有所帮助
    2022-01-01
  • Java Spring中Quartz调度器详解及实例

    Java Spring中Quartz调度器详解及实例

    这篇文章主要介绍了Java Spring中Quartz调度器详解及实例的相关资料,需要的朋友可以参考下
    2017-02-02
  • Spring @Conditional注解示例详细讲解

    Spring @Conditional注解示例详细讲解

    @Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean,这篇文章主要介绍了Spring @Conditional注解示例详细讲解,需要的朋友可以参考下
    2022-11-11
  • 关于单例模式懒汉式和饿汉式的区别及说明

    关于单例模式懒汉式和饿汉式的区别及说明

    这篇文章主要介绍了关于单例模式懒汉式和饿汉式的区别及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • java.text.DecimalFormat类十进制格式化

    java.text.DecimalFormat类十进制格式化

    这篇文章主要为大家详细介绍了java.text.DecimalFormat类十进制格式化的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • Seata AT模式前后镜像是如何生成详解

    Seata AT模式前后镜像是如何生成详解

    这篇文章主要为大家介绍了Seata AT模式前后镜像是如何生成的方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • 详解Mybatis逆向工程中使用Mysql8.0版本驱动遇到的问题

    详解Mybatis逆向工程中使用Mysql8.0版本驱动遇到的问题

    今天在使用 8.0.12 版的 mysql 驱动时遇到了各种各样的坑。这篇文章主要介绍了详解Mybatis逆向工程中使用Mysql8.0版本驱动遇到的问题,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • java 自定义可继承枚举Enum的案例

    java 自定义可继承枚举Enum的案例

    这篇文章主要介绍了java 自定义可继承枚举Enum的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02

最新评论