2009-07-16 24 views
20

Tengo información GPS se presenta en la forma:conversión de latitud y longitud en valores decimales

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

puedo usar el javascript functions of Chris Veness para convertir grados, minutos y segundos a grados numéricos, pero primero es necesario 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 sintáctico. ¿Cuál es la mejor manera de analizar esta cadena en latitud y longitud para utilizarla en la función de conversión?

El resultado de todo esto será un enlace web al que se puede hacer clic para ver una representación de la ubicación del mapa de Google.

+2

¿Qué es exactamente el formato de la salida que está buscando? ¿Es algo así como: "36 57 9 N" y "110 4 21 W" por la entrada que ha dado? ¿La entrada siempre viene en esta forma? –

+0

Para las entradas que he mostrado, esperaría que la salida fuera de dos valores: 36.95250 -110.07250 Y sí, la entrada siempre es de esta forma. –

+0

Eso debería decir "dos valores: 36.95250 y -110.07250 (sin el" y "por supuesto). Lo siento. –

Respuesta

41

Para analizar su entrada, utilice 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]); 
} 

A continuación se va a 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; 
} 

Por lo que su entrada produciría lo siguiente:

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

coordenadas decimales se pueden introducir en los mapas de Google para obtener puntos a través de GLatLng(lat, lng) (Google Maps API)

+0

Quizás un poco mejor: var parts = input.split (/ [^ \ d \ w] + /). Ajustar las compensaciones por -1. – Inshallah

+0

@Inshalla - ¡gracias! –

+0

¡Debería funcionar! Lo intentaré esta noche Gracias a todos los que respondieron ¡Este sitio es el mejor! –

2

Joe, el guión que tienes mencionado ya hizo lo que quiere. Con él se puede convertir lat y largo y ponerlo en 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() 
3

Tengo algo de NaN de esta función y tenía que hacer esto (no me pregunten 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; 
} 
2

aquí es 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 lat/long types, 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.

4

Mi versión ajustada fuerza las partes de la cadena en Números para que puedan ser realmente agregadas juntas en vez de concatenarse. También se ocupa de los valores decimales que son comunes para el componente de 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]); 
} 

A continuación se va a 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; 
} 
9

ha corregido las funciones anteriores e hicieron la salida de 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; 
} 
+0

si saber de antemano que 60 * 60 es 3600 ¿por qué calcular? –

0

I utilizarse \ d + (\, \ d +) y \ d + (.\ D +) porque pueden 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; 
    } 
Cuestiones relacionadas