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.
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.
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;
}
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;
}
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;
}
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()
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;
}