その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
距離と通過時間の関係を解析するのに使わせて頂きました。とても役に立ちました。
pbrgw617さん、コメントありがとうございます。
拙いプログラムではありますが、お役に立てたようで嬉しいかぎりです。
HOLUX M-241というGPSロガーを使っているのですが、WINDOWS10をサポートしておらず、昔のデータを何とか救済したいと思い、出来れば汎用性の高いと思われるcsvにしたかったのでとても助かりました。
その辺の事をブログに書こうと思っているのですが、記事上にリンク張らせていただいてもよろしいでしょうか?よろしくお願いいたします。
このプログラムは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
コメントを編集
いいねした人
コメントを書く
ヤマレコにユーザー登録いただき、ログインしていただくことによって、コメントが書けるようになります。ヤマレコにユーザ登録する