将纬度和经度转换为十进制值

IT技术 javascript regex geolocation gps geocoding
2021-03-09 02:19:36

我有以下形式的 GPS 信息:

36°57'9" 北 110°4'21" 西

我可以使用Chris Venessjavascript 函数将度、分和秒转换为数字度,但首先需要将 GPS 信息解析为单独的纬度和经度字符串(带有 NSEW 后缀)。我已经阅读过有关 stackoverflow 的相关帖子,但我不是正则表达式专家(也不是程序员)并且需要一些有关解析功能的帮助。将此字符串解析为纬度和经度以在转换函数中使用的最佳方法是什么?

所有这一切的结果将是一个 Web 链接,您可以单击该链接以查看位置的 Google 地图表示。

6个回答

要解析您的输入,请使用以下内容。

function ParseDMS(input) {
    var parts = input.split(/[^\d\w]+/);
    var lat = ConvertDMSToDD(parts[0], parts[1], parts[2], parts[3]);
    var lng = ConvertDMSToDD(parts[4], parts[5], parts[6], parts[7]);
}

以下内容会将您的 DMS 转换为 DD

function ConvertDMSToDD(degrees, minutes, seconds, direction) {
    var dd = degrees + minutes/60 + seconds/(60*60);

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

因此,您的输入将产生以下内容:

36°57'9" N  = 36.9525000
110°4'21" W = -110.0725000

可以将十进制坐标输入谷歌地图以通过GLatLng(lat, lng)谷歌地图 API获取点数

ParseDMS("36°57'9\" N") 给了我 360.95。我不明白为什么。此外,36°57'9.0" N 不起作用。
2021-04-19 02:19:36
您正在对经纬度进行 input.split() 操作,因此您正在处理字符串,因此在尝试对它们进行算术运算之前,您应该在 parseInt() 中包装度、分和秒。这给我带来了奇怪的结果。
2021-04-24 02:19:36
那应该有效!我今晚试试。感谢所有回复的人。这个网站是最好的!
2021-04-29 02:19:36
也许更好一点:var parts = input.split(/[^\d\w]+/)。将偏移量调整为 -1。
2021-05-05 02:19:36
我正在处理这个问题,但必须满足一些替代的 HMS 表示:2°28’14”N, 50 44.63N, S 038° 18.429’我只在这里展示这些,以防其他人也需要考虑它们。
2021-05-05 02:19:36

更正了上述功能并使输出成为对象。

function ParseDMS(input) {
    var parts = input.split(/[^\d\w\.]+/);    
    var lat = ConvertDMSToDD(parts[0], parts[2], parts[3], parts[4]);
    var lng = ConvertDMSToDD(parts[5], parts[7], parts[8], parts[9]);

    return {
        Latitude : lat,
        Longitude: lng,
        Position : lat + ',' + lng
    }
}


function ConvertDMSToDD(degrees, minutes, seconds, direction) {   
    var dd = Number(degrees) + Number(minutes)/60 + Number(seconds)/(60*60);

    if (direction == "S" || direction == "W") {
        dd = dd * -1;
    } // Don't do anything for N or E
    return dd;
}
@JoãoPimentelFerreira 可以更容易地快速理解。很多人可能意识到一分钟有 60 秒,一小时/度有 60 分钟,但意识到一小时/度有 3600 秒就不太明显了。
2021-04-21 02:19:36
如果你事先知道 60*60 是 3600 为什么要计算?
2021-04-30 02:19:36

我的调整版本将字符串部分强制转换为数字,以便它们实际上可以添加在一起而不是连接在一起。它还处理秒组件常见的十进制值:

function ParseDMS(input) {
    var parts = input.split(/[^\d\w\.]+/);
    var lat = ConvertDMSToDD(parts[0], parts[1], parts[2], parts[3]);
    var lng = ConvertDMSToDD(parts[4], parts[5], parts[6], parts[7]);
}

以下内容会将您的 DMS 转换为 DD

function ConvertDMSToDD(degrees, minutes, seconds, direction) {
    var dd = Number(degrees) + Number(minutes)/60 + Number(seconds)/(60*60);

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

这是我的看法:

function parse_gps( input ) {

if( input.indexOf( 'N' ) == -1 && input.indexOf( 'S' ) == -1 &&
    input.indexOf( 'W' ) == -1 && input.indexOf( 'E' ) == -1 ) {
    return input.split(',');
}

var parts = input.split(/[°'"]+/).join(' ').split(/[^\w\S]+/);

var directions = [];
var coords = [];
var dd = 0;
var pow = 0;

for( i in parts ) {

    // we end on a direction
    if( isNaN( parts[i] ) ) {

        var _float = parseFloat( parts[i] );

        var direction = parts[i];

        if( !isNaN(_float ) ) {
            dd += ( _float / Math.pow( 60, pow++ ) );
            direction = parts[i].replace( _float, '' );
        }

        direction = direction[0];

        if( direction == 'S' || direction == 'W' )
            dd *= -1;

        directions[ directions.length ] = direction;

        coords[ coords.length ] = dd;
        dd = pow = 0;

    } else {

        dd += ( parseFloat(parts[i]) / Math.pow( 60, pow++ ) );

    }

}

if( directions[0] == 'W' || directions[0] == 'E' ) {
    var tmp = coords[0];
    coords[0] = coords[1];
    coords[1] = tmp;
}

return coords;

}

此函数不处理所有类型的 lat / long 类型,但它处理以下格式:

-31,2222,21.99999
-31 13 13 13.75S, -31 13 13 13.75W
-31 13 13 13.75S -31 13 13 13.75W
-31 13 13 13.75W -31 13.75S
36°57'9" N 110°4'21" W
110°4'21" W 36°57'9"N

这就是我需要的。

比其他解决方案好得多:-)
2021-04-20 02:19:36

我在这个函数上得到了一些 NaN 并且需要这样做(不要问我为什么)

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