2016-06-18 51 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);

相关问题