9
08
2012
Garmin GPS用マップソース互換地図の作成 #5
Polish形式データへの変換スクリプトの作成
基盤地図情報(標高点)XMLデータ → Polishファイルへ変換する手順
先の記事で基盤地図情報(標高点)XMLデータとPolishファイルのデータ構造の概要を説明したので、実際にテキスト処理スクリプト言語を用いてXMLデータをPolishファイルのデータに変換して見ることにする.使用するテキスト処理スクリプト言語はPerlやRubyなど何でも良いが、ここではPerlを用いたプログラムを紹介する.
今回は単純に等高線情報だけを取り出すだけなので、行き当たりばったりでやっつけ作業的に短時間でちょこちょこっと書いたのでエラー処理も何も行っていない.Perlのプログラムとしてはとても稚拙なものなので、Perl使いの方々からみれば笑われてしまうようなへっぽこプログラムだ.腕に覚えの有る方は自分で変換プログラム作成に挑戦してみると良いだろう.このプログラムのアイデアは、”ktailab”さんが作成した “xml2mp.pl” スクリプトを参考にさせて貰った.
xml2mp.pl : ”http://ktailab.net/garmin/tools.zip”
他に、アベル父さんが『基盤地図情報から等高線地図作成』というページの中で、MS ExcelのVBAスクリプトを用いて同様な変換を行う方法を紹介しているので参考にすると良いだろう.
コンピュータプログラミングに精通していないとプログラムをカスタマイズするのは難しいだろうが、ある程度コマンドラインを使いこなせれば見よう見まねでも何とかなるだろう.
今回はMac OS Xで処理を行ったが、勿論Linux系やUNIX系のOSであればそっくりそのまま変換スクリプトを走らせることができるだろう.Windowsの場合は、Perlの実行環境などを整えなければならないが、パワーユーザであればWindowsでも実行させることができるだろう.
Perlによる変換プログラム ”kiban2mp.pl”
このプログラムがやっていることは、単純に等高線情報が含まれているXMLデータ中から、等高線の標高情報 <alti>840</alti> と座標情報(緯度・経度)<jps:coordinate>35.230974167 138.970826389</jps:coordinate> とを抽出し、Polish形式のオブジェクト形式に従って出力しているだけである.
Polish形式のオブジェクトヘッダ内で、マップのズームレベルを指定しているが、ズームレベル数やマップの各ズームレベルがハードウェアズームレベルのどのレベルに対応させるかというパラメータは試行錯誤しながら決めるしかないだろう.
今回は、標高レベルが 20m, 50m, 100m, 500m 毎に線情報(線の形状や太さ、色など)を変化させて等高線の表示を見やすく工夫しているが、この辺の数値や線種の調整も試行錯誤しながら最適な値を自分で見つけて欲しい.
XML→Polish形式変換プログラム:
“kiban2mp.pl”
(どーでも良いようなプログラムなので、好きに使って下さい)
使い方; Terminal ウインドウのコンソールライン上で、
%perl kiban2mp.pl XMLファイル マップID > 出力ファイル名
のように指定する.
XMLファイルは 基盤地図情報のファイル名、マップIDは8桁の10進か16進数を指定する.
出力ファイルの拡張子は “.mp” を指定する.
例:$perl kiban2mp.pl FG-JPS-14-Cntr25000-20080331-0012.xml 81140612 > KanagawaCntr12.mp
GarminのGPS上で表示される線の種類としては次のサンプル画像を参考にすると良いだろう.(但し、機種依存なので実際に表示される線種は実機上で確認する必要がある)
Garmin GPSの線種情報 #1
Garmin GPSの線種情報 #2
Garmin GPSの線種情報 #3
[IMG ID] ID=81140612 Name=FG-JPS-14-Cntr25000-20080331-0012.xml TreSize=1536 RgnLimit=768 TreMargin=0.00000 LBLcoding=9 Elevation=M Transparent=N Levels=4 Level0=23 Level1=21 Level2=19 Level3=17 [END-IMG ID] [POLYLINE] ; Label=180 TYPE=0x0020 EndLevel=0 Data0=(35.279353,139.623394),(35.279353,139.623394),(35.279342,139.623430),(35.279320,139.623499), (35.279297,139.623567),(35.279229,139.623670),(35.279190,139.623698),(35.279156,139.623705),
...
(35.278187,139.624852),(35.278164,139.624893),(35.278164,139.624934),(35.278170,139.625000) [END] [POLYLINE] Label=50 TYPE=0x0021 EndLevel=1 Data0=(35.282892,139.623924),(35.282892,139.623924),(35.282864,139.623938),(35.282807,139.623938), (35.282779,139.623931),(35.282723,139.623911),(35.282695,139.623897),(35.282638,139.623883), (35.282599,139.623863),(35.282537,139.623869),(35.282509,139.623869),(35.282465,139.623852),
...
(35.282971,139.624886),(35.282982,139.624955),(35.282986,139.625000) [END]
...
GPSMapEdit, cGpsMapperを用いてIMGファイルを作成する
GPSMapEdit, cGpsMapper を用いてIMGファイルを作成する手順は、以前の記事で紹介したのでここでは触れないが、変換プログラムによって生成されたPolishファイルを一旦GPSMapEditで読み込んで、Polishファイルの中身を確認しておくと良い.
GPSMapEditでヘッダ情報などを修正できるので、必要に応じてPolishファイルの中身を修正しておく.GPSMapEditあるいはcGpsMapper単独でPolishファイルをコンパイルしてIMG形式のマップファイルを出力する.
分割された複数のPolishファイルを一気に読み込んで、広い領域が含まれるIMGファイルを作成することができるが、ファイルサイズが大きすぎるとcGpsMapperがエラーを起こしてしまうので、できれば基盤地図情報側のファイル単位で分割したまま処理するのが良いだろう.地域によっては分割数が多いのでちょっと面倒だが、シェルスクリプトなどを書いて自動化すれば大した手間ではないだろう.
最後に、作成された複数のIMGファイルを “sendmap20” を用いて一つの “GMAPSUPP.IMG” に纏め、Garmin GPS上の所定の場所に”GMAPSUPP.IMG”を転送すればOKだ.
マップズームレベル 2
マップズームレベル 1
マップズームレベル 0
eTrex30 の実機で表示してみる
秦野付近を表示
ズームアップして行くと
更にズームアップして行くと
【GPSMapEditで表示される線種と、実機のeTrex30では表示される線の種類が違うようだ】