GPSログデータコンバータ
Last Update 07-Jul-2005
V0.39
GPSLogCv 222KB
GPSで取得できるデータと各フォーマットの関係
| 緯度/経度 | 時刻 | 高度 | 速度 | 移動方向 | 測位状態 | 測地系 | スレッド | その他 | |
|---|---|---|---|---|---|---|---|---|---|
| 1次情報 | 1次情報 | 1次情報 但し、地を這う乗り物ならその地点の標高として求められる。 (例えばKashmirで可能) |
ドップラーシフトによる場合は1次情報。 位置情報から計算する場合は2次情報。 |
位置情報から計算する2次情報。 | 1次情報 | 2次情報 | |||
| .TRK Garmin PCX5のデータ形式 |
D DM DMS |
UTC | ○ | × | × | × | 任意 | ○ | |
| .TXT Waypoint+のテキスト形式 |
D DM DMS |
UTC | × | × | × | × | 任意 | ○ | |
| .LOG Pro Atlas |
DMS | JST UTC |
× | × | × | × | Tokyo WGS84 |
× | |
| .MPS MapSource |
DEG(固定小数点) | time_t | △機種依存 | × | × | × | WGS84 | ○ | |
| .MTK(TRK) Mapfan series |
DEG/256 | × | × | × | × | × | Tokyo | × | |
| .POT | DMS | JST | ○ | × | × | × | Tokyo | ○ | 描画色など |
| .ZPO Zenrin Z[zi]II 図形ファイル |
DEG | × | × | × | × | × | × | × | |
| .NYP .(拡張子無し) Sony Navin'Youのバイナリデータ |
DEG(固定小数点) マップマッチしている場合は二次情報。 |
time_t IPS系GPSを使った場合バグあり。(注1) |
× | ○ | ○ | ○ | Tokyo | × | マップマッチ 補正(解析中) |
| .IPS SONY GPS IPS5x00シリーズ ETAK |
DM DMS |
UTC | ○ | ○ | ○ | ○ | Tokyo WGS84 他 |
-- | 衛星位置 他 |
| .NME NMEA0813準拠 |
DM | UTC | ○ | ○ | ○ | ○ 2D/3D/DGPS |
任意 規定のセンテンスだけでは判別できない。 |
-- | 衛星位置 他 |
| .STF Garmin Simple Text Format |
DM | UTC | ○ | ○ EW,NS,UDの3成分 |
× 但し、GPSLogCvが速度ベクタから計算します。 |
○ 2D/3D/DGPS |
WGS84 | -- | EPE(Estimated Position Error) |
ここで二次情報は一次情報から求められる情報という意味です。
| 無し(NNN) | R | B | Sony Navin' Youの走行パスファイル。Navin' YouのDriveLogディレクトリの下にある拡張子の無いファイルです。 |
| CSV | R/W | T | Kashmir GPSファイルツールプラグインのCSV形式。 |
| CSG/CSVg | R/W | B | SONY GtrexのCSV形式。 |
| (LOG.)FX | R/W | B | GARMIN GPSのトラックログに特化した差分フォーマットです。 |
| GDN | R/W | T | Gardown形式トラックログファイル |
| SGL | R/W | B | SONY Handy GPSログマネージャのデータ形式。Navin'You, GTrexで使えます。 |
| TRK | R/W | T | Garminの以前の標準ソフト、PCX5のトラック形式。カシミール3Dでも読み書きできます。カシミールで読み書きを行うとその地点の標高が高度として記録される、Navin'Youのデータを変換すると"渋谷-東京"と言った具合にラベルが付くので保存する場合はこのフォーマットがお勧めです。 |
| TXT | R/W | T | 有名なGarmin用フリーウェア、Waypoint+のテキスト形式。(Waypoint+の独自形式は扱えません) |
| IPS | R/W | T | IPS/ETAK/HGRフォーマットGPSの出力をキャプチャーしたもの。 |
| LOG | R/W | T | ProAtlas GPSドライバのログ形式。GPSドライバのログ再生で地図上に表示できます。ただし、ログ再生ですので、結構、時間がかかります。また、表示できるポイントに制限があるのであらかじめ間引いておくと良いでしょう。 |
| MPS | R | B | Garmin MapSourceのデータフォーマット。トラック以外のデータを含んでいても構いませんが扱うのはトラックデータのみです。 |
| MSS/MPSa | R/W | T | ProAtlas 2000以降で使用できるMapServerScript形式。本当はこれも.MPSという拡張子なのですが上の.MPSと混同しないように.MSSとしています。 |
| MTK/TRKm | R/W | T | MapFanIIのログフォーマット。ProAtlasと同じくログ再生なので制約があります。ポイント数が750と少ないので間引きは必須でしょう。PCX5の.TRKと混同しないようmtkと呼んでいます。 |
| NME | R/W | T | NMEAフォーマットGPSの出力をキャプチャーしたもの。 |
| NYP | R/W | B | Sony Navin'Youのパッケージファイル。扱えるのは走行パスだけを収めたものに限ります。 |
| NYPu | R/W | B | Sony Navin'YouのUserPointを納めたパッケージファイル。 |
| POT | R/W | T | POTフォーマット |
| POTR | R/W | T | POT Routeフォーマット。GarmapCEなどで使えます。 |
| RML | R | H | MapFan V ルートエクスプローラ形式。ルートファイルの作成に。 |
| STF | R/W | T | Garmin Simple Text Format出力をキャプチャーしたもの。(WGS84固定でない機種もありますがWGS84として扱います) |
| TDF | R/W | B | Track Diff Format。非可逆の差分フォーマットです。平均2.1バイト/ポイント。 |
| VCD | R/W | T | Kashmirの海岸線/県境ファイルです。 |
| WPT | R/W | T | Garminの以前の標準ソフト、PCX5のWayPoint形式。 |
| ZPO | R | H | Zenrin Z[Zi:]IIの図形ファイル。ルート探索の結果も図形として保存できるのでGPS用のルートファイルを作成するのに便利です。 |
使い方
GPSLogCvは、Win32コマンドラインアプリケーションで一般的なSyntaxは次のようになります。
GPSLogCv [<オプション>] <ファイル名(ワイルドカード可)>
ちょっと変わっているのは
例えばnyp2trkという名前にすると入力形式のデフォルトは.nyp,出力形式のデフォルトは.trkになります。詳細は下のフォーマット指定規則を参考にしてください。
使用例
全てのnypファイルを.TRK形式に変換します。
nyp2trk *.nyp
nypファイル内の走行パスの一覧をファイルにします。
nyp2trk -tlst *.nyp
フォーマット指定規則
優先度の高い方から順に、
1)オプションで指定する
主にフィルタとして使う時にこの方法を使います。
入力
-I[CSV|CSVg|CSG|TRK|TRKm|TXT|IPS|LOG|MPS|MTK|NME|NNN|NYP|STF|ZPO]
出力
-T[CSV|CSVg|CSG|TRK|TRKm|TXT|LOG|MSS|MPSa|MTK|NME|NYP|POT]
2)実行ファイル名をリネームしておく。GPSLogCvはunixのいくつかのコマンドと同じく自分がなんという名前で呼ばれたかによってデフォルトの動作が変わります。
Drag&Dropで特定のタイプに変換したいときはこの方法で指定します。
[input_typ]2[output_typ].exe
例えば、trk2txt.exeとリネームした場合は.TRK->.TXTと指定したことになります。この時、入力の実際の拡張子は無視されるので注意してください。逆にいうとnme2trk.exeに.NMEAや中身がNMEAの.TXTをドロップしたりできる訳です。
サポート外の拡張子を使うと無指定です。例えば、
gps2mpsa.exe なら入力は指定なし、出力は全部.MPS(Alps
Map Server Script)です。
gpslogcv.exeのように全く規定外だと両方とも無指定です。
3)入力ファイルの拡張子で指定する。
.TRKを.TXTに変換する以外は総て.TRKに変換します。
4)フィルタモードで入力ファイルタイプが特定できない場合は.TRKと仮定します。
3)のルールを適用して出力は.TXTとなります。
オプション
| GPS指定 V3.5までのNavin' YouでIPS系GPSを使用した場合の日付bug補正。 入力がnypのときのみ有効。 現在はSONYから修正プログラムが出ていますのでそちらを使用してください。 |
-G | ||
| 無指定 | 自動(デフォルト) ファイルの書きこみ日付が最終レコードの日付より新しい場合、IPSと判断します。 |
||
| IPS | IPSのとき。 | ||
| GARMIN | 無指定と同じです。 | ||
| MITSUMI | 無補正(Mobile packのとき) | ||
| データの間引き | -S | Dn | n[m]以上離れた点のみ処理します。(デフォルト:0) |
| Tn | n[sec]以上経過したデータのみ処理します。(デフォルト:1) | ||
| Hn | n[Km/h]を越えるデータをスキップします。 | ||
| Ln | n[Km/h]以下のデータをスキップします。 | ||
| A | 異常値を総てスキップします。 | ||
| 出力先 | -F | stdoutに出力します。 | |
| 異常値の処理 (未実装) |
-S | xxxx | 16進数xxxxでデータをスキップする異常の種類を指定します(デフォルト:fffe) スキップした次のデータをスレッドの最初のデータとします。 002 同一時間のデータ。 010 不正な時間データ。 020 時間を遡るデータ。 040 北緯20度-48度の範囲外。 080 緯度方向の移動速度が秒速1Kmを越えるデータ。 100 東経120度-150度の範囲外。 200 経度方向の移動速度が秒速1Kmを越えるデータ。 デフォルトはfffeです。0に設定すると総てのデータがファイルに出力されますが異常値をはねなかった場合、正常な動作は保証出来なくなります。 |
| -W | xxxx | 16進数xxxxでデータをスキップした場合に警告を出す異常の種類を指定します(デフォルト:fffc、同一時間データのスキップ以外すべての警告を出します。) 値の意味は上記-Sと同じです。-W0で一切の警告が出なくなります。 |
|
| 形式 | -Ityp | 入力フォーマットを指定します。 | |
| -Ttyp | 出力フォーマットを選択します。 | ||
| 処理 | -L | 情報一覧のみ表示します。 | |
| 出力ファイル 出力するファイルと同名のファイルがある場合の処理。変換したデータと勘違いして掛け替えの無いダウンロードしたGPSデータを削除しないよう注意してください。 |
-O | N | 上書きしません。 |
| Q | 問い合わせます。(デフォルト) 'A'を指定するとそれ以降、すべて上書きされます。'R'を指定するとそれ以降-ORと同じ動作。 |
||
| R | 末尾に_nnを付けたファイル名にrenameします。 | ||
| F | 上書きします。 | ||
| -U | 出力ファイルのタイムスタンプを最終レコードの日付と同じにします。 | ||
| 補助データ | -M | map | 地図データ名を指定します。 |
| -H | path | 走行パス名を指定します。 | |
| -Q | Pauseしない。 | ||
| -I | dir | DriveLog.idxのあるディレクトリを指定する。 指定が無い場合、入力ファイルのあるディレクトリ、実行ファイルのあるディレクトリの順に探します。 |
|
制限:
速度、進行方向はそのデータの無い形式のファイルを入力すると最初の一点は必ず速度0に、進行方向は真北になります。以降はその前のポイントの緯度/経度データから計算します。
ファイルタイプ追加の手引き
1) gpslogcv.c中のDAT_XXXを定義する。XXXは原則としてファイルタイプと同じにします。
これはフォーマットが持っている/必要になる情報及び属性のデフォルトを決める物です。
DAT_DMS/DAT_DMM 出力時にどちらか一方の選択しかできない場合に定義する。
DAT_ALT 高度情報がある/必要な場合に定義する。
DAT_TIM 時間情報がある/必要な場合に定義する。
DAT_JST 時間情報がJST固定の場合に定義する。
DAT_TKY/DAT_WGS 測地系情報がどちらか固定の場合に定義する。
DAT_DST 距離情報がある/必要な場合に定義する。
DAT_HED 進行方向情報がある/必要な場合に定義する。
DAT_STA GPS Status情報がある場合に定義する。
2) fn_Table_t inFunc[]に定義を加える。
char *name; ファイルタイプ名
int datTyp; 上記のDAT_XXX
int deflt; デフォルトの変換を定義する。通常は.TRKのインデックス=1。決して自分自身にはしないこと。
int (*func)(); 後述の入力関数
char *description; ファイルタイプの説明
3) out_Table_t outFunc[]に出力ルーチンと出力ファイルクローズ処理ルーチンを定義する。
char *name; ファイルタイプ名
int datTyp; デフォルトの属性を定義する。
void (*func)(); 後述の出力関数
int (*cls_func)(FILE *out); 後述の出力終了関数
char *description; ファイルタイプの説明
4) usage()に説明を加える。
5) gpslogcv.hに入力、出力、出力終了関数のextern宣言を加える。
6) xxx.cを作成する。
6.1) 入力関数
int in_XXX(FILE *rFile, cordinate_t *position, cnvData_t *GPSLogp)
/* global val :lbuf,datum,mParam */
渡される引数
FILE *rFile 入力ファイルのハンドラ
cordinate_t *position 位置情報を収める構造体へのポインタ
->lat 緯度を十進の度で設定する。南緯はマイナスの値を取る。
->lon 経度を十進の度で設定する。西経はマイナスの値を取る。
->alt 高度をメートル単位で設定する。
DAT_ALTの定義が無い場合は設定しなくて良い。
DAT_ALTの定義があり、値が無効な場合は-9999を設定する。
cnvData_t *GPSLogp 付随情報を収める構造体へのポインタ
->datTyp 入力によって変わる場合は、
DAT_ALT,DAT_TIM,DAT_JST,DAT_TKY/DAT_WGS,DAT_DST,DAT_HED,DAT_SATを設定する。
->thread スレッドの先頭の時、1を設定する。
dist; 一点前からの距離をmで設定する。
DAT_DSTの定義が無い場合は設定しなくて良い。
出力に必要な場合、計算されます。
->speed; 速度をKm/hで設定する。
DAT_SPDの定義が無い場合は設定しなくて良い。
出力に必要な場合、計算されます。
->head; 移動方向を0-360度の範囲で設定する。
DAT_HEDの定義が無い場合は設定しなくて良い。
出力に必要な場合、計算されます。
DAT_HEDの定義があり、値が無効な場合はマイナスの値を設定する。
->dop; リザーブ
->recTime; tm構造体の定義に従って年月日、時分秒を設定する。
DAT_TIMの定義が無い場合は設定しなくて良い。
出力に必要な場合、一定速度と仮定して移動距離から計算されます。
UTCでないとき、DAT_JSTの設定を忘れないこと。
->rcvStat; リザーブ(2D,3D,4DGPS)
->mpp; WGS84へ変換するためのmolodenskyパラメータを設定する。
DAT_WGS,DAT_TKYのどちらも定義されていない時、必須。
->satdatp; リザーブ
処理の流れ
if (nRec == 0) {
初期設定
ヘッダー読み込み
必要ならファイルの読み込みモードをバイナリに変更する。
}
上記の各変数を設定する。
正常に1レコード取り込めたら1を返す。
レコードの終わりに来たとき0を返す。
なんらかのエラーが発生した場合、-1を返す。
6.2) 出力関数
void out_TXT(FILE *out, cordinate_t *position, cnvData_t *GPSLogp)
変数
FILE *out 出力ファイルのハンドラ
その他の変数は入力関数を参照。
DAT_TIM,DAT_JST,DAT_TKY/DAT_WGS,DAT_DST,DAT_HEDが定義されていれば、
指定通りに設定/変換/計算されています。
処理の流れ
if (nRec == 0) {
初期設定
ヘッダー書き出し
必要ならファイルの書き込みモードをバイナリに変更する。
}
上記の各変数を利用して1レコード書き出す。
threadの処理がある場合は終了後、必ずthreadをゼロクリアする。ない場合でもクリアを推奨。
thread以外の引数の変更は禁止。
正常に1レコード書き出せたらレコード数nRecを一つ増やす。
なんらかのエラーが発生した場合そのままリターンできます。
呼び出し側でerrnoをチェックしているので、正常でも常にerrnoに値が設定
されるような特殊な処理を行なった場合、errclearをしておく必要があります。
6.3) 出力終了関数
入力関数が0を返した、つまりレコードが無くなったときに呼ばれます。
通常は出力ファイルを閉じるだけなのでfcloseをそのまま使用すれば良く、
特に作成する必要はありません。統計情報をとる、総て積算した値をヘッダー
に書き込む、トレイラーを書き込むなどの処理が必要な場合に作成します。
注:現在、出力処理関数で非標準の処理を行う場合、ちょっと問題があります。そのうち修正する予定です。
---
in_xxxを他のプログラムで使うには
T.B.D
out_xxxを他のプログラムで使うには
T.B.D
---
==========================================
IPSフォーマットGPS使用時の日付補正について
==========================================
Navin'Youが時間変換関数を使うときにはtm_mon=月-1としなければいけないところをtm_mon=月でやってしまっているため変換が必要でしかもその変換が一部不可逆になっているという問題があります。現在はSONYから修正プログラムが出ています。
変換が不可逆な日付(渡されるパラメータ)->正規化された日付の表を作ってみました。
=====
95/01/29(95/02/29)->95/03/01
95/01/30(95/02/30)->95/03/02
95/01/31(95/02/31)->95/03/03
----
95/02/01(95/03/01)->95/03/01
95/02/02(95/03/02)->95/03/02
95/02/03(95/03/03)->95/03/03
=====
95/03/31(95/04/31)->95/05/01
----
95/04/01(95/05/01)->95/05/01
=====
95/05/31(95/06/31)->95/07/01
----
95/06/01(95/07/01)->95/07/01
=====
95/08/31(95/09/31)->95/10/01
----
95/09/01(95/10/01)->95/10/01
=====
95/10/31(95/11/31)->95/12/01
----
95/11/01(95/12/01)->95/12/01
=====
例えば、95/10/31でも、95/11/01でも95/12/01と記録されてしまうので95/12/01が本当はどちらの日付かというのはこれだけでは分かりません。
こういう日付が一年で7つあるわけです。
なお、うるう年の時は、
===
96/01/30(96/02/30)->96/03/01
96/01/31(96/02/31)->96/03/02
----
96/02/01(96/03/01)->96/03/01
96/02/02(96/03/02)->96/03/02
となるので6つに減ります。
これではお手上げのように思えますがNavin'youは最終書き込み日付も記録しているのでこれと突き合わせればなんとかならないこともありません。しかし、ログがどちらか分からない日付を跨っている場合も有り得るので、あまりうまい手がありません。ちょっと泥臭いですが一つずつ条件を変えて試すことにしました。
1)最初、どちらか分からない日付は前の月になるよう設定。
2)レコードを手繰っていって、途中で1日以上日付が戻ったら、どちらか分からない日付は次の月に属するように設定してやり直してみます。うまく辻褄が合えばそのまま続けます。
3)最後のレコードの日付とNavin'Youのディレクトリが持っている日付を比較してほぼ一致していればOK。
4)一致しないようならどちらか分からない日付は後の月になるように設定して2)からやり直し。
もちろん、完全ではありませんが大抵の場合はこれで問題無いと思います。
----
謝辞
----
calc_distは見習い魔術士さんのmergenypから抜き出したcalc_traceをアレンジしたものです。
.PMF形式についての先人の解析に感謝致します。
----
献辞
----
本物の次世代、14才の天平と12才になった七海に。
------
その他
------
このプログラムの改良、一部の関数の流用は、その旨、明記されていれば自由です。ただし、もちろん無保証です。
関連リンク
trk2zpo
[Home]|[GPSとH8(電子工作)の掲示板]