javascript - planas - Conversión de latitud y longitud a valores decimales
convertir grados minutos y segundos a decimales en excel (7)
Tengo la información del GPS presentada en el formulario:
36 ° 57''9 "N 110 ° 4''21" O
Puedo usar las funciones javascript de Chris Veness para convertir grados, minutos y segundos a grados numéricos, pero primero debo analizar la información del GPS en las cadenas de latitud y longitud individuales (con sufijos NSEW). He leído publicaciones relacionadas sobre stackoverflow, pero no soy un experto en expresiones regulares (ni un programador) y necesito ayuda con la función de análisis. ¿Cuál es la mejor manera de analizar esta cadena en latitud y longitud para usar en la función de conversión?
El resultado de todo esto será un enlace web en el que se puede hacer clic para ver una representación de ubicación en el mapa de Google.
Aquí está mi opinión sobre esto:
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;
}
Esta función no maneja todos los tipos de tipos lat / long, pero maneja los siguientes formatos:
-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
Que es lo que necesitaba.
Corrigió las funciones anteriores y convirtió la salida en un objeto.
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;
}
Joe, el guión que has mencionado ya hizo lo que quieres. Con él puede convertir lat y long y ponerlo en un enlace para ver la ubicación en el mapa de Google:
var url = "http://maps.google.com/maps?f=q&source=s_q&q=&vps=3&jsv=166d&sll=" + lat.parseDeg() + "," + longt.parseDeg()
Mi versión modificada obliga a las partes de la cadena a Números para que realmente se puedan agregar en lugar de concatenar. También maneja valores decimales que son comunes para el componente Segundos:
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]);
}
Lo siguiente convertirá su DMS a 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;
}
Para analizar su entrada use lo siguiente.
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]);
}
Lo siguiente convertirá su DMS a 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;
}
Así que su aporte produciría lo siguiente:
36°57''9" N = 36.9525000
110°4''21" W = -110.0725000
Las coordenadas decimales se pueden incluir en google maps para obtener puntos a través de GLatLng(lat, lng)
( API de Google Maps )
Tengo algunos NaN en esta función y necesito hacer esto (no me preguntes por qué)
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;
}
Usé / d + (/, / d +) y / d + (. / D +) porque puede tener números flotantes
Mi función final:
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;
}