2015年7月23日木曜日

【Qt5.5 Qt Location】国土地理院地図プラグインを作ろう!(その2)

Qt Location 国土地理院地図プラグイン

国土地理院で提供されている地理院タイルをQtLocationで使用するためのプラグインが大体できたので公開します。


地理院タイルを利用する際は利用規約をよーくお読みくださいね。

現在用意しているのは、地理院タイルのうち以下の3点になります。
  •  標準地図 
  •  色別標高図
  •  写真

 
プラグインの使用方法

上記プロジェクトファイルをQtLocationのplugin/geoservicesに追加してビルドします。
コンパイル後、ライブラリ libqtgeoservices_kokudo.so が作成されるので、これをビルドディレクトリ/plugin/geoservicesに置きます。これはandroidだったら

Qt/5.5/android_armv7/plugin/geoservice

などになります。

QMLのMapのpluginプロパティに"kokudo"と指定してください。


備考

私のアンドロイド開発用デバイスはNexus7(2012)を使っています。今回、こちらを使用してプラグインのテストを行っていたところ、Mapを表示中になぜかタイルの一部が欠けてしまうという現象に悩まされました。これは今回追加したプラグインだけでなく、プリセットのOSMプラグインでも同様の現象が確認されました。

最初は「キャッシュメカニズム周りが臭いな」と予想してソースにダイブしてたんですが、最終的には、以下のようなメッセージが表示されることから、このタブレット(Nexus7 2012)がOpenGLのstencil bufferがサポートされていない為だと考えています。おそらくレンダリング処理で失敗しているのだろうと。

QSGContext::initialize: stencil buffer support missing, expect rendering errors

といっても他に代替できるAndroidデバイスはないので、仕方なくQtのバグトラッカーをあさったところ、この根本的な原因は未解決のこちらの問題が原因だと思うんですが、あいにくOpenGLの知識がないので自力では治せそうになく、ダメ元でこちらの情報をもとに


QQuickWindow* window = qobject_cast<QQuickWindow*>(engine.rootObjects().at(0));
QSurfaceFormat format = window->format();
format.setStencilBufferSize(-1);
format.setDepthBufferSize(-1);
window->setFormat(format);


を試してみたところ、タイルが欠ける問題は収まりました。なぜかわかってないけど、まあよかった(?)

あと、つまずいたとこは、プラグインのProvider名を日本語にすると、なぜかキャッシュのパスに使用されてしまいタイルデータがキャッシュできなかったです。

2015年7月9日木曜日

【Qt5.5 Qt Location】国土地理院地図プラグインを作ろう!(その1)

先日正式リリースされたQt5.5では、テクノロジープレビューとしてQt Locationが追加されました。QtLocationは地図、ナビゲーションなど、いわゆる地図アプリを作成するための素敵なライブラリです。

QtLocationでは対応するバックエンドのプラグインとして以下のものが用意されていますが

  • OpenStreatMap
  • MapBox
  • Nokia Here

こと日本の地図に関して言えば、OpenStreatMap以外はかなり残念な内容になっています。筆者は、常々、Qtで登山用の地図アプリを作ってみたいと考えていましたが、これでは到底使える内容ではありません。

そこで今回のプロジェクトでは、国土地理院で提供されている地理院地図API(地理院タイル)に対応したQtLocationのプラグインを作成してみました。

実装の詳細は後ほど報告したいと思いますが(githubで公開予定)、今回は速報として軽く紹介まで。

さて、以下の図は、新しく作成した地理院地図プラグインをQtのサンプルプログラムMapViewerに組み込んで、地理院地図を表示している様子です。

横浜駅周辺


ケーブルカーが新しくなった大山周辺



うーん、完璧。

どうです!これなら登山用の地図として使えるんじゃないですか?
こいつでROS用のGPSナビゲーションプログラムなども作りたいなあ。

いやー、本当、Qtは面白くなってきましたねえ。