ヤマレコなら、もっと自由に冒険できる

Yamareco

HOME > guchi999さんのHP > 日記
2014年10月20日 12:37地図関連全体に公開

GPSログで遊ぶ

GPSのログ(GPXファイル)は、専用ソフトやアプリでルートを表示して時間や距離を確認するという使い方が一般的かと思います。
そのGPXファイルをCSVファイルに変換して、Excelを使って自分の歩き方を解析するなんて事をやっています。

こんな事は、わざわざCSVにしなくても何らかのソフトでも出来そうで、自己満足の暇つぶしにしか過ぎないのですが・・・

GPXからCSVへの変換にはWindowsに標準的に実装されているVBScriptのスクリプトを使い、時間と緯度経度、およびポイント間の距離を計算して出力しています。
このCSVファイルから緯度経度を散布図のグラフにすると、画像1の上半分のように軌跡を表示する事ができます。(下半分は同じGPXファイルの山レコでの表示です)
まあ、当り前といえば当り前で、特にこれが何かの役に立つわけでもありません。

そのCSVファイルで、10分間に移動する距離と標高差を積算して、距離と標高差で散布図のグラフにしたものが画像2です。
散布図の各点の1次近似(赤い点線)の式から、標高差に対して10分間で移動できる距離が計算できるので、地図にルートタイムが記されていないルートを歩くときの参考値として使っています。
岩場や藪がある場合は値も違ってくるから精度が高いとは言えませんが、ある程度の参考にはなっています。


やってみようという人は余りいないかもしれませんが、参考までにVBScriptのスクリプトを以下に書いておきます。(私は本職のプログラマーではないので、洗練されたプログラムでないのはご愛嬌ということで)

使い方は、メモ帳等で---------以下をコピペして、適当な名前で保存し、ファイルの拡張子を「.txt」から「.vbs」に代えるとアイコンが画像3のようになります。
このアイコンにGPXファイルをドロップすると、そのvbsファイルがあるフォルダにCSVファイルが作られます。

なお、GPXからCSVへの変換はExcelでもできます。
Excelの画面にGPXファイルをドロップすると、ファイルの拡張子が違うという警告文がでますが、「はい」をクリックすると「XMLを開く」のウインドウが出ますので「読み取り専用のブックとして開く(W)」にチェックをいれて「OK」とすると変換されます。

'------------------------スクリプトは以下をコピペ------------
Option explicit

'スクリプトのあるフォルダを作業フォルダにする
Dim strScriptPath
strScriptPath = Replace( Wscript.ScriptFullName, Wscript.ScriptName, "")

'FileSystemObjectの取得
Dim objFSO
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

Dim strArg, strInFilePath, strOutFilePath
Dim objDrpFile

If WScript.Arguments.Count = 0 Then
MsgBox "GPXファイルををドロップしてください。"
WScript.Quit
End If

'ドロップされたファイルがGPXファイルか判定
strArg = WScript.Arguments(0) 'ドロップされたファイル(Arguments(0))

If objFSO.FileExists(strArg) Then 'もしファイルならFileオブジェクト取得
On Error Resume Next
Set objDrpFile = objFSO.GetFile(strArg)
strInFilePath = objDrpFile.Path 'パス
If Err.Number <> 0 Then
Set objDrpFile = Nothing
End If
On Error Goto 0
Else
Set objDrpFile = Nothing
End If
If objDrpFile Is Nothing Then
MsgBox "ドロップされたのはGPXファイルではありません。"
WScript.Quit
End If

'読み取りモードでドロップファイルをオープン
Dim objInFile, objOutFile
Set objInFile = objFSO.OpenTextFile(objDrpFile.Path, 1)

Dim intI, intJ, strBuf
intI = 0
intJ = 0
For intI = 1 to 3
strBuf = objInFile.ReadLine
If InStr(strBuf, "gpx") <> 0 Then
intJ = 1
End if
Next
If intJ <> 1 Then
MsgBox "ドロップされたのはGPXファイルではありません。"
objInFile.Close
WScript.Quit
End if

'出力ファイル準備
strOutFilePath = strScriptPath + objFSO.GetBaseName(objDrpFile.Name) + ".csv"
'ログファイルがあったら抹消
If objFSO.FileExists(strOutFilePath) Then
If MsgBox ("同名のファイルがあります。上書きしますか?", vbYESNO) = vbNO Then
Wscript.Quit
End If
objFSO.DeleteFile(strOutFilePath)
End If
Set objOutFile = objFSO.OpenTextFile(strOutFilePath, 8, True, 0)
objOutFile.WriteLine "lat=,lon=,ele,date,time,dist"

Dim strArr, strLineComp(4), strOutLine
Dim intAr, intK
Dim strPrevIdo, strPrevKeido
strPrevIdo = "0": strPrevKeido = "0"

'<trkpt>タグから</trkpt>までのデータを1ラインにまとめ、CSVフォーマットにして出力

Do Until ObjInFile.AtEndOfStream = True
strBuf = ObjInFile.ReadLine
strBuf = Replace(strBuf, chr(34), "")

If InStr(strBuf, "<trkpt") Then
strArr = Split(strBuf, " ")
intK = UBound(strArr)
For intJ = 0 to intK
If InStr(strArr(intJ), "lat=") Then
strLineComp(0) = strArr(intJ)
strLineComp(0) = Replace(strLineComp(0), "lat=", "")
End If
If InStr(strArr(intJ), "lon=") Then
strLineComp(1) = strArr(intJ)
strLineComp(1) = Replace(strLineComp(1), "lon=", "")
strLineComp(1) = Replace(strLineComp(1), ">", "")
End If
Next
End If
If InStr(strBuf, "<ele>") Then
strLineComp(2) = Replace(strBuf, "<ele>", "")
strLineComp(2) = Replace(strLineComp(2), "</ele>", "")
End If
If InStr(strBuf, "<time>") Then
strLineComp(3) = Replace(strBuf, "<time>", "")
strLineComp(3) = Replace(strLineComp(3), "</time>", "")
End If
IF InStr(strBuf, "</trkpt>") Then
'前のtrkptと新しいtrkptの間の距離を計算
strLineComp(4) = DistanceCaluc(strPrevIdo, strPrevKeido, strLineComp(0),strLineComp(1))
strPrevIdo = strLineComp(0): strPrevKeido = strLineComp(1)
'1つのtrkptデータ書き出し
strOutLine = join(strLineComp, ",")
strOutLine = Replace(strOutLine, "T", ",")
strOutLine = Replace(strOutLine, "Z", "")
objOutFile.WriteLine strOutLine
End If
Loop

objInFile.Close
objOutFile.Close
MsgBox "終了しました"

Function DistanceCaluc(strIdo1, strKeido1, strIdo2, strKeido2)
'2つの緯度、経度の距離計算 ヒュベニの公式

Dim ido1, ido2, keido1, keido2
Dim P, dP, dR, M, N, D
Const pai = 3.141592

ido1 = CDbl(strIdo1)
keido1= CDbl(strKeido1)
ido2 = CDbl(strIdo2)
keido2 = CDbl(strKeido2)
P = (ido1 + ido2) / 2 * pai / 180
dP = (ido1 - ido2) * pai / 180
dR = (keido1 - keido2) * pai / 180
M = 6334834 / Sqr((1 - 0.006674 * Sin(P) * Sin(P))^3)
N = 6377397 / Sqr(1 - 0.006674 * Sin(P) * Sin(P))
D = Sqr((M * dP) * (M * dP) + (N * Cos(P) * dR) * (N * Cos(P) * dR))

DistanceCaluc = D
End Function
お気に入りした人
拍手で応援
拍手した人
拍手
訪問者数:3754人

コメント

RE: GPSログで遊ぶ
距離と通過時間の関係を解析するのに使わせて頂きました。とても役に立ちました。
2018/11/16 21:57
RE: GPSログで遊ぶ
pbrgw617さん、コメントありがとうございます。

拙いプログラムではありますが、お役に立てたようで嬉しいかぎりです。
2018/11/18 8:24
gpxをcsvに変換したくて探していてたどり着きました。すばらしい情報ありがとうございました。
HOLUX M-241というGPSロガーを使っているのですが、WINDOWS10をサポートしておらず、昔のデータを何とか救済したいと思い、出来れば汎用性の高いと思われるcsvにしたかったのでとても助かりました。
その辺の事をブログに書こうと思っているのですが、記事上にリンク張らせていただいてもよろしいでしょうか?よろしくお願いいたします。
2023/3/22 21:30
Carzさん

このプログラムはGPXファイルをいじくり始めた頃のもので最近は自分でも使わなくなっていましたが、そんなものでもお役に立てたというのは嬉しいです。
稚拙なプログラムでお恥ずかし限りではありますが、リンク等はご自由にどうぞ。

なお、M-241をwindows 10で使うのでしたら、MTK GPS Logger download Utility(MtkDLut)とNMEA to KMZ file converter(NMEA2KMZ)というソフトを使えばM-241からログをcsvファイルで取り出すこともできます。
詳細は saitama-n さんが下記のヤマノートに書いておられますので興味があればご覧になると良いです。

HOLUX M-241のGPS週数ロールオーバー問題と対処方法(2019年5月4日)
https://www.yamareco.com/modules/yamanote/detail.php?nid=2428

HOLUX M-241(液晶付きGPSロガー)をWindows10で新規に使う方法
https://www.yamareco.com/modules/yamanote/detail.php?nid=3135
2023/3/22 23:53
プロフィール画像
ニッ にっこり シュン エッ!? ん? フフッ げらげら むぅ べー はー しくしく カーッ ふんふん ウィンク これだっ! 車 カメラ 鉛筆 消しゴム ビール 若葉マーク 音符 ハートマーク 電球/アイデア 星 パソコン メール 電話 晴れ 曇り時々晴れ 曇り 雨 雪 温泉 木 花 山 おにぎり 汗 電車 お酒 急ぐ 富士山 ピース/チョキ パンチ happy01 angry despair sad wobbly think confident coldsweats01 coldsweats02 pout gawk lovely bleah wink happy02 bearing catface crying weep delicious smile shock up down shine flair annoy sleepy sign01 sweat01 sweat02 dash note notes spa kissmark heart01 heart02 heart03 heart04 bomb punch good rock scissors paper ear eye sun cloud rain snow thunder typhoon sprinkle wave night dog cat chick penguin fish horse pig aries taurus gemini cancer leo virgo libra scorpius sagittarius capricornus aquarius pisces heart spade diamond club pc mobilephone mail phoneto mailto faxto telephone loveletter memo xmas clover tulip apple bud maple cherryblossom id key sharp one two three four five six seven eight nine zero copyright tm r-mark dollar yen free search new ok secret danger upwardright downwardleft downwardright upwardleft signaler toilet restaurant wheelchair house building postoffice hospital bank atm hotel school fuji 24hours gasstation parking empty full smoking nosmoking run baseball golf tennis soccer ski basketball motorsports cafe bar beer fastfood boutique hairsalon karaoke movie music art drama ticket camera bag book ribbon present birthday cake wine bread riceball japanesetea bottle noodle tv cd foot shoe t-shirt rouge ring crown bell slate clock newmoon moon1 moon2 moon3 train subway bullettrain car rvcar bus ship airplane bicycle yacht

コメントを書く

ヤマレコにユーザー登録いただき、ログインしていただくことによって、コメントが書けるようになります。
ヤマレコにユーザ登録する