web-dev-qa-db-ja.com

緯度と経度を10進値に変換する

GPS情報を次の形式で提示しています。

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

Chris VenessのJavaScript関数 を使用して、度、分、秒を数値の度に変換できますが、最初にGPS情報を個々の緯度と経度の文字列(NSEWサフィックス付き)に解析する必要があります。私は、stackoverflowに関する関連する記事を読みましたが、正規表現の専門家(プログラマーでもありません)ではなく、構文解析機能について支援が必要です。変換関数で使用するためにこの文字列を緯度と経度に解析する最良の方法は何ですか?

このすべての結果は、クリックして場所のGoogleマップ表現を表示できるWebリンクになります。

29
Joe Colson

入力を解析するには、以下を使用します。

_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
_

小数点座標をGoogleマップに入力して、GLatLng(lat, lng)を介してポイントを取得できます( Google Maps API

51
Gavin Miller

上記の関数を修正し、出力をオブジェクトにしました。

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;
}
13
Peter John

私の微調整バージョンでは、文字列の一部を数値に強制変換して、連結ではなく実際に追加できるようにします。また、Secondsコンポーネントに共通の10進値も処理します。

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;
}
6
matt burns

私はこの関数についていくつかの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;
}
3
Peter Childs

ジョー、あなたが言及したスクリプトはあなたがしたいことをすでにやった。これを使用すると、緯度と経度を変換してリンクに入れ、Googleマップで場所を確認できます。

var url = "http://maps.google.com/maps?f=q&source=s_q&q=&vps=3&jsv=166d&sll=" + lat.parseDeg() + "," + longt.parseDeg()
2
Alex Pavlov

これが私の考えです:

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;

}

この関数は、すべてのタイプの緯度/経度型を処理するわけではありませんが、次の形式を処理します。

-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

これは私が必要としたものです。

\ d +(\、\ d +)\ d +(。\ d +)を使用しました

私の最後の機能:

 convertDMSToDD: function (dms) {
     let parts = dms.split(/[^\d+(\,\d+)\d+(\.\d+)?\w]+/);
     let degrees = parseFloat(parts[0]);
     let minutes = parseFloat(parts[1]);
     let seconds = parseFloat(parts[2].replace(',','.'));
     let direction = parts[3];

     console.log('degrees: '+degrees)
     console.log('minutes: '+minutes)
     console.log('seconds: '+seconds)
     console.log('direction: '+direction)

     let 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;
   }
1
Gustavo Rozolin