js经纬度坐标和度分秒互转

本文介绍了一种实用的经纬度坐标转换方法,支持DDD(十进制度)、DMM(度分)、DMS(度分秒)之间的相互转换,并提供了具体的JavaScript实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近项目中用到经纬度坐标和度分秒的相互转化,
DDD:123.123456;DMM:123°23.3456’;DMS:123°23’34.56"
估计其他同僚可能也会用到吧,分享给大家了。有用的,点个赞,关注一下
废话不多说,直接上代码…

代码

  //经纬度格式转化工具 
  export function LatlngCnvTool(latlng,fmt1,fmt2){
    fmt1=fmt1||"DDD";
    fmt2=fmt2||"DMS";
    let lng ="";let lat ="";
    //判断类型 数组  对象  字符串 
    if(latlng instanceof Array){
      lng =latlng[0];lat =latlng[1];
    }else if(latlng instanceof Object){
      lng =latlng.lng;lat =latlng.lat;
    }else{let _a =latlng.split(",");
    lng =_a[0];lat =_a[1];
    }
    //按格式进行转化
    if(fmt1=="DDD"){
      if(fmt2=="DMS"){
        lng =DDDToDMS(lng);lat =DDDToDMS(lat);
      }else if(fmt2=="DMM"){
        lng =DDDToDMM(lng);lat =DDDToDMM(lat);
      }else if(fmt2=="DDD"){
        lng =DDDToDDD(lng);lat =DDDToDDD(lat);
      }
    }
    else if(fmt1=="DMS"){
      if(fmt2=="DDD"){
        lng =DMSToDDD(lng);lat =DMSToDDD(lat);
      }else {
        return "";
      }
    }
    else if(fmt1=="DMM"){
      if(fmt2=="DDD"){
        lng =DMMToDDD(lng);lat =DMMToDDD(lat);
      }else {
        return "";
      }
    }
    return lng+","+lat;
  }
  //用户输入 任意格式转数据库存储
  export function LatlngInputToDB(_da){
    var str = ""+_da;
    var numArr = str.match(/(\d+\.\d+)|(\d+)/g);// console.log(numArr);
    if(numArr.length==1){let latlng=parseFloat(numArr[0]).toFixed(6);
      return latlng;
    }
    if(numArr.length==2){
      let latlng =Math.abs(numArr[0]) +(Math.abs(numArr[1])/60); latlng=parseFloat(latlng).toFixed(6);
      return latlng;
    }
    if(numArr.length==3){
      let latlng =Math.abs(numArr[0]) +(Math.abs(numArr[1])/60 + Math.abs(numArr[2])/3600);latlng=parseFloat(latlng).toFixed(6);
      return latlng;
    }
  }
  export function LatlngDBToInput(_da,ft){
    switch(ft){
      case "DDD": _da =DDDToDDD(_da);break;
      case "DMM": _da =DDDToDMM(_da);break;
      case "DMS": _da =DDDToDMS(_da);break;
    }
    return _da;
  }
  //对象转字符
  function LatlngToStr(_obj){
    let str =obj.Lat+","+obj.Lng;
  }
  //DDD转DDD
  function DDDToDDD(_data){
    let value = parseFloat(_data);
    return value.toFixed(6);
  }
  //DDD转DMS °、′、″ 这里为用 '代替了′ " 代替 ″ 8°14'2.8428"
  function DDDToDMS(_data){
    let value = parseFloat(_data);
    let _d = Math.floor(value);//度
    let _m = Math.floor((value - _d) * 60);//分
    //let _s = Math.round((value - _d) * 3600 % 60);//秒 保留整数
    let _s =  parseFloat((value - _d) * 3600 % 60).toFixed(2);//精确小数点后面两位
    return _d+ '°' + _m + '\'' + _s + '"';
  }
  //DDD转DMM
  function DDDToDMM(_data){
    let value = parseFloat(_data);
    let _d = Math.floor(value);//度
   // let _m =parseFloat((value - _d) * 60);//分
    let _m =parseFloat((value - _d) * 60).toFixed(4);//分 精确小数点后面4位
    return _d+ '°' + _m + '\'';
  }
  //DMS转DDD
  function DMSToDDD(_data){
    let du = _data.split("°")[0];
    let fen = _data.split("°")[1].split("'")[0];
    let miao = _data.split("°")[1].split("'")[1].split('"')[0];
    let res =Math.abs(du) +(Math.abs(fen)/60 + Math.abs(miao)/3600);
    res=parseFloat(res).toFixed(6);
    return res;
  }
  //DMM转DDD
  function DMMToDDD(_data){
    let du = _data.split("°")[0];
    let fen = _data.split("°")[1].split("'")[0];
    let res =Math.abs(du) +(Math.abs(fen)/60); res=parseFloat(res).toFixed(6);
    return res;
  }
  //格式化度分秒  方便不会打°符号的人调用转化 例如23*34*454 即可转化为23°34'454"
  export function formatDMS(_da){
    var str = ""+_da;
      var numArr = str.match(/(\d+\.\d+)|(\d+)/g);
    if(numArr.length==1){
      return numArr[0]+ '°' +numArr[1]+ '\'';
    }
    if(numArr.length>1){
      return numArr[0]+ '°' +numArr[1]+ '\'' + numArr[2]+ '"';
    }
    return '0°00\'00"';
  }

示例

// function LatlngTest(){
//     let t =initLatlng();
//     let latlng =LatlngCnvTool(t);
//     //latlng =LatlngCnvTool(t,"DDD","DMM");
//     //latlng =LatlngCnvTool("114°26'7.96\",32°26'7.24\"","DMS","DDD");
//     //latlng =LatlngCnvTool("114°26.1327',32°26.1207'","DMM","DDD");
//     //
//     // let fotlat =formatDMS("114!26*7.96");
//     // latlng =LatlngCnvTool(fotlat+",32°26'7.24\"","DMS","DDD");
//     showOut(latlng);
//   }
//   //初始化 Latlng
//   function initLatlng(){
//     let obj ={
//       lat:32.435345, lng:114.435545
//     }
//     return obj;
//   }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Devil枫

发财小手鼓励一下作者大大

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

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

打赏作者

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

抵扣说明:

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

余额充值