2016-06-18 52 views
2

假設我有一個緯度經度:38.898556,-77.037852。我如何將其轉換爲DMS?如何將緯度從十進制度轉換爲DMS格式?

預期輸出是:

38 53 55 N 
77 2 16 W 

希望能夠同時接受一緯度和經度作爲函數輸入參數。

當前功能如下:

function convertDMS(lat, lng) { 

     var convertLat = Math.abs(lat); 
     var LatDeg = Math.floor(convertLat); 
     var LatMin = (Math.floor((convertLat - LatDeg) * 60)); 
     var LatCardinal = ((lat > 0) ? "n" : "s"); 

     var convertLng = Math.abs(lng); 
     var LngDeg = Math.floor(convertLng); 
     var LngMin = (Math.floor((convertLng - LngDeg) * 60)); 
     var LngCardinal = ((lng > 0) ? "e" : "w"); 

     return LatDeg + LatCardinal + LatMin + " " + LngDeg + LngCardinal + LngMin; 
} 

回答

7
function toDegreesMinutesAndSeconds(coordinate) { 
    var absolute = Math.abs(coordinate); 
    var degrees = Math.floor(absolute); 
    var minutesNotTruncated = (absolute - degrees) * 60; 
    var minutes = Math.floor(minutesNotTruncated); 
    var seconds = Math.floor((minutesNotTruncated - minutes) * 60); 

    return degrees + " " + minutes + " " + seconds; 
} 

function convertDMS(lat, lng) { 
    var latitude = toDegreesMinutesAndSeconds(lat); 
    var latitudeCardinal = Math.sign(lat) >= 0 ? "N" : "S"; 

    var longitude = toDegreesMinutesAndSeconds(lng); 
    var longitudeCardinal = Math.sign(lng) >= 0 ? "E" : "W"; 

    return latitude + " " + latitudeCardinal + "\n" + longitude + " " + longitudeCardinal; 
} 

這裏有一個關於這個代碼是如何工作的解釋:

  • 的緯度和經度的處理方法是大同小異的,所以我將其抽象爲toDegreesMinutesAndSeconds函數。這將返回一個字符串,它會顯示,度,分,秒。
    • 此功能將以座標開始並截斷它。此值爲正值,即爲您的度數。
    • 小數部分需要轉換爲分鐘。我們從這個四捨五入中取出剩餘部分,然後乘以60.
    • 我們應用相同的邏輯來獲得秒數:所以我們只使用截斷數字作爲字符串,但我們保留非截斷來獲取小數部分。
  • 最後,我們檢查座標的原始值是正值還是負值。對於緯度,正值(或零)爲北,否則爲南。對於經度,正數(或零)是東,否則是西。
0

我決定簡單地把你的數學分開來做。我與你的答案相差一度,所以我會把這個問題記錄下來 - 我不知道確切的規則來做這個轉換。

var src = [38.898556, -77.037852]; 
 

 

 
// 38 53 55 N 
 
// 77 2 16 W 
 

 
function convertToDMS(src) { 
 
    function toDMS(n) { 
 
    // The sign doesn't matter 
 
    n = Math.abs(n); 
 

 
    // Get the degrees 
 
    var d = Math.floor(n); 
 
    // Strip off the answer we already have 
 
    n = n - d; 
 
    // And then put the minutes before the '.' 
 
    n *= 60; 
 
    
 
    // Get the minutes 
 
    var m = Math.floor(n); 
 
    // Remove them from the answer 
 
    n = n - m; 
 
    // Put the seconds before the '.' 
 
    n *= 60; 
 
     
 
    // Get the seconds 
 
    // Should this be round? Or rounded by special rules? 
 
    var s = Math.floor(n); 
 

 
    // Put it together. 
 
    return "" + d + " " + m + " " + s; 
 

 
    } 
 

 
    var dir0 = src[0] > 0 ? "N" : "S"; 
 
    
 
    var dir1 = src[1] > 0 ? "E" : "W"; 
 
    
 
    
 
    
 
    
 
    console.log(toDMS(src[0]) + dir0); 
 
    console.log(toDMS(src[1]) + dir1); 
 

 
} 
 

 

 
convertToDMS(src);

相關問題