GPSログデータコンバータ

Last Update 07-Jul-2005
V0.39


変更履歴
07-Jul-2005 V0.39 MapSource .GDB(Trackのみ)の読み込みに対応。
06-Jun-2005 V0.38 Panasonic CN-HS400 ルートポイント.RMFの読み込みに対応。
13-May-2005 V0.37a .fx処理でエラーになるenbugの修正。
10-May-2005 V0.37 CN-HS400 軌跡 .SMFの読みこみに対応。
08-May-2005 V0.36 ItsMoNavi ポイント登録.XMLの読みこみに対応。
06-May-2005 V0.35 Panasonic CN-HS400 ポイント登録.PMFの読み書きに対応。
              関連するNYPu(ユーザポイント), POTw,WPT機能強化。
03-Aug-2003 V0.34n TDFに時間が異常なレコードがある場合の対処を追加。
13-Apr-2003 V0.34m threadの先頭で時間が逆転した場合、無効データとしない。
09-Apr-2003 V0.34l 入力測地系を強制指定する-IWGS84,-ITOKYOオプション追加。
              -ORオプション指定時、入力と出力に同じタイプを許容。
              入力がNMEAの時、最終レコードが完了していない場合も出力する。
05-Apr-2003 V0.34k .POTで南半球の赤道付近が正しく扱えないbugの修正。
19-Dec-2002 V0.34j .POTで低緯度、南半球が正しく扱えないbugの修正。
27-Jun-2002 V0.34i .TDF同一時刻データに対処できないbugの修正。.NME Altitudeが正しくないbugの修正。
20-Jun-2002 V0.34h NMEAの$PNTSセンテンスに対応
01-May-2002 V0.34g WPT/POT->WWPで"ポイント名"を反映するよう修正。waypoint出力時も時間遡行などを異常値扱いしていたbug修正。
18-Apr-2002 V0.34f WPT->WWPで高度情報が反映されないbug修正。.POT waypoint出力サポート。
07-Mar-2002 V0.34e gar2wsのlog.fx形式の8バイトレコードBug修正
22-Feb-2002 V0.34d WWPでポイント名が正しくないBug修正
30-Jan-2002 V0.34c WWPに高度情報の書き込み追加
05-Jan-2002 V0.34b WWPでポイント名が正しくないBug修正
12-Dec-2001 V0.34a WWP Bug Fix
08-Dec-2001 V0.34 WonderWitch logger Waypoint(WWP) support
12-Nov-2001 V0.33b 漢字名称を出力しない-kオプション。potrで地点名が漢字の時、/ide=付加
11-Nov-2001 V0.33a .rml入力でスレッド使用デフォルトpotr、potrで同一点無視。エンドポイント強制出力。
01-Nov-2001 V0.33 .stf出力追加
28-Aug-2001V.032 POTのROUTE形式出力に対応。
22-Aug-2001V.031i HGR3の最下位桁処理バグ修正。
09-Jul-2001 V.031g TDF_VERSION 0の日付が狂うbug修正。
07-Jul-2001 V.031f TDF_VERSION 1に対応。
09-Jun-2001 V.031e WonderWitchでファイル分割のために出来る.tdfの擬似スレッドを扱えるように修正。
07-Jun-2001 V.031d WonderWitchの.fxファイルヘッダをサポート。
18-May-2001 V.031c gar2ws .log.fxファイルの読み書き対応。
20-Mar-2001 V.030 MapFan Vルートエクスプローラ.rml読み込み対応。
20-Mar-2001 V.029 .wpt,userpointを含むnypの読み書き。.potのTEX=対応,IPS8000最下位桁対応
20-Mar-2001 V.028d .tdf公開。受信状態、衛星情報、out_IPS追加。MSS(MPSa)機能強化
22-Jan-2001 V.027b 異常値スキップ/間引き系オプションインプリメント
15-Jan-2001 V.026d 重複レコード対策。CSVマイナーバグ修正
14-Dec-2000 V.026c .potの測地系対応強化
26-Nov-2000 V.026b .sglを使いやすいように小改良。
16-Nov-2000 V.026a .nmeに磁針偏差項追加。
15-Nov-2000 V.026 .gdn(gradown track)入出力追加。
06-Nov-2000 V.025 .nme出力追加。
18-Jul-2000 V.024b 西経、南緯の時マイナスの値を渡すよう変更。
17-Jul-2000 V.024a .sglの時刻が狂うbug修正
10-Jul-2000 V.024 .sgl対応
07-May-2000 V.023 Kashmir VCD対応。
20-Apr-2000 V.022 bug修正。.pot出力の自由度向上。
15-Mar-2000 V.021 Kashmir CSV入出力追加。
11-Mar-2000 V0.20 CSV出力追加。
01-Mar-2000 このページにファイルタイプ追加の手引きを加えました。
23-Feb-2000 V0.19a MapServerScript bug fix
22-Feb-2000 V0.19 MapServerScript 出力に対応
05-Feb-2000 V0.18 Garmin MapSource .MPS入力に対応
28-JAN-2000 入力がnypかつ補正不要のとき日付が正しくないbugの修正
28-Oct-1999 Garmin Simple Text Format サポート
31-Aug-1999 initial beta release

お断り
これはβバージョンです。おまけにまだV0.39です。^-^;
インプットデータは必ずコピーを取り、アウトプットは他のものとまざらないようにしてください。
このhtml自体、昔のユーティリティ用のページをまとめただけのものなのでインプリメントが異なっていたり、されていなかったり、オプションなどに嘘が書いてあることがあります。^-^;

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

GarmapCEで使用できるルートの自動作成

GoogleでGPSLOGCVを検索


[Home]|[GPSとH8(電子工作)の掲示板]