前端度分秒与经纬度互转

一、经纬度转度分秒

算法示例,假如有一个十进制的纬度:36.12432314,其转换成度分秒的规则是:

整数部分为度,小数部分 * 60 得到的整数部分为分,得到的小数部分 * 60为秒

即:36为度,0.12432314 * 60 = 7.4593884 中的7为分,0.4593884 * 60 = 27.5639304 为秒, 最终结果:36°7′27.6

//度转度°分′秒″
function ToDegrees(val) {
  if (typeof(val) == "undefined" || val == "") {
    return "";
  }
  var i = val.indexOf('.');
  var strDu = i < 0 ? val : val.substring(0, i); //获取度
  var strFen = 0;
  var strMiao = 0;
  if (i > 0) {
    var strFen = "0" + val.substring(i);
    strFen = strFen * 60 + "";
    i = strFen.indexOf('.');
    if (i > 0) {
      strMiao = "0" + strFen.substring(i);
      strFen = strFen.substring(0, i); //获取分
      strMiao = strMiao * 60 + "";
      i = strMiao.indexOf('.');
      strMiao = strMiao.substring(0, i + 4); //取到小数点后面三位
      strMiao = parseFloat(strMiao).toFixed(2); //精确小数点后面两位
    }
  }
  return strDu + "," + strFen + "," + strMiao;
}

 

二、度分秒转经纬度

同上相反即:36 + 7/60 + 27.6/3600 ≈ 36.12432314

//度°分′秒″转度
function ToDigital(strDu, strFen, strMiao, len) {
  len = (len > 6 || typeof(len) == "undefined") ? 6 : len; //精确到小数点后最多六位   
  strDu = (typeof(strDu) == "undefined" || strDu == "") ? 0 : parseFloat(strDu);
  strFen = (typeof(strFen) == "undefined" || strFen == "") ? 0 : parseFloat(strFen) / 60;
  strMiao = (typeof(strMiao) == "undefined" || strMiao == "") ? 0 : parseFloat(strMiao) / 3600;
  var digital = strDu + strFen + strMiao;
  if (digital == 0) {
    return "";
  } else {
    return digital.toFixed(len);
  }
}

 

三、硬转

看到这种有点规则的,可以尝试硬转看看效果,因为这种看起来就有点像度分秒的形式,再结合实现生产可能就是用的这种坐标,大胆尝试

var coord = ["1025553.44", "250601.56"];

var du = Math.floor(coord[0]/10000),
  fen = Math.floor(coord[0]%10000/100),
  miao = coord[0]%10000%100;
### 前端实现度分秒经纬度之间相互转换 在前端开发中,可以通过 JavaScript 实现度分秒(DMS, Degrees Minutes Seconds)十进制经纬度(DD, Decimal Degrees)之间的相互转换。以下是具体的实现方法。 #### 度分秒转十进制经纬度度分秒格式的经纬度转换为十进制小数格式时,可以按照以下公式计算: \[ decimal = degrees + \frac{minutes}{60} + \frac{seconds}{3600} \] 此公式的具体应用如下所示[^2]: ```javascript function dmsToDecimal(degrees, minutes, seconds) { return degrees + (minutes / 60) + (seconds / 3600); } // 示例:将 '30°53′54″' 转换为十进制 const latDegrees = 30; const latMinutes = 53; const latSeconds = 54; const latitude = dmsToDecimal(latDegrees, latMinutes, latSeconds); // 结果约为 30.8983333 console.log(latitude); ``` #### 十进制经纬度度分秒 如果需要将十进制小数格式的经纬度转换回度分秒,则可按以下逻辑操作: 1. 提取整数部分作为“度”; 2. 将剩余的小数部分乘以 60 得到分钟值,并提取其整数部分作为“分”; 3. 再次将剩下的小数部分乘以 60 得到秒钟值。 代码示例如下[^4]: ```javascript function decimalToDms(decimal) { const absValue = Math.abs(decimal); let degrees = Math.floor(absValue); let remaining = (absValue - degrees) * 60; let minutes = Math.floor(remaining); let seconds = ((remaining - minutes) * 60).toFixed(2); return `${degrees}°${minutes}'${seconds}"`; } // 示例:将十进制纬度 30.8983333 转换为 DMS 格式 const decimalLatitude = 30.8983333; const dmsLatitude = decimalToDms(decimalLatitude); // 输出 '30°53'54"' console.log(dmsLatitude); ``` 通过以上两种函数,可以在前端轻松完度分秒十进制经纬度间的互相转换。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值