NMEA形式の緯度と経度があり、10進値に変換したい。公式はありますか?たとえば、NMEA形式の緯度= 35.15Nおよび経度= 12849.52 E
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;
}
?>
はい、NMEAフォーマットはddmm.mmmm、n/s(d)ddmm.mmmm、e/wです。
度と分から小数度を取得するには、次の式を使用します。
(d)dd +(mm.mmmm/60)(* WおよびSの場合は-1)
ここに素敵な小さな計算機があります: http://www.hiddenvision.co.uk/ez/
これは、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;