2011年4月13日水曜日

長距離走った時の GPS ログを間引いた結果の報告

ちょっと前にGPSのログを間引く(折れ線を間引く) というのを書いた。今回,バイクで 350 km ほど走行した際のログを処理したので,この間の間引きの結果について書いておこう。

まずは今回のログを取った時の設定だが,
(1) ログは Transystem 社(台湾)の TripMate850 を用いた。
(2) ログの記録は SD カードに対して行い,1 秒間隔で記録させた。
(3) TripMate850 は,ツーリングジャケットの左胸のポケットに無造作にいれていた。
(4) 電池は(TripMate850 は単四2本で駆動)パナソニックの充電池(NiMH電池)を用いた。
  使い始めて2時間しないうちに電池の残量表示が減っていて,少しパニックになってしまった。
  実際にはまだまだ使えたのだが…。そのため電池の交換を川上村の道の駅で行った。
(5) 記録されているバイクでの走行距離は約 300 km だった。

まずは結果の経路を示しておこう。
  今回のコースマップ (別ウィンドウで開く)
この経路はGPSの経路ログ表示にGoogle Maps API V3 を使う (その1:KML 形式ファイルを作る) から始まる一連の手法を用いて作られている。この経路の開始点は名阪国道針インターの少し東(青い経路のバイクマークの点)である。最後は亀山インター付近で終わっている。

 経路は電池の入れ替えや,念のために電源をしばらく切っていた,などの都合で,3つに分割されており,3種類の線がある。最初が青次が赤最後が緑,となっている。拡大するとわかるのだが,道の駅・杉の湯川上の後でしばらく経路がつながっていない。これは,川上の道の駅で電池の残量表示が減ってるのに気づいて電池を入れ替えた後,衛星の捕捉に時間がかかったからだと思う。赤が緑に変わってるのは道の駅・熊野きのくにで,これは念のために一度電源をオフにしたからである。その後は電池のもちを試すためにずっとスイッチはオンのままだったので一本の経路となっている。

 3つに分割された経路のオリジナルの点数は,トンネルなどでログが記録されていない点を除いて,それぞれ,経路1が 4174 点経路2が 3508 点経路3が 8874 点となっていた。つまり,16556 点記録されたことになる。GPS ロガーのログファイルのファイルサイズは3つの合計で 8 MB 程度だった。これらの点を,距離が近い点は同一の点とみなす,という処理をして点を減らした結果,経路1が 3888 点 (元の93%)経路2が 3286 点 (元の94%)経路3が 7421 点 (元の84%) となった。つまり,14595 点 (元の88%) になったことになる。しかし,ここでは間引きの前処理程度しか減らせていない。

 そこで,Douglas-Peuckerのアルゴリズムを適用して,点を間引いてみた。当初,点の数を元の 20% 程度になるように処理したが,最終的に元の点数の 50% を目標にしても,Douglas-Peuckerのアルゴリズムで直線とみなせる許容範囲(現時点では 5 m で処理させている)があるために,経路1が 497 点 (元の12%)経路2が 797 点 (元の23%)経路3が 987 点 (元の11%) で頭打ちになった。つまり,最終的に 2281 点 (元の13.8%) になった。
経路1497 点 (元の点数:4174 pts,オリジナル NMEA ファイルサイズ:1.7 MB)
経路2797 点 (元の点数:3508 pts,オリジナル NMEA ファイルサイズ:1.4 MB)
経路3987 点 (元の点数:8874 pts,オリジナル NMEA ファイルサイズ:3.6 MB)
 Douglas-Peuckerのアルゴリズムで処理した後は,作業ファイルの大きさが 260 kBであり,KML ファイルは 83 kBとなった。また,web ページ本体が 30 kB,地図内のタイトルとアイコン説明のための図がそれぞれ 12 kB23 kBとなった。

 以下に経路3でのDouglas-Peuckerのアルゴリズムでの処理の経過を示そう。
1  Points (level > 0): 15
2  Points (level > 0): 29
3  Points (level > 0): 57
4  Points (level > 0): 110
5  Points (level > 0): 199
6  Points (level > 0): 333
7  Points (level > 0): 515
8  Points (level > 0): 690
9  Points (level > 0): 827
10  Points (level > 0): 914
11  Points (level > 0): 965
12  Points (level > 0): 976
13  Points (level > 0): 980
14  Points (level > 0): 984
15  Points (level > 0): 987
16  Points (level > 0): 987
17  Points (level > 0): 987
18  Points (level > 0): 987
19  Points (level > 0): 987
20  Points (level > 0): 987
 ここで,左端の数値は繰り返し番号を表し,右端の数値は経路点として採用された点の数を表している。この処理は,写真を撮った点や,長い間同じ点に居た所から得られた停留点で分割された後の処理なので,最初から分割数が若干多いが,その後はほぼ2倍増になっていっている。しかし,6回目ぐらいから急に増加割合が減り,11回目以降は微増となっている。そして15回目以降は増えていない。

 この結果は,通常のルートであれば,Douglas-Peuckerのアルゴリズムで現在の許容範囲を使うと,点の数は元の 10~20 % ぐらいで頭打ちになる,ということを示している。(走る速度や点を記録する時間間隔にもよる。あくまで私のツーリングの場合)今回はたまたま経路が3つに分割されたが,経路2だけがDouglas-Peuckerのアルゴリズム後の点の割合が高い。これは,経路2 が大滝ダム,大迫ダム,池原ダム,七色ダムの湖畔を走るカーブの多い区間であったため,コースを再現するのに 20% 程度の点が必要だったため,と考えられる。点が多すぎると処理や地図の表示に時間がかかり,減らしすぎると経路が省略されすぎて,かなりルートがショートカットされてしまう。今回は GPS ロガーを使っての初めての長距離だし,距離も 300 km 程度なので,まだまだ試行錯誤が必要だと思う。いずれにせよ,15 % 程度の点の数,というのが妥当な割合かもしれない。

 ちなみに,今回の点の数は停留点(中間点,WayPoints)を加えると 2296 点となっている。これって Google Maps API v3 の KML ファイルの点の制限(1000点)を越えているのだが,何故かそのまま受け入れられいてる。もしかしたら内部ではもう少し制限値が大きいのかもしれない。

追記)2011年のGWにR439を走り,また,紀勢本線の駅に行く,の第11弾として和歌山市付近を走った。それらの走行時に,1秒間隔でログを取ってみた。すると,高速ばかりの区間だと間引いた後のログは元の点数の 8.5 %,R439を走ったものでも元の点数の 11.3 % の点数になった。紀勢本線の駅を訪ねたものだと,なんと 2 % 台だった。まぁ,どんな走り方をするかで間引いた後の点数はかなり違うというのがまざまざとわかった。
R439のルートマップ

0 件のコメント: