it-swarm.com.de

Breiten- und Längengrad in Dezimalwerte umwandeln

Ich habe GPS-Informationen in der folgenden Form:

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

Ich kann die javascript-Funktionen von Chris Veness verwenden, um Grad, Minuten und Sekunden in numerische Grade umzuwandeln, aber zuerst müssen die GPS-Informationen in die einzelnen Breiten- und Längengrade (mit NSEW-Suffixen) analysiert werden. Ich habe verwandte Artikel über stackoverflow gelesen, bin aber kein Regex-Experte (noch Programmierer) und brauche Hilfe bei der Parsing-Funktion. Was ist der beste Weg, diese Zeichenfolge in Längen- und Breitengrad für die Konvertierungsfunktion zu analysieren?

Das Ergebnis ist ein Weblink, auf den Sie klicken können, um eine Google-Kartendarstellung des Standorts anzuzeigen.

26
Joe Colson

Um Ihre Eingabe zu analysieren, verwenden Sie Folgendes.

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

Im Folgenden wird Ihr DMS in DD konvertiert

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

Ihre Eingabe würde also Folgendes erzeugen:

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

Dezimalkoordinaten können in Google Maps eingegeben werden, um Punkte über GLatLng(lat, lng) ( Google Maps API ) zu erhalten.

48
Gavin Miller

Die obigen Funktionen wurden korrigiert und die Ausgabe zu einem Objekt gemacht.

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

Meine optimierte Version zwingt die String-Parts in Numbers, sodass sie tatsächlich zusammengefügt und nicht verkettet werden können. Es verarbeitet auch Dezimalwerte, die für die Komponente "Sekunden" üblich sind:

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

Im Folgenden wird Ihr DMS in DD konvertiert

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

Ich habe einige NaNs für diese Funktion und musste dies tun (frag mich nicht warum)

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, das Skript, das du erwähnt hast, hat getan, was du willst. Mit ihm können Sie Lat und Long konvertieren und in einen Link einfügen, um den Standort in der Google-Karte anzuzeigen:

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

hier ist meine Meinung dazu:

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;

}

Diese Funktion behandelt nicht alle Arten von Lat/Long-Typen, sondern die folgenden Formate:

-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

Was ich brauchte. 

Ich habe\d + (\,\d +) und\d + (.\D +) verwendet, da Float-Nummern vorhanden sein können

Meine letzte Funktion:

 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