web-dev-qa-db-ja.com

NMEAフォーマットデータの緯度と経度を10進数に変換する方法は?

NMEA形式の緯度と経度があり、10進値に変換したい。公式はありますか?たとえば、NMEA形式の緯度= 35.15Nおよび経度= 12849.52 E

6
NajLinus

NMEA座標の形式は(d)ddmm.mmmmです。
d =度およびm =分
度には60分があるので、分を60で割り、それを度に追加します。

緯度= 35.15Nの場合
35.15/60 = .5858 N

経度= 12849.52 Eの場合、
128+ 49.52/60 = 128.825333 E

PHPでは、これを行うことができます:

<?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;
}

?>
10
johnDoe

はい、NMEAフォーマットはddmm.mmmm、n/s(d)ddmm.mmmm、e/wです。

度と分から小数度を取得するには、次の式を使用します。

(d)dd +(mm.mmmm/60)(* WおよびSの場合は-1)

ここに素敵な小さな計算機があります: http://www.hiddenvision.co.uk/ez/

8
xrgb

これは、double値が問題となる小さなデバイス用です。これはcコードで行われますが、別の言語に簡単に変更できます。

void GetGPSPos(char *str,char *NMEAgpspos,uint8_t sign)
{
  unsigned short int u=0,d=0;
  unsigned int minutes;
  unsigned char pos,i,j;

  for(pos=0;pos<strlen(NMEAgpspos) && NMEAgpspos[pos]!='.';pos++);

  for(i=0;i<pos-2;i++)
    {
     u*=10;
     u+=NMEAgpspos[i]-'0';
    }
  d=(NMEAgpspos[pos-2]-'0')*10;
  d+=(NMEAgpspos[pos-1]-'0');
  for(i=pos+1,j=0;i<strlen(NMEAgpspos) && j<4;i++,j++) //Only 4 chars
    {
     d*=10;
     d+=NMEAgpspos[i]-'0';
    }


  minutes=d/60;
  sprintf(str,"%d.%04d",(sign?-1:1)*u,minutes);
}

sprintfがない場合、または「%04」が許可されていない場合(私の場合のように)、sprintfの行を次のように変更します。

  pos=0;
  if(sign)
    str[pos++]='-';
  if(u>100)
    str[pos++]=u/100+'0';
  if(u>10)
    str[pos++]=u/10%10+'0';
  str[pos++]=u%10+'0';
  str[pos++]='.';
  str[pos++]=minutes/1000+'0';
  str[pos++]=minutes/100%10+'0';
  str[pos++]=minutes/10%10+'0';
  str[pos++]=minutes%10+'0';
  str[pos++]=0;
0
hamboy75