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名を日本語にすると、なぜかキャッシュのパスに使用されてしまいタイルデータがキャッシュできなかったです。

0 件のコメント:

コメントを投稿