2011-05-11 31 views
2

我在使用正则表达式将JavaScript转换为JavaScript中的DD时遇到了麻烦。我从geoserver中获取了这些代码,但它似乎不起作用。我希望它能够将所有测试用例转换为正确或非常接近的答案。Regular Expression/Javascript:Convert Degrees Minutes Seconds to Decimal Degrees

我真的不在乎,如果函数是完全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; 
} 

回答

7

这并不难,以下假设传入了正确的格式,您可能需要对其进行验证。它也不会格式化输出,如果需要的话,使用通用的格式化函数(再次,不难写,大约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 
); 
+0

哇,你的代码通过了我的测试用例,还有一些用了飞行颜色。非常感谢! – capdragon 2011-05-12 13:23:48

+0

它很干净,很简单,而且最棒!我喜欢它。 – capdragon 2011-05-12 13:39:39

0

的问题是,您删除所有的空间,使'03 01 37' 变成 '030137'。然后,正则表达式\d{1,3}匹配三个数字'030'。您应该将可选分隔符添加到正则表达式中,而不是从输入中剥离它们。

可能还有其他的东西,但这是我看到的第一个。

正如您所发现的,解析纬度/经度值比看起来更难。如果你可以重新使用别人的代码,你应该。

+0

是的,我从GeoServer源代码得到了这段代码,但是我的RegEx太糟糕了,所以我不知道如何解决它。 :/ – capdragon 2011-05-12 13:16:01