如何将lat long从十进制度转换为DMS格式?

时间:2016-06-18 04:06:16

标签: javascript

假设我有纬度经度:38.898556,-77.037852。如何将其转换为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;
}

3 个答案:

答案 0 :(得分:16)

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 = lat >= 0 ? "N" : "S";

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

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

以下解释了此代码的工作原理:

  • 纬度和经度的处理方法几乎相同,因此我将其抽象为toDegreesMinutesAndSeconds函数。这将返回一个字符串,它将显示度,分,秒。
    • 此函数将以坐标开始并截断它。这个值是正数,是你的度数。
    • 小数部分需要转换为分钟。我们从该四舍五入中得到了剩余的东西,然后将它乘以60。
    • 我们应用相同的逻辑来获取秒:所以我们只使用截断的数字作为字符串,但我们保留非截断的数字来获取小数部分。
  • 最后,我们检查坐标的原始值是正还是负。对于纬度,正(或零)是北,否则是南。对于经度,正(或零)是东,否则,西。

答案 1 :(得分: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);

答案 2 :(得分:0)

这是我为此创建的两个简单函数; 只需将dms交给脚本

  drop(event: CdkDragDrop<string[]>) {
    moveItemInArray(this.movies, event.previousIndex, event.currentIndex);
  }

  stopIt(e) {
    e.stopPropagation();
  }

反之亦然,只是给出脚本的度数,纬度(纬度)为假

function ConvertDMSToDEG(dms) {   
    var dms_Array = dms.split(/[^\d\w\.]+/); 
    var degrees = dms_Array[0];
    var minutes = dms_Array[1];
    var seconds = dms_Array[2];
    var direction = dms_Array[3];

    var deg = (Number(degrees) + Number(minutes)/60 + Number(seconds)/3600).toFixed(6);

    if (direction == "S" || direction == "W") {
        deg = deg * -1;
    } // Don't do anything for N or E
    return deg;
}

希望这对人们有帮助。