2014年5月、これまで使ってきたeTrex Legend 日本語版に代わる新たなハンディGPSとして、eTrex20を導入した。eTrex Legend 日本語版は、内蔵メモリが16MBしかないため広範囲の地図が入れられず、かといって外部との接続手段はRS-232Cに限られ、頻繁に地図を入れ替えるのも手間がかかる。最近、活動範囲が広がりつつある当研究所にとって、これは由々しき問題であった。だが、eTrex20であれば、取り外し可能なmicroSDメモリカードが使えるので、容量と転送速度の問題が一気に解決できる。

eTrex20(左)とeTrex Legend 日本語版(右)
さて、eTrex20が手元に届いたまではよかったものの、7年前のeTrex Legendの導入時と同じように国土地理院からベクトルデータを入手し、eTrexで使える形式に変換しようとしたら、手順をすっかり忘れてしまっていた。そこで、あらためて調べながら作業したのだが、いろいろ変わっているも箇所もあり、試行錯誤の連続となった。そこで、一連の手順を備忘録として記しておく。
なお、本稿は茨城県の低山歩きを目的とし、当研究所にとってベストな表示となるように各パラメータを決め打ちしている。適当に置き換えれば他の地域にも応用できるかもしれないが、東京都心部のような大都会や、北アルプスのように県境を挟んだ急峻な地形では、手順の工夫やパラメータの変更が必要だろう。
そういえば書き忘れていた。本稿はWindows 7での作業を前提としたものである。Windows 8はともかく、ほかのOSのことまでは知らんのであしからず。
作業手順は以下のとおり。次節以降で各手順の詳細について記す。
このように並べると簡単そうだが、各項目とも癖があって一筋縄ではいかない。それゆえ本稿を執筆するに至ったのである。各作業の詳細は次節以降で。
作業を始めるにあたって、まずはソフトウェアを準備しなければならない。必要なもの、あれば便利なものを下記にまとめた。インストール方法ついて本稿では詳述しないが、基本的には適当なフォルダに展開するか、インストーラの指示どおりにすればよい。
これとは別に、等高線のベクトルデータをXML形式からPolish形式に変換するなんらかのツールが必要。適当なものが見当たらなかったので、当研究所ではMicrosoft Visual C++ 2008 Expressで自作した(恥ずかしいので非公開)。有名なツールに「アベル父さんの もっと山を、スキーを、感動を!」で公開されているExcel VBAモジュールがあるが、残念ながら当研究所はMicrosoft Excelを保有していない。
準備ができたところで、国土地理院からベクトルデータを入手する。国土地理院 > 地図・空中写真・地理調査 > 基盤地図情報サイトへ進み、「基盤地図情報のダウンロード」をクリック。

基盤地図情報サイト|国土地理院
基盤地図情報ダウンロードサービスのページに遷移するので、「ログイン画面はこちら」をクリック。

基盤地図情報ダウンロードサービス|国土地理院
ログインIDとパスワードを入力して「ログイン」をクリック。IDが未登録であれば「新規登録はこちら」からで新規登録。

シングルサインオンシステム 共通ログイン画面|国土地理院
アンケートの入力画面になるので、適宜入力して「次へ(アンケートへの送信も自動で行います)」をクリック。

基盤地図情報ダウンロードサービス アンケート|国土地理院
ダウンロードファイル形状選択の画面になったら、基盤地図情報基本項目を選んで最新情報を入手したいところだが、残念ながら当研究所の現時点の能力では対応できない。しかたがないので過去のデータを用いる。過去に公開した基盤地図情報のダウンロードは「こちら」をクリック。

ダウンロードファイル形状選択|国土地理院
過去の基盤地図情報のダウンロードサービス画面になるので、基盤地図情報縮尺レベル25000(都道府県単位)→ダウンロードは「こちら」をクリック。

過去の地図情報のダウンロードサービス|国土地理院
都道府県別の旧データの選択画面になるので、「茨城県」をクリック。

25000レベル基盤地図情報旧データのダウンロード|国土地理院
これでようやくダウンロード画面に遷移する。データは大容量のため9分割されている。no1からno9の各リンクをクリックしてすべてのデータをダウンロードする。

茨城県全域の25000レベル基盤地図情報旧データのダウンロード|国土地理院
データ量が多いので高速な回線でないと時間がかかるかもしれない。ダウンロードが終わったら、ベクトルデータへの変換作業へと進む。
ダウンロードした基盤地図情報のzipファイルを解凍すると、拡張子xmlのファイルが生成される。このうち必要なのは、海岸線(ファイル名にCstlineを含む)、道路縁(同じくRdEdg)、軌道の中心(RailCL)、水涯線(WL)、等高線(Cntr)であるが、本節では等高線以外のデータを基盤地図情報ビューアー・コンバーターでShapeファイル(*.shp)へと変換する。作業手順は以下のとおり。

基盤地図情報ビューアー・コンバーター
基盤地図情報ビューアー・コンバーターを起動し、ファイル(F)→新規プロジェクト作成で新規プロジェクト作成ウインドウを開く。「追加」をクリックして読み込む基盤地図情報ダウンロードデータ(*.xml)を開き、「OK」をクリック。プロジェクトのタイトルはデフォルトのままでよい。

新規プロジェクト作成
基盤地図情報ダウンロードデータが読み込まれたら、エクスポート(E)→エクスポート(E)でエクスポートウインドウを開く。変換種別:シェープファイル、変換する要素:すべてにチェック、直角座標系に変換のチェックを外す、変換する領域:全データ領域を出力を選択し、出力先フォルダを選択して「OK」をクリック。

エクスポート
「OK」をクリックすると、有無をいわさずShapeファイルが生成される。ファイル名をユーザが決めることはできない。

出力
この変換は種別(海岸線とか道路縁とか)別に実施する。茨城県の場合、道路縁以外は1種類1ファイルなので、道路縁だけ複数のダウンロードデータをまとめて変換することになる。
上記で生成したShapeファイルをGPSMapEditでPolishファイルへと変換する。

GPSMapEdit
GPSMapEditを起動し、ファイル(F)→インポート(I)→シェープファイル(*.shp)でShapeファイルを読み込む。インポートウインドウが開くので、最初の1. 物体の種類を選択してください。では、集合の種類:ガーミン、一覧表から:適当なコードを選択し、「次へ」をクリック。当研究所では、水涯線:0x15、川:0x15、道路:0x1d、線路:0x1cとした。eTrex上では道路→県境、鉄道→国境になってしまうが、道路に設定されている線種は太いものばかりだし、鉄道はデフォルトの0x14だと縮尺を下げたときに消えてしまうので、これで妥協した。

インポート:物体の種類を選択
次の2. ラベルのソースを選択してください。では、ラベルのためのフィールドを選択のチェックをオフにし、「次へ」をクリック。

インポート:ラベルのソースを選択
3. 追加の属性を割り当ててください。では、追加の属性を割り当てますは未使用、「コメント」属性へのすべての入力フィールドの保存のチェックを外して(デフォルト)、「次へ」をクリック。

インポート:追加の属性を割り当て
4. ソースの座標系を選択してください。では、座標系:緯度と経度を選択して(デフォルト)、「次へ」をクリック。

インポート:ソースの座標系を選択
5. インポートするズームレベルを選択してください。では、レベル0にチェックを入れて(デフォルト)、「完了」をクリック。

インポート:インポートするズームレベルを選択
これでようやくShapeファイルが読み込まれる。次に、ファイル(F)→地図のプロパティで地図のプロパティウインドウを開き、各種パラメータを設定する。
まずはヘッダーから。地図の種類:ガーミン、ID:他と重複しない8桁の数字、名前:適当に設定、著作権情報:適当に設定、測地系:WGS 84、標高のユニット:メートル、コードページ:0 (7-bit ASCII)、文字コード:欧州の(1バイト言語)、車両の左側通行のチェックを外す。IDを含む文字の入力には1バイト文字(半角)を使うこと。2バイト文字(全角)を使ってはいけないらしい。

地図のプロパティ:ヘッダー
レベルは、Level0=24、Level1=23、Level2=22、Level3=17に設定する。

地図のプロパティ:レベル
cGpsMapperは、TRE size:1000、RGN limit:1024、TRE margin:0.000、地図は透明です:Y - 透明な地図、背景なし、前処理:いいえを選択し、POIのインデックス、MGを有効にする(交差点の検索)、道路に沿って番号を有効にする、自動ルーティングを有効にする、のチェックをすべて外す。

地図のプロパティ:cGpsMapper
他のタブは変更なし。「OK」をクリックしてプロパティを確定する。最後に、ファイル(F)→名前をつけて保存で名前をつけて保存ウインドウを開き、ファイル名(N)に適当なファイル名を入れ、ファイルの種類(T) :ポリッシュフォーマット(*.mp,*.txt)で「保存」をクリック。

名前を付けて保存
以上の作業を種別ごとに実施し、Polishファイルへの変換は終了。お疲れさまでした。
最初に宣言しておく。こまけぇこたぁいいんだよ!!
ダウンロードした基盤地図情報のzipファイルを解凍すると、拡張子xml、ファイル名にCntrが含まれるファイルが生成される。これが等高線のベクトルデータだ。
データ量が多いためか、ベクトルデータは分割されている。そのうちの適当なひとつをテキストエディタで開いて内容を見てみる。ぱっと見た感じではわけがわからないかもしれないが、よく見ると<Cntr gml:id="hoge"> - </Cntr>で囲まれた範囲がある1本の等高線を示すことに気づくだろう。<gml:posList> - </gml:posList>に囲まれた数値が等高線が通過する緯度、経度を示し、</Cntr>の直前の<alti> - </alti>に囲まれた数値が標高を示す。一例をあげてみる。
<Cntr gml:id="K3_31705"> ←開始
<fid>fgoid:10-00100-7-9-16315562</fid>
<lfSpanFr gml:id="K3_31705-1">
:
<gml:posList>
36.093399722 140.243978611 ←等高線の通過点(開始)
36.093480556 140.244052778 ←等高線の通過点
36.093558889 140.244035556 ←等高線の通過点
:
36.092310556 140.247338889 ←等高線の通過点(終了)
</gml:posList>
:
</loc>
<type>一般等高線</type>
<alti>20</alti> ←標高
</Cntr> ←終了
これだけわかれば十分である。これらの数値を取り出し、Polish形式で並べ直せばよいだけだ。
こちらも同様に宣言しておく。こまけぇこたぁいいんだよ!!
とりあえずヘッダに関しては後回しとして、いちばん重要と思われる等高線の記述方法について記す。これも実物を見たほうが早いので、ある1本の等高線の記述例をあげてみる。
[POLYLINE]
Type=0x21
Label=20
EndLevel=1
Data0=(36.20699,139.69803),(36.20716,139.69794),(36.20832,139.69811),(36.20845,139.69811),(36.20871,139.69820),(36.21025,139.69816),(36.21072,139.69820),(36.21102,139.69841),(36.21128,139.69872),(36.21154,139.69876),(36.21214,139.69884),(36.21235,139.69884)
[END]
[POLYLINE] - [END]間が1本の等高線となる。Typeは線種を示す。当研究所では、等高線10m:0x20、等高線20m:0x21、等高線100m:0x22とした。Labelは、この線のラベルとしてeTrex上に表示される文字列を示す。当研究所では、20m毎に標高が表示されるように設定した。具体的には、10m、30m、50m…ではLabelを宣言せず、20m、40m、60m…ではLabel=標高とした。
Endlevelは、マップズームレベル(後述)においてどのレベルまで表示するかを示す。マップズームレベルは0、1、2、3の4段階があり、Polish形式のファイルのヘッダにおいて、ハードウェアズームと対応づけられる。EndLevelを省略すると、ズームレベル0ではData0で記述されたデータ、ズームレベル1ではData1で記述されたデータ…を表示する。EndLevelを宣言すると、宣言されたレベルまでData0で記述されたデータを表示する。上記の例では、ズームレベル0および1においてData0で記述された等高線を表示することになる。当研究所では、等高線10m:宣言せず(ズームレベル0でのみ表示)、等高線20m:1(ズームレベル0および1で表示)、等高線100m:2(ズームレベル0、1、2で表示)とした。ズームレベル3はそれ以上でベースマップを示す値であるから、EndLevelで3の宣言はできない
Data0から始まる()内の数値が、等高線が通過する各点の緯度、経度である。前述のように、0はズームレベルを意味する。Data1以降を記述してもよいが、ズームレベルごとにデータの粗密を変えるというのでなければ、Data0のみを記述し、EndLevelで表示の可否を指定したほうが簡単だろう。
以上から、やるべき作業は定まった。最初にXMLファイル中の<alti> - </alti>に囲まれた標高を読み取る。標高が100で割り切れればLabel=標高、Type=0x22、EndLevel=2、20で割り切れればLabel=標高、Type=0x21、EndLevel=1を設定する。それ以外はType=0x20のみを設定し、LabelとEndLevelは設定しない。次いで<gml:posList> - </gml:posList>内の緯度、経度を読み取り、Data0=( , )…( , )となるよう変換する。変換後のファイルの拡張子はmpとする。
ただこれだけなのだが、実際にやろうとすると大変だ。特に、XMLファイルでは緯度経度→標高の順になってるデータを、Polishファイルでは標高→緯度経度の順に直さなければならない。当研究所でははMicrosoft Visual C++ 2008 Expressでツールを作成して処理したが、あまりにも稚拙で恥ずかしいのでソースコードもバイナリも非公開である。本来ならPerlとかで処理するのが筋なのだろうが、当研究所にその技術力はない。
変換作業が終わったら、ファイルの先頭にヘッダを記述する。これは簡単だ。GPSMapEditで作成した水涯線等のPolishファイルからコピーし、IDを他と重複しない番号に書き換えればよい。Nameも適当に書き換える。
[IMG ID]
LblCoding=9
ID=08501405
Name=Ibaraki-Cntr25000-0001
Elevation=M
Preprocess=N
TreSize=1000
TreMargin=0.00000
RgnLimit=1024
Transparent=Y
POIIndex=N
Copyright=Ugo Research Institute
Levels=4
Level0=24
Level1=23
Level2=22
Level3=17
Zoom0=0
Zoom1=1
Zoom2=2
Zoom3=7
[END-IMG ID]
ヘッダ内のLevelはマップズームレベルとハードウェアズームの対応を表す。Level0、Level1、Level2、Level3はそれぞれマップズームレベル0、マップズームレベル1、マップズームレベル2、マップズームレベル3である。0から3の4レベルを使うので、Levelsは4に設定する。
右辺の数字がハードウェアズームであり、レベル24はeTrex上のスケール表記(たぶん)が最大120m、23は200mから300m、22は500m、17は12kmに相当し、表示範囲がそれ以上になるとベースマップが表示される。
したがって、上記の設定だと、Level0(マップズームレベル0)=スケール表記120m(ハードウェアズームレベル24)まではEndLevelが0以上、すなわちすべての等高線が表示される。
同様に、Level1(マップズームレベル1)=スケール表記300m(ハードウェアズームレベル23)まではEndLevelが1以上、すなわち20m単位の等高線が表示され、Level20(マップズームレベル2)=スケール表記500m(ハードウェアズームレベル22)まではEndLevelが2、すなわち100m単位の等高線を表示することになる。
ここがいまひとつわかりにくいのだが、「スケール表記500mまで」というのは、…1.2km、800mと大きな値からきて500mということらしい。…200m、300mと小さいほうからきて500mではない。したがって、スケール表記500mから12kmが100m単位の等高線、スケール表記300mが20m単位の等高線、スケール表記120mから200mが10m単位の等高線表示ということになる。eTrex20では120mより小さいスケール表記もできるが、これはハードウェアズーム24(スケール表記120m)に準じ、やはり10m単位の等高線となるようだ。
さて、水涯線等の変換時にわざわざLevel0=24、Level1=23、Level2=22、Level3=17に設定していた理由に気づいただろうか。水涯線等は特になんの操作しておらず、この設定と無関係にどのレベルでも表示されるため、設定しようがしまいが実は関係ない。ただ、ここのコピペを楽にするためだけの操作だったりする。
GPSMapEditで表示させたLevel0、Level1、Level2はこんな感じになる。GPSMapEdit上でのズームレベルは、表示(V)→ズームレベル→ズームnで変更できる。

Level0

Level1

Level2
GPSMapEditと実機の表示はだいぶ異なるので、これはあくまで参考ということで。
Zoom0、Zoom1、Zoom2、Zoom3はMapSourceのみで使われるオプション設定なので、適当でもよいらしい。よくわかってないので今回は上のような設定にしておいた。
もし線種が気に入らないときは、最初から再作成するよりも、Polishファイル中のType=nnnnの数値を適当な文字列置換ツールで一気に変換した方が簡単である。これは等高線だけでなく、海岸線、道路縁、軌道の中心、水涯線にも使える。
これでようやく海岸線、道路縁、軌道の中心、水涯線、等高線のPolish形式への変換が終わった。次はこれらをマージし、マップイメージを作成する。
GPSMapEditを起動し、前回までに作成したPolishファイルのひとつを適当に読み込み、名前を変え保存(上書き保存の防止のため)。このとき、地図のプロパティ→ヘッダーでIDの変更を忘れずに。
次に、ファイル(F)→追加(A)で別のPolishファイルを読み込む。これを繰り返し、すべてのPolishファイルを読み込む。最後に、名前を付けて保存で上書き保存。これでマージ完了。

マージされたベクトルデータ
マージされたベクトルデータには抜けがないかよく確認する。特に等高線は複数に分割されているので注意。問題なければ次に進む。
マップイメージへの変換には、GPSMapEditのほかにcGPSmapperというソフトウェアが必要だ。リンク先からダウンロードし、適当なフォルダに解凍する。
GPSMapEditを起動してマージしたベクトルデータを読み込み、ファイル(F)→エクスポート→ガーミンIMG / cgpsmapper.exeと進む。ファイル名(N)は適当に設定し、ファイルの種類(T)はガーミンMapSource地図 (*.img)を選択、「保存(S)」をクリック。
cgpsmapper.exeにエクスポートというウインドウが開くので、cgpsmapper.exeへのパスには右の...ボタンをクリックしてcgpsmapper.exeをインストールしたフォルダから選択、のみPOIをエクスポートするのチェックを外し、「実行」をクリック。

cgpsmapper.exeにエクスポート

エクスポート中
ところが、当研究所のメインPC、Core i5-4670T+H81M-ITX機(Windows 7 Professional 32bit、メモリ4GB)では「bad allocation」というメッセージが出た状態で停止してしまった。

エクスポート停止
「エクスポートは完了です!」というダイアログが出ているが、実際にはできてない。茨城県全体ではこのように失敗するが、たとえば北緯36°20′(おおよそJR水戸線)以北で切り出せば(GPSMapEditでツール(T)→地図トリム)変換できるので、メモリが足りないらしい。
そこで、当研究所で最も高スペックなPC、Core i7-4770K+H81M-ITX機(Windows 7 Professional 64bit、メモリ16GB)で作業したところ、問題なくエクスポートできた。めでたしめでたし。
eTrex20をUSBでPC接続するか、microSDメモリカードを取り出してPCに直接挿すかして、完成したマップイメージファイル(*.img)をmicroSDメモリカードのGaminフォルダにコピーする。基本的にはこれだけOK。

microSDメモリカードへのコピー
次にeTrex20が起動したとき、自動的にインストールしたマップイメージファイルが読み込まれるはず。もしダメなら、メニューボタンを押して地図設定→地図選択→インストールしたファイルを有効にしてみる。
上の図ではPOIというフォルダがあるが、これはカスタムPOIと呼ばれる位置情報を記録したデータが入っているフォルダである。カスタムPOIについてはまた別の機会に。
本稿で作成した等高線データを、実際にeTrex20上で表示させるとこうなる。

スケール表記80m(左) 120m(中央) 200m(右)

スケール表記300m(左) 500m(中央) 800m(右)
スケール表記200mまでは10mおき、300mでは20mおき、500m以降では100mおきの等高線が表示される。スケール表記500mは20mおき標高線でもよかったような気がするが、いまさら直すのも面倒なのでこのままで。
しかも見ての通り、GPSMapEditでは表示されていた線種の違いが、eTrex20上ではなくなっている。このへんが機種依存ということらしい。せめて太さの違いでもあればいいのだが、それもないようだ。
これでようやく国土地理院のベクトルデータをeTrex20上で表示できるようになった。さっそくこれを活用してあちこち繰り出したいところだが、あまりにも暑いので当分お預け。はやく涼しくならないかな。