如何在jQuery、JavaScript和PHP中将GPS度数转换为十进制和相反方向的转换?

6

有人知道如何将GPS度数转换为十进制值或反之?

我需要开发一种方式,让用户可以插入地址并获取GPS值(包括度数和/或十进制),但是我主要需要知道如何转换这些值,因为用户还可以插入GPS值(度数或十进制)。因为我需要从Google地图获取地图,所以需要使用十进制。

我尝试了一些代码,但是得到了很大的数字...像这样的:

function ConvertDMSToDD(days, minutes, seconds, direction) {
    var dd = days + minutes/60 + seconds/(60*60);
    //alert(dd);
    if (direction == "S" || direction == "W") {
        dd = '-' + dd;
    } // Don't do anything for N or E
    return dd;
}

有人吗?

谢谢。


你的函数完美运行:http://jsfiddle.net/fuRED/2/ - Eugen Rieck
@Eugen Rieck,问题在于如果您尝试这个值ConvertDMSToDD(41, 11, 1, "N"),它会返回一个很大的数字,而谷歌地图无法识别它! - Pedro Soares
你提供的链接使用了这个公式:"form10.alat.value = Math.round(absdlat + (absmlat/60.) + (absslat/3600.) ) * latsign/1000000;"。乘法只是为了解决四舍五入问题。 - Eugen Rieck
1
好的,我找到了问题所在,原来是我传递的数值以字符串的形式传递,导致返回了一个错误的数字! ConvertDMSToDD("41", "11", "1", "N") 问题已经解决!非常感谢您的帮助。(我该如何结束这次讨论呢?) - Pedro Soares
1
这取决于您的输入!如果您输入纬度(“N”或“S”),则会得到<0表示南半球,>0表示北半球,==0表示赤道。如果您输入经度(“W”,“E”),则会得到<0表示格林威治以西,>0表示格林威治以东,==0表示零子午线。 - Eugen Rieck
显示剩余4条评论
2个回答

9

首先感谢@Eugen Rieck的帮助。

以下是我的最终代码,希望能对某些人有所帮助:

将角度转换为十进制

function getDMS2DD(days, minutes, seconds, direction) {
    direction.toUpperCase();
    var dd = days + minutes/60 + seconds/(60*60);
    //alert(dd);
    if (direction == "S" || direction == "W") {
        dd = dd*-1;
    } // Don't do anything for N or E
    return dd;
}

根据此链接,将十进制转换为度数。

function getDD2DMS(dms, type){

    var sign = 1, Abs=0;
    var days, minutes, secounds, direction;

    if(dms < 0)  { sign = -1; }
    Abs = Math.abs( Math.round(dms * 1000000.));
    //Math.round is used to eliminate the small error caused by rounding in the computer:
    //e.g. 0.2 is not the same as 0.20000000000284
    //Error checks
    if(type == "lat" && Abs > (90 * 1000000)){
        //alert(" Degrees Latitude must be in the range of -90. to 90. ");
        return false;
    } else if(type == "lon" && Abs > (180 * 1000000)){
        //alert(" Degrees Longitude must be in the range of -180 to 180. ");
        return false;
    }

    days = Math.floor(Abs / 1000000);
    minutes = Math.floor(((Abs/1000000) - days) * 60);
    secounds = ( Math.floor((( ((Abs/1000000) - days) * 60) - minutes) * 100000) *60/100000 ).toFixed();
    days = days * sign;
    if(type == 'lat') direction = days<0 ? 'S' : 'N';
    if(type == 'lon') direction = days<0 ? 'W' : 'E';
    //else return value     
    return (days * sign) + 'º ' + minutes + "' " + secounds + "'' " + direction;
}
alert(getDD2DMS(-8.68388888888889, 'lon'));

`


1
我知道这是一篇旧帖子,但非常感谢您发布最终代码。我过去一小时一直在尝试做这件事。我非常感激。 - ZeroBased_IX

2

无法使上述脚本正常工作,经过一段时间后得出了以下解决方案:只需将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;
}

将角度提供给脚本,并对纬度(lat)进行真或假的操作,反之亦然。

最初的回答:

只需将度数提供给脚本,并针对纬度(lat)提供真或假,反之亦然。

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

最初的回答:希望这对人们有所帮助...

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