JSMAP2地図をタイル地図にする ~ ラスタ地図をQGISにロードする
kunimiyasoftでは、独自開発したGISソフト「JSMAP2」を使って独自地図を作成し、それを組み込んだ様々なアプリケーションを提供してきました。
しかし、実績ではなかなかうまくいかず、今後も広まることは難しそうです。また、工数が限られてきたこともあり、地図組み込みアプリケーションは「東京周辺マップ」で最後にしたいと思います。(※東京周辺マップは非公開としました。日本周遊マップが後継ソフトウェアです)
でも、地図自体は今後も作って行きたいです。そこで、アプリケーションの作成は止めて、汎用的な地図を提供して行こうと考えています。
それは、googleマップや国土地理院、OpenStreetMapなどで提供されるタイル地図の採用です。これと同じ仕様の地図を提供すれば、アプリケーションを作成する必要がなくなります。
それでは、どのような作業が必要なのでしょうか。
1.タイル地図の仕様
タイル地図はインターネット上で提供され、以下のような形式になっています。
URL/z/x/y.png
URLの後ろに「z:倍率」「x:経度番号」「y:緯度番号」が付きます(緯度番号、経度番号という呼び方は私が勝手に名付けたものです)
地図は、倍率ごとに用意され、256×256ドットに細分化されます。まず、倍率0であれば、世界全体が256×256ドットに収められます。これが倍率1になれば、512×512ドットが世界全体になり、4枚の地図で構成されます。そして、経度番号、緯度番号が「0,1」になり、組み合わせで4通りになります。
これが普段見る地図の倍率となると、10倍~18倍くらいになり、地図の数は膨大になってしまいます。そのため、途方もない作業が発生してしまいます。
残念ながら、作成ロジックを作る時間は取れません。どうしたら良いでしょうか。
2.QGISを使う
そこで、GISアプリケーションの「QGIS」を使います。今までにもOpenStreetMapの地図で使用してきましたが、今度はJSMAP2でビットマップ出力した地図(ラスタ地図)を読み込んで、タイル地図出力します。ほんと、QGISって素晴らしいGISです。
それでは、順に説明していきます。
3.ベースマップとしてOpenStreetMapを読み込む
最初に、JSMAP2地図の範囲にあるOpenStreetMapのOSMファイルを読み込みます。これは、読み込むJSMAP2地図の緯度と経度を指定するのに使います。
メニューの「ベクタ」「QuickOSM」を選び、開いたQuickOSMウインドウで「OSMタブ」を選択します。そして、該当するOSMファイルを選び、QGISへロードします。
他の方法が簡単!
OpenStreetMapのタイル地図を読み込んだ方が早いです。新しいQGISなら、こちらを使ってください。
4.ラスタ地図を読み込む
JSMAP2でPNG形式で出力した地図画像をQGISで読み込みます。メニューの「ラスタ」「ジオリファレンサ」を選択します。※ver 3.28.8では、「レイヤ」「ジオリファレンサ」です。
ジオリファレンサの画面が表示されたら、「ラスタを開く」ボタンを押してラスタ地図を選択します。
ラスタ画像がロードされたら、メニューの「設定」「変換の設定」を選択します。
ここで、QGISのレイヤーに取り込む際の各種設定を行います。いろいろパラメータがありますが、選び方で結果がけっこう変わります。
私も、いろいろ設定を変えて、上画像の結果が一番良い取り込みになりました。みなさんも、パラメタをいろいろ変えて取り込んでみてください。
ジオリファレンサにラスタ地図が表示されていますが、緯度・経度情報がありません。そこで、ラスタ地図内の何点かを選び、緯度・経度を追加します。「点の追加」ボタンを押して、任意の場所でクリックします。
緯度・経度を指定するウインドウが表示されます。クリックした場所の緯度・経度を指定します。
でも、緯度・経度を入力するのは手間が掛かります。そこで「地図キャンパスから」ボタンを押します。
ジオリファレンサのウインドウが最小化し、QGISの基本画面に戻ります。基本画面にはOpenStreetMapの地図が表示されているので、ジオリファレンサでクリックした場所と同じ場所をクリックします。
すると、再びジオリファレンサの画面に戻ります。緯度・経度が自動入力されているので「OK」ボタンを押して完了させましょう。
このように、ラスタ地図上の任意の点に緯度・経度を指定します。最低でも2点は必要です。3点位は指定しましょう。
それでは、いよいよラスタ地図をQGISのレイヤーへロードします。「ジオリファレンスの開始」ボタンを押します。
うまく取り込みができないこともあるので、ジオリファレンサの「設定」「変換の設定」で設定をいろいろ変えてリトライしてください。
無事にQGISのレイヤーに、ラスタ地図がロードされました。
5.QMetaFilesプラグインでタイル地図出力
QGIS上にラスタ地図がロードされたので、タイル地図出力します。メニューの「プラグイン」「QMetaTiles」を選択します。
QMetaFilesウインドウが表示されます。ここで、出力先のディレクトリと出力する倍率範囲を指定します。また、「Enable Metaling」は必要ないのでチェックを外します。
「OK」ボタンを押すと、指定したディレクトリにタイル地図が出力されます。
タイル地図の枚数は、高倍率になると途方もない枚数になります。個人なら13倍くらいが限界でしょうか。その13倍にしても、北海道全体で19,519枚の画像が必要です(範囲の取り方で変わる)。
6.出力されたタイル地図の検証
出来たタイル地図と、国土地理院の提供するタイル座標確認ページとを比較してみます。
倍率13倍で、経度座標が「7398」、緯度座標が「3007」で比較すると、ほぼ一致しています。見事にタイル地図ができています。
このように、ラスタ地図をタイル地図に変換することができました。
実際に、アプリケーションで表示してみました。テストアプリケーションはosmdroidライブラリを使用しており、タイル地図を表示することができます。
自分のレンタルサーバーに地図をおいて表示してみたのが、上の画像です。こうすれば、アプリケーション内に地図を用意する必要がありません。
osmdroidが行う画像の拡大・縮小は簡単な仕組みのため、ちょうど良い地図画像を用意しないと汚くなります。上の画像でも、まだ調整が不十分です。この辺の技術を確立したいです。
7.タイル地図の提供は自サーバーを立ててからです
困難に思えたタイル地図の作成も、QGISを使うことにより作成できました。今後、時間が取れる時には、タイル地図の作成を進めたいと思います。
しかし、タイル地図の提供は、ずっと先になりそうです。それは、kunimiyasoftのサイト運営にはレンタルサーバーを利用しているため、地図アクセスによる負荷が問題になるからです。
そのため、タイル地図を提供する場合は、自サーバーを立てる必要があります。それは、今時点ではできません。将来、ラズベリーパイによる自サーバーを立てた時にタイル地図の提供を行いたいですが、まだまだ先になります。
※レンタルサーバーで提供することにしました。現状では、それほどのアクセスがないとの見通しからです。
でも、地図画像をタイル地図化して提供したいという事例は、結構あるのではないでしょうか。その時に、当記事を参考にしていただければさいわいです。