Convertir coordenadas geográficas grados-minutos-segundos a notacional decimal (3)

Introducción.

Después de encontrar dos métodos (A y B) para la conversión de coordenadas entre formatos decimal y grados, minutos y segundos, encontré en el libro HTML5 Geolocation de Anthony T. Holdener III la implementación de dos funciones en Javascript que realizan con precisión este procedimiento y que me parecieron muy intersantes.  Este corto libro es en general muy interesante y recomiendo su lectura.

Conversión de coordenadas: formato decimal a grados-minutos-segundos.

/**
 * Convierte una coordenada en formato decimal a su correspondiente
 * versión en formato grados-minutos-segundos.
 *
 * @param	Float	Valor real de la coordenada.
 * @param	Int	Tipo de la coordenada {Coordenada.LATITUD, Coordenada.LONGITUD}.
 * @return	Array	['grados', 'minutos', 'segundos', 'direccion', 'valor'].
 */

function dec2gms(valor, tipo)
{
	grados    = Math.abs(parseInt(valor));
	minutos   = (Math.abs(valor) - grados) * 60;
	segundos  = minutos;
	minutos   = Math.abs(parseInt(minutos));
	segundos  = Math.round((segundos - minutos) * 60 * 1000000) / 1000000;
	signo     = (valor < 0) ? -1 : 1; 	direccion = (tipo == Coordenada.LATITUD) ?
                    ((signo > 0) ? 'N' : 'S') :
	            ((signo > 0) ? 'E' : 'W');

	if(isNaN(direccion))
		grados = grados * signo;

	return {
		'grados'   : grados,
		'minutos'  : minutos,
		'segundos' : segundos,
		'direccion': direccion,
		'valor'    : grados + "u00b0 " + minutos + "' "+ segundos +
		             """ + ((isNaN(direccion)) ? (' ' + direccion) : '')
	};
}

Por ejemplo.

var x = 48.853;

r1 = dec2gms(x, Coordenada.LATITUD);

alert('Conversion dec2gms = ' + r1.valor);

Conversión de coordenadas: formato grados-minutos-segundos a decimal.

/**
 * Convierte una coordenada en formato grados-minutos-segundos a su
 * correspondiente versión en formato decimal.
 *
 * @param	Float	Grados de la coordenada.
 * @param	Float	Minutos de la coordenada.
 * @param	Float	Segundos de la coordenada.
 * @param	String	Sentido de la coordenada {Coordenada.NORTE,
					Coordenada.SUR, Coordenada.ORIENTE,
					Coordenada.OCCIDENTE}
 * @return	Array	['decimal', 'valor'].
 */

function gms2dec(grados, minutos, segundos, direccion)
{
	if(direccion)
	{
		signo     = (direccion.toLowerCase() == 'w' ||
		             direccion.toLowerCase() == 's') ?
		            -1 : 1;
		direccion = (direccion.toLowerCase() == 'w' ||
		             direccion.toLowerCase() == 's' ||
		             direccion.toLowerCase() == 'n' ||
		             direccion.toLowerCase() == 'e') ?
		            direccion.toLowerCase() : '';
	}
	else
	{
		signo     = (grados < 0) ? -1 : 1;
		direccion = '';
	}

	dec = Math.round((Math.abs(grados) + ((minutos * 60) + segundos) / 3600) * 1000000) / 1000000;

	if(isNaN(direccion) || direccion == '')
		dec = dec * signo;

	return {
		'decimal': dec,
		'valor'  : dec + "u00b0" + ((isNaN(direccion) || direccion == '') ? (' ' + direccion) : '')
	};
}

Por ejemplo.

var xg = 48;
var xm = 51;
var xs = 10.8;

r2 = gms2dec(xg, xm, xs, Coordenada.NORTE);

alert('Conversion gms2dec = ' + r2.valor);

Código fuente y demostración.

Obtenga el código fuente del artículo junto con la ejecución de la demostración en la siguiente ubicación.

http://demo.jorgeivanmeza.com/JavaScript/CoordConverter/0.3/

Convertir coordenadas geográficas grados-minutos-segundos a notacional decimal (2): versión simple

Introducción.

El método que utilizo habitualmente para realizar la conversión entre notaciones de coordenadas se basa en el método descrito anteriormente y es mas simple aunque aparentemente tiene un ligeramente mayor margen de pérdida de decimales en los cálculos.

A continuación se describe rápidamente las fórmulas matemáticas utilizadas para estos cálculos y se presentan los enlaces para la aplicación de deomstración y el formulario en Excel para pruebas.

Procedimiento.

Notación Grados-Minutos-Segundos a notación decimal.

latitude_sign = (latitude_dir == “N”) ? 1 : -1;
latitude  = (latitude_deg  + (latitude_min / 60.0)  + (latitude_sec / 60.0 / 60.0))  * latitude_sign;

longitude_sign = (longitude_dir == “E”) ? 1 : -1;
longitude = (longitude_deg + (longitude_min / 60.0) + (longitude_sec / 60.0 / 60.0)) * longitude_sign;

Notación Decimal a notación Grados-Minutos-Segundos.

latitude_deg = Math.floor(Math.abs(latitude));
latitude_min = Math.floor((Math.abs(latitude) – latitude_deg) * 60);
latitude_sec = Math.ceil(((Math.abs(latitude) – latitude_deg) * 60 – latitude_min) * 60);
latitude_dir = (latitude_sign > 0) ? “N” : “S”;

longitude_deg = Math.floor(Math.abs(longitude));
longitude_min = Math.floor((Math.abs(longitude) – longitude_deg) * 60);
longitude_sec = Math.ceil(((Math.abs(longitude) – longitude_deg) * 60 – longitude_min) * 60);
longitude_dir = (longitude_sign > 0) ? “E” : “W”;

Enlaces.

Convertir coordenadas geográficas grados-minutos-segundos a notacional decimal

Historial.

Versión 0.2 Versión mejorada apropiando el código de  Anthony T. Holdener.
(mayor precisión en los cálculos) 
Versión 0.1a Simplificación de los cálculos realizados.
Versión 0.1 Basado en la implementación de la aplicación de FCC.
(este artículo) 

Introducción.

Finalmente pude encontrar el método para convertir las coordenadas geográficas desde la notación grados-minutos-segundos a la notación decimal y viceversa.  La aplicación de la FCC para esta conversión me ayudó bastante.

La utilidad de esta conversión radica en que muchas veces se manejan las coordenadas en el formato GMS (latitud 5o4’59” norte y longitud 75o30’0″ oeste) mientras que muchas páginas web y aplicaciones (incluído Google Maps) requieren la información en la notación decimal (latitud 5.083056 y longitud -75.5).

Durante los experimentación se creó una clase en Javascript que expone dos métodos simplificados para realizar estas conversiones.  Los cálculos pueden ser fácilmente migrados a otros lenguajes de programación ya que sólo utilizan funciones matemáticas como floor, abs y round además de los operadores aritméticos.

Demostración.

Para la prueba y demostración de la clase Javascript se desarrolló un formulario muy sencillo que permite realizar la transformación de coordenadas geográficas entre las dos notaciones mencionadas.

Demostración de la conversión de coordenadas
Demostración de la conversión de coordenadas

En la demostración puede verificar las coordenadas enunciadas anteriormente las cuales corresponden con la ciudad de Manizales/Caldas/Colombia.

Notación GMS.

  • latitud: 5o4’59” N
  • longitud: 75o30’0″ W

Notación decimal.

  • latitud: 5.083056
  • longitud: -75.5

Enlaces.