Qt Location 国土地理院地図プラグイン
地理院タイルを利用する際は利用規約をよーくお読みくださいね。
現在用意しているのは、地理院タイルのうち以下の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);
QSurfaceFormat format = window->format();
format.setStencilBufferSize(-1);
format.setDepthBufferSize(-1);
window->setFormat(format);
を試してみたところ、タイルが欠ける問題は収まりました。なぜかわかってないけど、まあよかった(?)
あと、つまずいたとこは、プラグインのProvider名を日本語にすると、なぜかキャッシュのパスに使用されてしまいタイルデータがキャッシュできなかったです。