たまには役立つ
か、どうかわからんけどな。
てか今回長いよ。
ちょっとソニーやガーミンのlog取り目的のGPSが欲しくなってきたところだったのだけど、なにがやりたいかというと、そのソニーのGPSの使い方の通りというか、GPSでログ取りして、写真にGPSのデータを埋め込んでおきたいのです。んで地図へ貼り付けると自動でその場所に張り付くという・・
たのしそーじゃんよ!
(やらないくせに
でもまぁ、なんだかMio168RS(以下Mio)持ってるのでなんか使えないかしらといろいろといじってみました。
とりあえずの裏技として、レジストリのHKEY_CURRENT_USER\Software\MiTAC\MioMap168\NMEALOG の値を1にしておいてからMioMapを使うとSDカードのルートにNMEAログがばりばり書き込まれるようなので、とりあえずGPSのログ取りはそれを利用することにしてみた。
(一時的に取得する方法として、Miomapの設定画面の、移動履歴を保存するの枠の中の、「分間隔」の右のあいてるスペースを6回くらいタップすると□NMEAというチェックが出てくるのでそれ使ってもいいようです)
んで得られたLOG
さてjpgにGPSデータを埋め込むソフトはいくつかあるようですが、比較的有名なのがRoboGeoのようで、試してみたところ、NMEAは直接読めなくて、GPX(XML)にして読ませる模様。
しかしどーもMioのlogはゴミも多いようなので、綺麗にしたいところ。
(ファイル名がnmealog.txt固定なので、書き込み途中で電源切ったりした後にまたmiomapを使ったりすると変な繋がりのファイルになってたりする。せめて日付でファイル名を変えるとかしてほしかったところ)
一番手っ取り早い方法としては、gpslogcvというフリーウェアを使うこと。
んでバッチファイルを作ってlogをドロップして試してて、うまいこと変換してくれるようなのでこれを使うことにしたけど、どうもgpslogcv.exeを機能名.exeにリネームするとバッチファイルも必要ないよーなので、gpslogcv.exeを
nme2nme-INME-TNME-OR-SA.exe
とリネームして、それにlogファイルをドロップすると、無効なデータを削除して適当にシェイプアップされているlogが得られるのですよ。
ちなみに日本(TOKYO)測地系のをWGS84へ変換するなら
nme2nme-INME-ITOKYO-TNME-OR-DW-SA.exe とリネーム。
そしてそのlogをGpsBabelというフリーウェアでGPXに変換することになるのだけど、これのフロントエンドが
ムキーー!!
ってなるほどつかいにくくて頓挫。いや実はコマンドラインに指定するようにしてバッチを組めばログドロップ一発で出来るようにはなるのですが、どうもなぁ・・・結果、RoboGeoへ読ませる手順としては、
ログ→gpslogcv→gpsbabel→RoboGeo となるわけですな。
ていうかRoboGeo、$35ってどうよ・・いらん機能切り捨てて$9とかならねぇ・・
さてほかにないかと考えたところ、そういえばもともとその目的用のソニーのGPS GPS-CS1KにはGPS Image Trackerというソフトがついていて、
これがシンプルそうでいいかんじ。
これは入手できないのかしら・・・と思ったら自分の持ってるDSC-T10の付属ソフトの中に入ってました。
ハハーン
ということでGpsImageTrackerを使うことに決定。
いろいろと掲示板やらをあさってみると、
・GpsImageTrackerは普通のNMEAログが読めるらしい
・LOGの先頭行に「@Sonygps/ver1.0/wgs-84」なんていう呪文(のろいぶん)が入っていれば読んでくれるらしい
というやすっちいRPGのよーな情報を入手。
さっそくMioで取得したNMEAログの先頭に呪い文を入れて読み込ませ・・・
られねえ!
なんでだよー。
しょうがないのでSONYで出力したlogを入手。
これをGpsImageTrackerへ読ませてみる・・・当然読むので、とりあえず、LOGのどの部分をGpsImageTrackerが読んでるのかを確かめるために、logの各データ、$GPGGA、$GPGSA、$GPGSV、$GPRMC、$GPVTG、とあるのを、一個ずつ抜いていってみたところ、
$GPRMC
と
$GPVTG
を抜いた次点でGpsImageTrackerが読まなくなるので、この2個は必須の模様。
さてその2個のデータ各々がどういうパラメータかというと、
$GPRMCには日時、時間、緯度経度、速度、方向他が記録されている模様。んで
$GPVTGには進行方向と速度が記録されている模様。要するにベクトルのみ。
んー、ていうか$GPRMCだけでいいんじゃ・・とか思ったけどまぁ天下のおソニー様の考えることだから何かあるんでしょう。
さて、そこでMioから取り出したlogを見てみると、
・・・・・・
$GPVTGがねぇ!
アハハーン
(どんな感情よ
さてどうしたもんか・・
ここまでで、MioのデータをGpsImageTrackerへ読ませるには、
1) logを綺麗にする
2) 先頭行へ呪い文追加
3) $GPVTGをなんとかする
ですが、1はgpslogcvで一発です。2はまぁ、エディタで1行追加するだけなのでなんとかなりそうです。3はどうすっか・・・
ということでひさびさにVBで組んでみました(わらい
logcv.exeとゆーそのまんまな名前ですが。
これへドロップすると、さっきの手順の、2)と3)を自動でやります。ただ、もともと$GPVTGは存在しないので、どうするか考えたのですが、静止でいいじゃん。ってことで静止状態の$GPVTGを$GPRMCの後に付加することにしました。
んで出力したlogをGpsImageTrackerへ読ませたところちゃんと読んでくれました。
これで、MioからGPSデータの埋め込まれているJPGを作る手順は、
logファイルをリネームしたgpslogcvへドロップ>綺麗LOGが得られる
↓
綺麗LOGをlogcvへドロップ>SONY用LOGが得られる
↓
GpsImageTrackerで処理
というらくちんぷぅーな手順となりました。
そして得られたjpgをSuperMappleへドロップすると、
こうして保存できるわけで。
一件落着。
ああそうそう、せっかくだからSuperMappleへlogの奇跡も保存したいよねー。
・・・・・・
NMEAのログ直じゃできねぇ!!
市ねと
どういうことかというと、SuperMappleではGPSログの取り込みは、CSVファイルのインポートという形で行うのですが、
NMEAをそのまま読ませると
なんやらようわからんことに・・・・・
つまりNMEAログはさっきの$GPRMCとか$GPGSVとかのデータが行ごとに混在していて、しかもデータの格納の仕方がそのセンテンスごとにまちまちなので、こういうことに・・・
つまり緯度と軽度だけのCSVを作ってやらないとだめっちゅー琴音。
と、いうことで、先ほどの自作logcnv.exeに組み込むことに。
んで作ってみました。$GPRMCから緯度、経度部分だけ抜き取ってCSVに。
でも読めねぇ!
読み取るときのオプションで、
こういった指定が出来るのですが、どれがどういう意味よ・・・・・
いずれにしてもどの指定でも読めなかったので、こりゃ結局変換するしかねぇのか・・・
んで、どうせ変換するならこの画面が出たときに選択されている(デフォルトの)形式にあわせるのがいいだろうということで、「整数(1/1000秒単位)」というのにすることに。
さて$GPRMCってのはどういうデータよ・・
$GPRMC,035906.869,A,3551.7427,N,13921.7366,E,27.96,67.89,150107,,,A*60
というのがあったとして、使えそうなデータは、
2個目の時刻 035906=03:59:06(UTC)
4個目が緯度 3551.7427=35度51.7424分
6個目が経度 13921.7366=139度21.7366分
10個目が日時 150107=07年01月15日
さてこのうち4個目と6個目を取り出して、並べてcsvにしてやればいいのですね。
ということで、この、度分というのを秒になおすのはどーすんの。と調べてたらSuperMapple7のFAQのページに
こんな説明をハッケソ。
じゃぁこの逆をやればいいんじゃん。
ってことで、たとえばさっきのデータの、
3551.7427=35度51.7424分
なら、
35*3600000+51*60000+74270
ってことでOKじゃね?しかし60進にする場合の小数点以下の扱いはこれでいいのかしら・・・
まいっか。
ってことで変換させてcsvを作ると読み取ってくれました・・
が、
どーもある緯度になると南へ線が飛んでいってしまいます。
なんじゃろうと思ってlogを眺めていると、その飛んでいってる部分は、小数点以下の最上位桁が変化したときとわかりました。やっぱり小数点以下はまんま秒ではなくて分のままだったようで、すなわち0.1分=6秒にしなくてはならないということね。
ま結果、ちゃんと読むようになりました。
mappleではこんな手順で
↓
そうそう、今回の自作logcnv.exeですが必要なら使ってください。
適当にlogファイルをドロップすると、元logのあった場所に適当なファイル名で一個ファイルを作ります。
おしまい。