2011-05-11 78 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