Saltar al contenido

¿Cómo convertir la latitud y la longitud de los datos en formato NMEA a decimal?

Solución:

El formato de las coordenadas NMEA es (d) ddmm.mmmm
d = grados y m = minutos
Hay 60 minutos en un grado, así que divida los minutos entre 60 y súmelos a los grados.

Para la latitud = 35,15 N
35.15 / 60 = .5858 N

Para la longitud = 12849.52 E,
128+ 49.52 / 60 = 128.825333 E

En php, puedes hacer esto:

<?php
$lng = "12849.52 W";

$brk = strpos($lng,".") - 2;
if($brk < 0){ $brk = 0; }

$minutes = substr($lng, $brk);
$degrees = substr($lng, 0,$brk);

$newLng = $degrees + $minutes/60;

if(stristr($lng,"W")){
    $newLng = -1 * $newLng;
}

?>

Sí, el formato NMEA es ddmm.mmmm, n / s (d) ddmm.mmmm, e / w

Para llegar a grados decimales de grados y minutos, use la siguiente fórmula:

(d) dd + (mm.mmmm / 60) (* -1 para W y S)

Hay una pequeña calculadora aquí: http://www.hiddenvision.co.uk/ez/

Aquí hay una función C minimalista para hacerlo.

Devuelve coordenadas decimales y se alimentará con la coordenada NMEA y el cuadrante respectivo o carácter “indicador” (N, S, E, W). P.ej:

float latitude= GpsToDecimalDegrees("4349.7294",'N');
// latitude == 43.82882

float longitude= GpsToDecimalDegrees("10036.1057",'W');
// latitude == 43.82882

No está optimizado, pero debe ser legible, seguro y cumple su función:

/**
 * Convert NMEA absolute position to decimal degrees
 * "ddmm.mmmm" or "dddmm.mmmm" really is D+M/60,
 * then negated if quadrant is 'W' or 'S'
 */
float GpsToDecimalDegrees(const char* nmeaPos, char quadrant)
{
  float v= 0;
  if(strlen(nmeaPos)>5)
  {
    char integerPart[3+1];
    int digitCount= (nmeaPos[4]=='.' ? 2 : 3);
    memcpy(integerPart, nmeaPos, digitCount);
    integerPart[digitCount]= 0;
    nmeaPos+= digitCount;
    v= atoi(integerPart) + atof(nmeaPos)/60.;
    if(quadrant=='W' || quadrant=='S')
      v= -v;
  }
  return v;
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *