きまブログ

5/31 はてなダイアリーから移行しました。


GPSロガー(GPS-CS3K)から必要なデータを抽出する。

GPSロガー(GPS-CS3K使用レポート - きまブログ)で保存されたファイルを,加工しやすいように必要項目だけを抜き出します。


抽出くらいならawkワンライナーでいけるだろう。と高を括っていましたが,
フォーマットの変換も行うと結構長いワンライナーになってしまいました...


まず,抽出するGPSロガーのフォーマット。
これが,1レコードになります。(場所は,斑尾高原スキー場です。)

$GPGGA,053246,3650.9855,N,13816.5343,E,1,06,01.5,01035.9,M,037.3,M,00,0000*42
$GPGSA,A,3,13,23,17,20,02,04,,,,,,,02.9,01.5,02.4*0A
$GPGSV,3,1,10,04,66,340,34,17,57,171,36,13,51,105,42,23,36,059,40*70
$GPGSV,3,2,10,02,31,300,36,10,24,242,35,20,15,054,38,12,14,299,24*74
$GPGSV,3,3,10,05,09,240,00,30,00,325,00,,,,,,,,*75
$GPRMC,053246,A,3650.9855,N,13816.5343,E,002.2,183.6,291209,,,A*76
$GPVTG,183.6,T,,M,002.2,N,004.0,K,A*05

この中から,移動記録をとるために必要で,取り出したい項目とフォーマットは以下の6項目。

日付(DDMMYY),時刻(hhmmss),経度(度),緯度(度),高度(m),スピード(km/h)

時刻,経度,緯度,高度だけなら,$GPGGAが先頭にある行を抜き出せばよかったのですが,
日付とスピードを同時に抽出するためには,$GPRMC か $GPVTG の行も抜き出さなくてはならないので,
レコード分割をどうするか考えなければなりません。


awkは,改行がレコードの境界のデフォルトであるため,1行1レコードとなりますが,
ここでは「$GPGGA,」というキーワードをレコードの境界に設定します。
これで,上の引用部分が,複数行にわたり,1レコードとして認識されます。
また「-F,」により,カンマがフィールドの境界に設定しているので,
あとは,欲しいデータのフィールドの順番を数えていきます。

そして,抽出するワンライナーは,以下のとおり。

awk -F,
'BEGIN{RS = "\$GPGGA,"};
{printf("%s,%06d,%3.8f,%3.8f,%.1f,%.1f\n",$97,$1+90000,int($4/100)+$4%100/60,int($2/100)+$2%100/60,$9,$107)}'
WG20091228184105a.log

awk -F,:デリミタをカンマにする。

→ BEGIN{RS = "\$GPGGA,"}:通常は改行がレコード分割を$GPGGAにする。

→ printf("フォーマット",変数...)

表記 意味 フォーマット 備考
$97 日付 DDMMYY → %s (DDMMYY) そのまま
$1+90000 時刻 hhmmss → %06d(hhmmss) UTCなので90000足してJSTにする。
int($4/100)+$4%100/60 緯度 xx度xx.xx分 → %3.8f (度) int(x/100)で度だけを抽出,x%100/60で分を度に変換
int($2/100)+$2%100/60 経度 xx度xx.xx分 → %3.8f (度)
$9 高度 → %.1f (m) そのまま
$107 スピード → %.1f (km/h) そのまま