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

31 javascript regex gps geocoding geolocation

我有以下表格中提供的GPS信息:

36°57'9"N 110°4'21"W

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

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

Gav*_*ler 53

要解析您的输入,请使用以下命令.

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]);
}
Run Code Online (Sandbox Code Playgroud)

以下内容将您的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;
}
Run Code Online (Sandbox Code Playgroud)

所以你的输入会产生以下结果:

36°57'9" N  = 36.9525000
110°4'21" W = -110.0725000
Run Code Online (Sandbox Code Playgroud)

十进制坐标可以输入谷歌地图以获得积分GLatLng(lat, lng)(谷歌地图API)

  • 你在lat/long上做input.split(),所以你正在使用字符串,所以你应该在parseInt()中包含度,分和秒,然后再对它们进行算术运算.这给我带来了奇怪的结果. (2认同)

小智 14

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

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;
}
Run Code Online (Sandbox Code Playgroud)


mat*_*rns 6

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

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]);
}
Run Code Online (Sandbox Code Playgroud)

以下内容将您的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;
}
Run Code Online (Sandbox Code Playgroud)


小智 5

这是我的看法:

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;
Run Code Online (Sandbox Code Playgroud)

}

此函数不处理所有类型的 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
Run Code Online (Sandbox Code Playgroud)

这就是我需要的。

  • 比其他解决方案好得多:-) (2认同)