Help us understand the problem. What is going on with this article?

QGIS Web Client 2 を利用するまで(随時更新中)

やりたいこと

現行で、デスクトップのQGISクライアントと、PostGISを利用したシステムが有るのですが、これを利用した業務のオペレーションを他チームに移管する事になりました。
オペレーターの方々はあまりPCに詳しくない方も多く、デスクトップQGISだとあまりにも機能が複雑すぎて使いこなせないので、できるだけ簡便なシステムにして引き渡したい(というか、そうじゃないと引き渡せない)ということで、QGISのサイトを調べていたところ、Web Clientが存在するというのを知りました。
で、色々確認したところ、現在はWeb Client2として開発が進められている模様。
デモサイトなどを見ると、必要最小限のシンプル機能になっているようなので、これならば、なんとか使えるのではないか、ということで、まずは環境構築から…と思ったのですが、やはりユーザーが限定されるOSSだからか、そもそもWeb Client2に関する情報が日本語では皆無! おまけに大本の開発チームの方々はドイツ語圏の方のようで、原文はドイツ語。さらには公式ドキュメントのとおりにやってもチュートリアルすらまともに動かねぇ!という非常に高いハードルだったので、後進の方々のためというより、自分のために、作業途中のメモとして残していこう、というページです。

参考文献

QGIS公式ドキュメント
QGIS gitHub アカウントページ
QGIS Web Client2
QGIS Web Client2 Presentation
QGIS Web Client2 Demo site
空間参照系の概要

作業環境

記事に記載の実行環境は Ubuntu 14.04.5 Ubuntu 20.04 LTSです。
かなり古いですが、ひとまずテストということで、既存サーバーのコピーを元に作業を始めたのでこのバージョン。環境構築の手順がある程度固まって、きちんと運用できるところまで目処が立ったら新しいサーバーで作り直す想定で、この記事もそのための備忘録として作成しています。
古いバージョンのOSで作業をするとオフィシャルの最新ドキュメントと齟齬が大きかったため新しい環境でやり直しました。
記事中の記述の中で、古いバージョンのものだった点については随時修正していきます。


QGI Serverの構築

本記事の目的は QGIS Web Client2 を利用する ことなのですが、そのためにはどうやら、QGIS Serverを稼働させる必要があるようです。(現行システムでは、PostGISを使っていた関係で、postgreSQLに直接デスクトップクライアントを接続して、平面図形を表示・操作していました)
ということで、 公式ドキュメントのQGISサーバー のインストールページに従ってパッケージをインストールしていきます。
ただし、このドキュメントが古いため(?)一部、正常に動かないところがあっての、誤り部分は適宜対応しつつ先に進みます。

1. パッケージのインストール

私が作業した環境では、パッケージ名が qgis-mapserver でした。 apt-cache search qgis などとして、環境に沿ったパッケージ名を探しましょう。パッケージ名が異なっていたのは、作業環境が古かったからでした。Ubuntu 20.04LTSで確認したところ、ドキュメント通り qgis-server のパッケージ名でした。
ただし、 python-qgis の方は python3-qgis となっていたため、こちらはパッケージ名の変更が必要です。以下のコマンドは最新環境に合わせて修正済みです。
インストールコマンドはドキュメントどおりで、パッケージ名のみ変更して実行します。
また、プラグインも利用したいので、公式ドキュメントどおりに python-qgis もインストールしました。

apt install qgis-server
apt install python3-qgis

2. 実行可能ファイル

実行可能ファイルは、公式記載の方法で確認した結果、全く同じ /usr/lib/cgi-bin/qgis_mapserv.fcgi に保存されていました。
ただ、実行結果のバージョン表記まで同じなのですが、なぜかエラーのメッセージが微妙に異なっていましたので、念の為 実行結果を貼り付けておきます。

ubuntu@ip-10-10-2-21:~$ /usr/lib/cgi-bin/qgis_mapserv.fcgi
Application path not initialized
Application path not initialized
Application path not initialized
Warning 1: Unable to find driver ECW to unload from GDAL_SKIP environment variable.
Warning 1: Unable to find driver ECW to unload from GDAL_SKIP environment variable.
Warning 1: Unable to find driver JP2ECW to unload from GDAL_SKIP environment variable.
Initializing server modules from  "/usr/lib/qgis/server"

"Checking /usr/lib/qgis/server for native services modules"
"Loading native module /usr/lib/qgis/server/libdummy.so"
"Loading native module /usr/lib/qgis/server/libwcs.so"
"Loading native module /usr/lib/qgis/server/libwfs.so"
"Loading native module /usr/lib/qgis/server/libwfs3.so"
"Loading native module /usr/lib/qgis/server/libwms.so"
"Loading native module /usr/lib/qgis/server/libwmts.so"
QFSFileEngine::open: No file name specified
Content-Length: 54
Content-Type: text/xml; charset=utf-8
Server:  Qgis FCGI server - QGis version 3.10.4-A Coruña
Status:  500

<ServerException>Project file error</ServerException>

3. HTTPサーバ構成

これは基本的にドキュメントどおりで問題ありませんでした。 apache2 をインストールして qgis.demo.conf を作成。ドキュメントに記載されているconfファイルの中身をコピペするだけでOKです。
その後、 apt install xvfb でxvfbをインストールし、 xvfb.service 作成してサービスとして起動するのですが、私の環境では

systemctl enable xvfb.service
systemctl start xvfb.service
systemctl status xvfb.service

この3つを実行するための systemctl コマンドがなく、実行できませんでした。
最近の環境だと大体インストールされている環境がほとんどだと思いますが、見つからなかった方は先に apt-get install systemd systemd-services を実行してください。systemdがインストールされ、 systemctl コマンドが利用できるようになります。

最新のUbuntuでははじめからインストール済みでしたので、特段の作業は不要で、上記のコマンドがそのまま実行できます。

最後に、 curl コマンドでHTTPリクエストを送信し、サーバの動作確認を行っています。
HTTPサーバの環境構築に慣れていない方のために補足すると、

/home/qgis# curl http://qgis.demo/cgi-bin/qgis_mapserv.fcgi
curl: (6) Could not resolve host: qgis.demo

上記のエラーが発生した場合は名前解決ができていないので、 hosts ファイルに 127.0.0.1 qgis.demo を書き込みます。
わからない方は、公式ドキュメントのcurlコマンドが記載されているすぐ上の、日本語に翻訳されていない英文部分にある sh -c "echo '127.0.0.1 qgis.demo' >> /etc/hosts" を実行すればOKなはず。

4. 別の仮想ホスト作成

こちらは、要件次第でやってもやらなくても、ということになると思いますので、本記事では割愛します。
これに対応が必要な方の場合は、対応方法もご存知だろうと思いますので。

ただ、以後のテストで外部(ローカルPCなど)からブラウザからリクエストを送って確認をされる場合に、apache2の設定がデフォルトのままだと、おそらく、リクエストが正常にQGISサーバに送れずにエラーとなってしまうかと思います。

その時は以下のコマンドをお試しください。

a2dissite 000-default
service apache2 restart

apache2の場合、標準で 000-default.conf というバーチャルホストが設定されており、これがデフォルトになっているのですが、3の工程で作成した qgis.demo.conf よりこちらが優先となってしまうため、外部からのリクエストではうまく動きません。
このため、 sites-enabled 配下に作成されているシンボリックリンクを削除して、 000-default のサイトを利用しないようにした上で apache2 を再起動すると、 qgis.demo がデフォルトでのアクセス先となるため、外部からアクセスした時に直接応答できるようになると思います。


これで公式ドキュメントのインストールは完了です。
続けて、次の工程 WMSサーバを運用する に進みます。


WMSサーバの設定

私はここで初っ端からつまづき、なかなか解決できませんでした。
というのも、公式ドキュメントにある情報が古くなっていて、まともに動かないのです…。

ということで、手順を一つずつ見ていきます。

5. トレーニングでもデータの取得

公式ドキュメントページの冒頭、日本語翻訳されていない英文部分を読むと、 Training demo data というリンク先のファイルをダウンロードし解凍。中にある qgis-server-tutorial-data というサブディレクトリを確認する とあります。
実際、リンク先のファイルをダウンロードして解答すると、指示された通りのサブディレクトリがあります。
が、 このリンク先のファイルが古いようで、このファイルを使ってこの先の工程にすすめると、サーバーエラーとなり、QGIS Serverがまともに動きません
そこで、 Training demo data のリンクURLをよく見てみると https://github.com/qgis/QGIS-Training-Data/archive/v2.0.zip となっています。
名前の通り、アーカイブされた v2.0 のファイルのようですが、現在のQGIS Serverは3.10です。
ということで、このdemo dataの新しいものを取得します。
新しいデータは同じくgithubアカウント上で公開されています。
https://github.com/qgis/QGIS-Training-Data/
こちらのリポジトリを git clone するなり、zipをダウンロードするなりしましょう。
私はzipをダウンロードしました。

wget https://github.com/qgis/QGIS-Training-Data/archive/master.zip
unzip master.zip

中身のフォルダ構成は、先程の v2.0 のものと同じなのですが、unzipすると QGIS-Training-Data-master され、更に公式ドキュメントに記載のないフォルダ階層があり、若干階層が深くなっています。

/home/qgis# ll QGIS-Training-Data-master
total 36
drwxr-xr-x  3 root     root      4096 Apr 17 18:30 ./
drwxr-xr-x  5 www-data www-data  4096 Apr 22 11:40 ../
drwxr-xr-x 14 root     root      4096 Apr 17 18:30 exercise_data/
-rw-r--r--  1 root     root     18801 Apr 17 18:30 LICENCE.md
-rw-r--r--  1 root     root        70 Apr 17 18:30 README.md
/home/qgis# ll QGIS-Training-Data-master/exercise_data/
total 7532
drwxr-xr-x 14 root root    4096 Apr 17 18:30 ./
drwxr-xr-x  3 root root    4096 Apr 17 18:30 ../
-rw-r--r--  1 root root   75487 Apr 17 18:30 example.qgs
drwxr-xr-x  2 root root    4096 Apr 17 18:30 forms/
drwxr-xr-x  3 root root    4096 Apr 17 18:30 grass/
-rw-r--r--  1 root root 5636096 Apr 17 18:30 landuse.sqlite
drwxr-xr-x  2 root root    4096 Apr 17 18:30 postgis/
drwxr-xr-x 24 root root    4096 Apr 17 18:30 processing/
drwxr-xr-x  2 root root    4096 Apr 17 18:30 projected_data/
drwxr-xr-x  4 root root    4096 Apr 17 18:30 qgis-server-tutorial-data/
drwxr-xr-x  3 root root    4096 Apr 17 18:30 raster/
drwxr-xr-x  2 root root    4096 Apr 17 18:30 school_property_photos/
drwxr-xr-x  2 root root    4096 Apr 17 18:30 shapefile/
drwxr-xr-x  2 root root    4096 Apr 17 18:30 styles/
drwxr-xr-x  2 root root    4096 Apr 17 18:30 symbols/
-rw-r--r--  1 root root 1941504 Apr 17 18:30 training_data.gpkg
drwxr-xr-x  2 root root    4096 Apr 17 18:30 world/
/home/qgis# ll QGIS-Training-Data-master/exercise_data/qgis-server-tutorial-data/
total 13532
drwxr-xr-x  4 root root     4096 Apr 17 18:30 ./
drwxr-xr-x 14 root root     4096 Apr 17 18:30 ../
drwxr-xr-x  2 root root     4096 Apr 17 18:30 Icons/
-rw-r--r--  1 root root 12652544 Apr 17 18:30 naturalearth.sqlite
-rw-r--r--  1 root root      127 Apr 17 18:30 README.md
drwxr-xr-x  2 root root     4096 Apr 17 18:30 Template/
-rw-r--r--  1 root root   602124 Apr 17 18:30 world3.qgs
-rw-r--r--  1 root root   577322 Apr 17 18:30 world.qgs

対象フォルダ配下のデータをすべて、公式ドキュメントに従い /home/qgis/projects/ 配下にコピーします。

/home/qgis# cp -pr QGIS-Training-Data-master/exercise_data/qgis-server-tutorial-data/* projects/
/home/qgis# ls projects/
Icons  naturalearth.sqlite  README.md  Template  world3.qgs  world.qgs

これでやっと環境の準備が整いました。

6. リクエストの実行

公式ドキュメントに記載されているリクエストを、ブラウザから入力(URLを入力)することになりますが、注意点は、全てのコマンドにおいて、 MAP パラメータの指定ファイルを world.qgs から world3.qgs に変更します。
それから、ドキュメントにも記載がありますが、chromeなど( firefox以外のブラウザ、との記載ですが私はfirefoxで試していないためどこまで影響があるのかは把握できていません )のブラウザで実行する際は、複数行に分けて記載されているコマンドを1行にして入力する必要があります。
例えば

http://qgisplatform.demo/cgi-bin/qgis_mapserv.fcgi
?MAP=/home/qgis/projects/world.qgs
&SERVICE=WMS
&VERSION=1.3.0
&REQUEST=GetMap
&BBOX=-432786,4372992,3358959,7513746
&SRS=EPSG:3857
&WIDTH=665
&HEIGHT=551
&LAYERS=countries
&FORMAT=image/jpeg

のコマンドは

http://qgisplatform.demo/cgi-bin/qgis_mapserv.fcgi?MAP=/home/qgis/projects/world3.qgs&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&BBOX=-432786,4372992,3358959,7513746&SRS=EPSG:3857&WIDTH=665&HEIGHT=551&LAYERS=countries&FORMAT=image/jpeg

と入力して下さい。
ローカルのエディタなどにドキュメントのコマンドをコピーし、改行コードを消して入力すればよいかと思います。
これでやっと、ドキュメント通りの、イメージ画像を取得することができたと思います。

image.png

これで、パラメータをいろいろと付け替えながら、いろんな地図が取得できるはず!
QGIS Serverに対して利用できるパラメータの一覧はこちらに記載されているようです。(まだ詳しく見切れていないのでもしかしたら違うページもあるかも…)
https://docs.qgis.org/3.10/ja/docs/user_manual/working_with_ogc/server/services.html#extra-getmap-parameters


QGISデスクトップとの接続

QGIS Serverがなんとか動く状態にはなりましたが、まだまだ動いていない物が多く、設定を調整したりといった工程が必要ですが、その都度、URL形式のサーバーリクエストを書き換えて実行するのは非常に面倒なので、当初の目的は QGIS Web Client2の利用ではありますが、まずはQGISデスクトップを接続してみます。

a) QGISデスクトップのサーバ設定

手元で利用していたのがMac版 QGIS 3.4 でしたので、このバージョンでそのまま利用しています。
QGISを起動後、新規プロジェクトを作成します。プロジェクト名などは適当に設定してください。
空のプロジェクトが出来上がったら(おそらく、画面の表示は真っ白のはずです)、 レイヤー > レイヤーの追加 > WMS/WMTSレイヤの追加 を実行します。
表示されたダイアログの レイヤ タブの 新規(N) をクリックすると、以下のダイアログが表示されます。

スクリーンショット 2020-04-23 17.15.32.png

ここで、 名称 は識別のための適当な名前を( my-qgisなど )、そしてURL欄には構築したQGIS ServerのアクセスURLを設定します。
このとき、URLは

http://qgisplatform.demo/cgi-bin/qgis_mapserv.fcgi?MAP=/home/qgis/projects/world3.qgs

このように、 fcgiの実行ファイルの後ろに、mapパラメータを渡す形で設定してください 。実行ファイルのみの指定ではエラーとなり、正常に取得ができませんでした。
URLの入力が完了したら、 OK をクリックしてダイアログを閉じた後、サーバーのリストから今入力したサーバーを選択。 接続 ボタンをクリックします。
すると、そのすぐ下のリストに以下のように、ID欄にレイヤーの一覧が表示されます。サンプルの world3.qgs を利用しているのであれば、画像と同じ内容かと思います。

スクリーンショット 2020-04-23 17.30.20.png

ここで、ID0の項目を選択すると、3層のレイヤーすべてを指定することとなります。
countriesだけで良ければ、ID5を選択してください。
最後に、重要なポイントが タイルサイズ です。
初期値ではこの欄が空欄なのですが、 ここが空欄だとエラーとなり、画面の項目が描画されません
必ず、適当な値(画像では150ですが、それ以下でも問題ありませんでした。サーバー負荷とネットワークとの兼ね合いで適当な値を選べばいいのだと思われますが、そこまでは確認できていません)を指定する必要があります。

タイルサイズを指定して右下の 追加 をクリックすると、QGISデスクトップの「レイヤー」タブに、新規レイヤーが追加され、 Close を押してダイアログを閉じると、サーバーに接続し、世界地図がQGIS上に表示されるはずです。
その後は、通常のQGISを操作するのと同様に、マウスで移動させたり、拡大・縮小させて地図を操作することができるようになります。

スクリーンショット 2020-04-23 17.37.50.png

上の図は若干歯抜けのエリアがありますが、サーバーのスペックを抑えて構築している関係によるもので、リロードしたりズームしたりすることで正常に読み込み直されます。おそらくこの辺のサイズなどが、タイルサイズを調整することでサーバの負荷やネットワークを調整することになるのだと思います。


QGIS Web Client2 の構築

ひとまず、QGIS Serverが動いている様子なので、そのままQGIS Web Client2(以下QWC2)を動かしてみようと思います。

7. QWC2インストール

まずはGitHub上のREADMEを確認。手順に沿って実行してみます。
https://github.com/qgis/qwc2-demo-appQuick start を参照。

git clone --recursive https://github.com/qgis/qwc2-demo-app.git
cd qwc2-demo-app
yarn install

早速エラーとなり動きません…orz

【以下2020/04/30に書き換え】
Ubuntu 18.04で実行して見ると、yarnが全く動かなかったので、とりあえず公式サイトの案内にしたがい
https://classic.yarnpkg.com/en/docs/install#debian-stable

curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list

sudo apt update && sudo apt install yarn

と実行してyarnをインストール。
再度実行すると動きはしたのですが、makeコマンドやg++がインストールされていないとエラーに。

apt install make
apt install g++

を実行後、再度 yarn install を実行することで、正常に処理が終了するようになりました。

では、いざ yarn start を実行!…したところ、見事に失敗…。
原因を探ってみます…。

原因は、どうやら、 yarn start 実行時に作成される themes.json ファイルが、パーミッションの関係で作成できなかったことによるもののようです。
sudo yarn start とすることで無事、コマンド実行に成功しました。
これで、同じコンソール上から curl http://localhost:8081 を実行するとそれっぽい応答が帰ってくるようになりました。

~$ curl http://localhost:8081
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui" />
        <meta name="HandheldFriendly" content="true" />
        <meta name="apple-mobile-web-app-capable" content="yes" />
        <title>QGIS Web Client 2</title>
        <link rel="stylesheet" type="text/css" href="assets/css/qwc2.css" />
        <link rel="apple-touch-icon" href="assets/img/app_icon.png"/>
        <link rel="apple-touch-icon" sizes="72x72" href="assets/img/app_icon_72.png"/>
        <link rel="apple-touch-icon" sizes="114x114" href="assets/img/app_icon_114.png"/>
        <link rel="apple-touch-icon" sizes="144x144" href="assets/img/app_icon_144.png"/>
        <link rel="icon" href="assets/img/favicon.ico" />
    </head>
    <body>
        <div id="container"></div>
        <script src="dist/QWC2App.js"></script>
    </body>

</html>

ただ、この状態で外部から http://SERVER_IP:8081/ のようにアクセスしても応答は Invalid Host header
このあたりは、QWC2というより、Node.jsなどの設定の問題ですかね…。
このあたりもあまり詳しくないので手探りで調べていこうと思います…。

どうやら、 yarn start をする際に実行コマンドのパラメータとして、hostの値が渡されていて、そこからアクセス許可されるホスト名が指定されている模様。
package.jsonファイル内の値を書き換えることで、動かすことができました!

 37         "start": "npm run tsupdate && npm run themesconfig && npm run iconfont && webpack-dev-server --progress --colors --host 0.0.0.0 --port 8081 ",

 37         "start": "npm run tsupdate && npm run themesconfig && npm run iconfont && webpack-dev-server --progress --colors --host SERVER_IP --port 8081 ",

にすればOK!
これで、とりあえず、地図を表示する初期画面は確認できました。



ということで、QGIS ServerとQGIS Web Client2が動くところまでは来たのですが、現時点で私もここまでしかできていません。
コマンドの入力にしても、この次のコマンドについてはエラーとなってしまい(おそらく、FILTERパラメータのurlのサニタイズの問題)うまく動いていなかったり、実はこの一歩手前の、 ログ出力 の部分も、公式ドキュメントのとおりに /etc/apache2/sites-available/qgis.demo.conf の中にログの出力先を記入(ただし、公式ドキュメントでは、QGISのログ出力場所について、インストールページでは FcgidInitialEnv QGIS_SERVER_LOG_FILE /var/log/qgis/qgisserver.log となっているのに、ログ出力の説明ページでは /logs/qgisserver.log となっていて齟齬があります。個人的には /var/log/ の方が違和感がなかったので、confの内容のまま)したりしているのですが、なぜかログが全く出力されない状態だったりしています…。

さらに、QGIS Web Client2についても設定項目など全く見ておらず、とにかく動かす、というところで来たのでまだまだこれから…というところです。

ということで、引き続き問題が解決できたら都度、記事は更新していきたいと思っています。
最悪、いろいろ作業を進めていった結果、想定している事業運用に使えなさそう、という判断をした場合は、記事のタイトルを変更するようなこともあるかもしれませんがそこはそれということで…。
なにか関連の知見をお持ちの方がいましたら、温かい目で見守っていただき、コメント欄等にて誤りのご指摘、アドバイス等々いただけますと幸いです。

taedookim
専門学校卒業後、SE -> 大学入学 -> NPO法人 -> 新聞社(記者職) -> 新聞社(デジタル部門) -> SE -> SE(今ここ)と、いろいろフラフラした経歴です。 小さい組織での勤務経験が多いので、設計からテスト、バックエンドからフロントまでと、一通り大抵の工程をかじっていますが、一点特化の能力が無いな〜というのが最近の悩み。
http://taedoo.at.webry.info/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした