我在使用正则表达式将javascript中的DMS转换为DD时遇到问题。我从geoserver那里获取了此代码,但它似乎不起作用。我希望它能够转换所有具有正确答案或非常接近答案的测试用例。

我真的不在乎功能是否完全是javascript或繁重的正则表达式,我只需要它即可工作。

您可以在JSFIDDLE上对其进行测试
http://jsfiddle.net/NJDp4/13/

这是我的测试用例:
dmsToDeg('N 03 01’37”');
dmsToDeg('03 01 37');
dmsToDeg('03 01'37” N');
dmsToDeg('076 40’35” W');
dmsToDeg('W 076 40’35”');
dmsToDeg('N 05 11’17”');

这是我的代码:

function dmsToDeg (dms) {
    if (!dms) {
        return Number.NaN;
    }
    var neg = dms.match(/(^\s?-)|(\s?[SW]\s?$)/) != null ? -1.0 : 1.0;
    dms = dms.replace(/(^\s?-)|(\s?[NSEW]\s?)$/, '');
    dms = dms.replace(/\s/g, '');
    var parts = dms.match(/(\d{1,3})[.,°d ]?\s*(\d{0,2})[']?(\d{0,2})[.,]?(\d{0,})(?:["]|[']{2})?/);
    if (parts == null) {
        return Number.NaN;
    }
    // parts:
    // 0 : degree
    // 1 : degree
    // 2 : minutes
    // 3 : secondes
    // 4 : fractions of seconde
    var d = (parts[1] ? parts[1] : '0.0') * 1.0;
    var m = (parts[2] ? parts[2] : '0.0') * 1.0;
    var s = (parts[3] ? parts[3] : '0.0') * 1.0;
    var r = (parts[4] ? ('0.' + parts[4]) : '0.0') * 1.0;
    var dec = (d + (m / 60.0) + (s / 3600.0) + (r / 3600.0)) * neg;
    return dec;
}

最佳答案

并不是那么困难,下面假设传入了正确的格式,您可能需要对此进行一些验证。它也不会格式化输出,如果需要的话,请使用通用格式化功能(同样,不难编写,最多约5行代码)。

您可能会将其输入另一个计算中(以弧度表示的度数?),因此可能不需要格式化。请注意,JavaScript数字不能准确表示所有十进制数字,因此在取整时要小心。精度足以满足大多数目的。

function dms2deg(s) {

  // Determine if south latitude or west longitude
  var sw = /[sw]/i.test(s);

  // Determine sign based on sw (south or west is -ve)
  var f = sw? -1 : 1;

  // Get into numeric parts
  var bits = s.match(/[\d.]+/g);

  var result = 0;

  // Convert to decimal degrees
  for (var i=0, iLen=bits.length; i<iLen; i++) {

    // String conversion to number is done by division
    // To be explicit (not necessary), use
    //   result += Number(bits[i])/f
    result += bits[i]/f;

    // Divide degrees by +/- 1, min by +/- 60, sec by +/-3600
    f *= 60;
  }

  return result;
}

alert(
  dms2deg('S 023 30\'') + '\n' +      // -23.5
  dms2deg('N 023 00\' 00\"') + '\n' + //  23
  dms2deg('W 117 23\' 23.32\"')       // -117.3898111111111
);

09-16 21:00