Javascript 中的十进制度到度分和秒

新手上路,请多包涵

我正在尝试编写一个函数,该函数采用我的十进制度数(纬度或经度)并将它们转换为 DMS 度分秒。我知道我打算将小数点数乘以 60,然后它又是小数点。但我是个菜鸟。我会拆分号码吗?

 function ConvertDDToDMS(DD) {
    eg. DD =-42.4
    D= 42;
    M= 4*60;
    S= .M * 60;
    var DMS =

    return DMS //append Direction (N, S, E, W);
}

我在正确的轨道上吗?

原文由 Christopher 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 761
2 个回答

更新:我删除了没有任何意义的部分( 感谢 cwolves! )。

这里还有另一个实现。它不会像以前的那样简短和高效,但希望更容易理解。

要做到正确,首先您需要了解计算是如何完成的,然后才尝试实施它们。为此,伪代码是一个很好的选择,因为您可以用通俗易懂的英语或易于理解的简化语法写下这些步骤,然后将其翻译成您选择的编程语言。

我希望它有用!

 /* This is the pseudocode you need to follow:
 * It's a modified version from
 * http://en.wikipedia.org/wiki/Geographic_coordinate_conversion#Conversion_from_Decimal_Degree_to_DMS

function deg_to_dms ( degfloat )
   Compute degrees, minutes and seconds:
   deg ← integerpart ( degfloat )
   minfloat ← 60 * ( degfloat - deg )
   min ← integerpart ( minfloat )
   secfloat ← 60 * ( minfloat - min )
   Round seconds to desired accuracy:
   secfloat ← round( secfloat, digits )
   After rounding, the seconds might become 60. These two
   if-tests are not necessary if no rounding is done.
   if secfloat = 60
      min ← min + 1
      secfloat ← 0
   end if
   if min = 60
      deg ← deg + 1
      min ← 0
   end if
   Return output:
   return ( deg, min, secfloat )
end function
*/

function deg_to_dms (deg) {
   var d = Math.floor (deg);
   var minfloat = (deg-d)*60;
   var m = Math.floor(minfloat);
   var secfloat = (minfloat-m)*60;
   var s = Math.round(secfloat);
   // After rounding, the seconds might become 60. These two
   // if-tests are not necessary if no rounding is done.
   if (s==60) {
     m++;
     s=0;
   }
   if (m==60) {
     d++;
     m=0;
   }
   return ("" + d + ":" + m + ":" + s);
}

原文由 Aleadam 发布,翻译遵循 CC BY-SA 3.0 许可协议

function ConvertDDToDMS(D, lng) {
  return {
    dir: D < 0 ? (lng ? "W" : "S") : lng ? "E" : "N",
    deg: 0 | (D < 0 ? (D = -D) : D),
    min: 0 | (((D += 1e-9) % 1) * 60),
    sec: (0 | (((D * 60) % 1) * 6000)) / 100,
  };
}

The above gives you an object {deg, min, sec, dir} with sec truncated to two digits (eg 3.14 ) and dir being one of N , E , S , W 取决于您是否将 lng (经度)参数设置为真。例如:

 ConvertDDToDMS(-18.213, true) == {
   deg : 18,
   min : 12,
   sec : 46.79,
   dir : 'W'
}

或者,如果您只想要基本字符串:

 function ConvertDDToDMS(D){
  return [0|D, 'd ', 0|(D=(D<0?-D:D)+1e-4)%1*60, "' ", 0|D*60%1*60, '"'].join('');
}

ConvertDDToDMS(-18.213) == `-18d 12' 47"`

[编辑 2019 年 6 月]——修复了一个 8 年的错误,该错误有时会导致在转换精确分钟时由于浮点数学导致结果偏离 1 分钟,例如 ConvertDDToDMS(4 + 20/60)

[2021 年 12 月编辑]——糟糕。修复#2。返回到原始代码并将 1e-9 添加到 a) 将任何稍低的浮点错误撞到下一个最高数字和 b) 小于 .01 秒的值对输出没有影响。将 1e-4 添加到“字符串”版本,这是相同的修复,但也舍入秒(接近 12 秒)。

原文由 user578895 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题