如何将十进制度表示的经纬度转换为度分秒格式?

15

假设我有一个纬度经度: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;
}
5个回答

46
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。
    • 我们使用相同的逻辑来获取秒:因此我们仅使用被截断的数字来生成我们的字符串,但我们保留非截断数字以获取小数部分。
  • 最后,我们检查坐标的原始值是否为正或负。对于纬度而言,正(或零)表示北半球,否则表示南半球。对于经度而言,正(或零)表示东半球,否则表示西半球。

你为什么需要 Math.sign?坐标-45仍然小于0,而34仍然大于0。 - Radvylf Programs
@RedwolfPrograms 要确定基准点,请查看最后一项。如果您认为我漏掉了什么,请告诉我! - Alpha
你不需要使用 Math.sign 来检查数字是否小于/大于0。lat >= 0 同样有效,我已经测试过了。 - Radvylf Programs
@RedwolfPrograms 啊哈——我明白了!是的,那样肯定更容易理解和阅读。我会更新的。谢谢! - Alpha
如果您想要保留两位小数的秒数,请使用 var seconds = Math.round(((minutesNotTruncated - minutes) * 60) * 100.0) / 100.0; - Kim Tiago Baptista

3
这里是我为此创建的两个简单函数; 只需将DMS提供给脚本即可。
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;
}

反之亦然,只需将度数提供给脚本,并对纬度(latitude)进行真或假的判断。

function ConvertDEGToDMS(deg, lat) {
    var absolute = Math.abs(deg);

    var degrees = Math.floor(absolute);
    var minutesNotTruncated = (absolute - degrees) * 60;
    var minutes = Math.floor(minutesNotTruncated);
    var seconds = ((minutesNotTruncated - minutes) * 60).toFixed(2);

    if (lat) {
        var direction = deg >= 0 ? "N" : "S";
    } else {
        var direction = deg >= 0 ? "E" : "W";
    }

    return degrees + "°" + minutes + "'" + seconds + "\"" + direction;
}

希望这能帮助人们...


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);


0
这是一个将十进制度数的经纬度转换为DMS格式的简短解决方案:
我在纬度和经度之间使用了分隔符“/”,但如果您喜欢,可以将其删除。

function toDMS(lat,long) {
const toDMS=coord=>{min=~~(minA=((a=Math.abs(coord))-(deg=~~a))*60);
return deg+"° "+min+"' "+Math.ceil((minA-min)*60)+'"';
};
return `${lat>=0?"N":"S"} ${toDMS(lat)} / ${long>=0?"E":"W"} ${toDMS(long)}`;
}

// examples
console.log(toDMS( 22.22222, 11.11111));
console.log(toDMS( -22.22222, -11.11111));


-1
将LAT和LNG转换为DMS
function toDMS(deg) {
    var d = Math.floor(deg);
    var min = Math.floor((deg - d) * 60);
    var sec = ((deg - d - min / 60) * 3600).toFixed(2);
    return d + "°" + min + "'" + sec + "\"";
}

function convertLatLngToDMS(lat, lng) {
    var latDMS = lat >= 0 ? "N" : "S";
    var lngDMS = lng >= 0 ? "E" : "W";
    
    lat = Math.abs(lat);
    lng = Math.abs(lng);
    
    var latDMSString = toDMS(lat);
    var lngDMSString = toDMS(lng);
    
    return latDMSString + " " + latDMS + " " + lngDMSString + " " + lngDMS;
}

使用方法:

const lat = 64.75960;
const lng = -104.21007;

const dms = convertLatLngToDMS(lat, lng)
console.log(dms); // 64°45'34.56" N 104°12'36.25" W


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接