web-dev-qa-db-fra.com

Conversion de latitude et longitude en valeurs décimales

J'ai des informations GPS présentées sous la forme:

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

Je peux utiliser les fonctions javascript de Chris Veness pour convertir les degrés, minutes et secondes en degrés numériques, mais il faut d’abord analyser les informations GPS dans les chaînes de latitude et de longitude individuelles (avec les suffixes NSEW). J'ai lu des articles sur stackoverflow, mais je ne suis pas un expert en regex (ni un programmeur) et j'ai besoin d'aide pour la fonction d'analyse. Quel est le meilleur moyen d’analyser cette chaîne en latitude et en longitude pour l’utiliser dans la fonction de conversion?

Le résultat de tout cela sera un lien Web sur lequel on peut cliquer pour voir une représentation cartographique de Google Map.

26
Joe Colson

Pour analyser votre entrée, utilisez ce qui suit.

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

Ce qui suit va convertir votre DMS en 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;
}

Donc, votre contribution produirait ce qui suit:

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

Des coordonnées décimales peuvent être introduites dans Google Maps pour obtenir des points via GLatLng(lat, lng) ( Google Maps API ).

48
Gavin Miller

Corrigé les fonctions ci-dessus et fait de la sortie un objet.

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

Ma version modifiée convertit les parties de chaîne en nombres de sorte qu'elles puissent être réellement ajoutées ensemble plutôt que concaténées. Il gère également les valeurs décimales communes au composant 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]);
}

Ce qui suit va convertir votre DMS en 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;
}
5
matt burns

J'ai quelques NaN sur cette fonction et je devais le faire (ne me demandez pas pourquoi)

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

Joe, le script que vous avez déjà mentionné faisait ce que vous voulez. Avec cela, vous pouvez convertir lat et long et le mettre en lien pour voir l'emplacement sur Google map

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

voici mon point de vue sur ceci:

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;

}

Cette fonction ne gère pas tous les types de types lat/long, mais gère les formats suivants:

-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

C'est ce dont j'avais besoin. 

2

J'ai utilisé\d + (\,\d +) et\d + (.\D +) car peut avoir des nombres flottants

Ma dernière fonction:

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