QGIS データを Web で表示 #11 - QWC2（終り）

QGIS で作成したデータ（"プロジェクト"）を Web ページで表示する方法について、ノウハウを共有します。

第3回から第6回までで QGIS Server を設置し、QWC2 (QGIS Client 2) によって QGIS プロジェクトを表示する Web 地図アプリを作成し、MapCache を使って実用に耐えるパフォーマンスを確保しました。

- [QGIS データを Web で表示 #3 - QGIS Server](https://qiita.com/softark/items/c1da4f9a52e6727a5e97)
- [QGIS データを Web で表示 #4 - QWC2](https://qiita.com/softark/items/88ac73163cff278063a3)
- [QGIS データを Web で表示 #5 - QWC2（続）](https://qiita.com/softark/items/9d172c9cd6447d13ff0d)
- [QGIS データを Web で表示 #6 - MapCache](https://qiita.com/softark/items/0279178a484b451b15a5)

更に QWC2 の外観と機能のカスタマイズを3回連続で行ってきました。

- [QGIS データを Web で表示 #7 - QWC2（続々）](https://qiita.com/softark/items/c0e7bc72a07ad2aa85ac)
- [QGIS データを Web で表示 #8 - QWC2（続々々）](https://qiita.com/softark/items/cf7c4262b7377927ec1b)
- [QGIS データを Web で表示 #9 - QWC2（続々々々）](https://qiita.com/softark/items/f48e31e7d1ef9623d3ec)

前回は Web 地図アプリの `https` 化と同一オリジン化を行いました。

- [QGIS データを Web で表示 #10 - https 化と同一オリジン化](https://qiita.com/softark/items/fa09e5313858034b8051)

今回は QWC2 に戻って、残っているメニュー・アイテムのカスタマイズを片付けます。

マニュアルとして、`QWC2 / QWC Services` のドキュメントを参照します。

- [QWC2 / QWC Services](https://qwc-services.github.io/master/) > 
    - [Themes Configuration](https://qwc-services.github.io/master/configuration/ThemesConfiguration/)
    - [QWC2 Viewer Configuration](https://qwc-services.github.io/master/configuration/ViewerConfiguration/)
    - [Plugin reference](https://qwc-services.github.io/master/references/qwc2_plugins/)

なお、この一連の記事では、Docker で動く `qwc-services` 環境や `PostGIS` データベースの利用を前提とした機能（特に編集機能）については扱いませんので、ご了承下さい。

では、メニュー・アイテムの続きを見ていきます。

### 1-9. レイヤ・カタログ

外部レイヤをインポートするためのカタログでしょう。よく分かりません。

前回述べたように、QWC2 におけるテーマやレイヤのインポート機能については、私は現在のところ懐疑的な考えを持っています。このレイヤ・カタログの機能についても、ここでは踏み込んだ調査をしません。興味のある方は下記のマニュアルを参照してください。

- [Plugin reference - LayerCatalog](https://qwc-services.github.io/master/references/qwc2_plugins/#layercatalog)

不要なので、`qwc2-demo-app/static/config.json` を編集して、メニューから削除します。

```diff_json
{
        ---
        "plugins": {
            "common": [
                ...
                {
                    "name": "TopBar",
                    "cfg": {
                        "menuItems": [
                            ...
                            {
                                "key": "MapLegend",
                                "icon": "list-alt"
                            },
-                           {
-                               "key": "LayerCatalog",
-                               "icon": "catalog",
-                               "shortcut": "alt+shift+c"
-                           },
                            {
                                "key": "FeatureSearch",
                                "icon": "search"
                            },
                            ...
```

### 1-10. 地物検索

地物検索を有効にするためには、テーマごとに検索プロバイダを構成する必要があります。

`qwc2-demo-app/themesConfig.json` において、テーマ `"isg"` について、下記のように検索プロバイダを構成します。

```json
   "themes": {
        "items": [
            {
                "id": "isg",
                "url": "http://gis-svr.vmware:8082/isg",
                ...
                "searchProviders": [
                    {
                        "provider": "qgis",
                        "params": {
                            "title": "スポット検索",
                            "expression": {
                                "spots": "\"name\" LIKE '%$TEXT$%' OR \"type\" LIKE '%$TEXT$%'"
                            }
                        }
                    },
                    {
                        "provider": "qgis",
                        "params": {
                            "title": "スポット種別検索",
                            "expression": {
                                "spots": "\"type\" = '$TYPE$'"
                            },
                            "fields": {
                                "TYPE": {
                                    "label": "種別",
                                    "type": "select",
                                    "options": ["七不思議", "寺社", "公共施設", "モニュメント", "自然"]
                                }
                            }
                        }
                    },
                    {
                        "provider": "qgis",
                        "params": {
                            "title": "棚田検索",
                            "expression": {
                                "tanada": "\"type\" = $TYPE$"
                            },
                            "fields": {
                                "TYPE": {
                                    "label": "作物",
                                    "type": "select",
                                    "options": [
                                        {"value": "100", "label": "コシヒカリ"},
                                        {"value": "200", "label": "その他"}
                                    ]
                                }
                            },
                            "featureCount": 500
                        }
                    }
                ]
            }
```

最初のものは、入力されたテキストを「名称」または「タイプ」に含む地物を「スポット」レイヤから検索します。

二番目のものは、ドロップダウン・リストで「タイプ」を指定して「スポット」レイヤから地物を検索します。

そして最後のものは、ドロップダウン・リストで「タイプ」を指定して地物を検索します。「タイプ」とその値は、ユーザに分りやすいように「作物」と「コシヒカリ」、「その他」と表示しています。

- `"provider"` ... `qwc2-demo-app` 組み込みの検索プロバイダ `"qgis"` を指定
    - `"title"` ... タイトル
    - `"expression"` ... 検索に使用する式
        - 例えば、、、
            - `"レイヤ名": "\"フィールド名\" LIKE '%$入力フィールド名$%'"` ... 文字列部分一致
            - `"レイヤ名": "\"フィールド名\" = '$入力フィールド名$'"` ... 文字列完全一致
            - `"レイヤ名": "\"フィールド名" = $入力フィールド名$"` ... 数値完全一致
            - `"レイヤ名": "\"フィールド名" >= $入力フィールド名$"` ... 数値比較
            - `AND` や `OR` で条件を連結
    - `"fields"` ... 入力フィールド定義
        - `"入力フィールド名"`
            - `"ラベル"`
            - `"type"` ... `"text"`, `"number"`, または `"select"`
            - `"options"` ... オプション（`"type"` によって異なる）
    - `"featureCount"` ... 取得する地物の上限数（既定値は 100）

入力フィールドの定義を省略した場合、入力フィールドは `"TEXT"` という名の `"text"` タイプになります。

`"select"` タイプのオプションには、ドロップダウン・リストの項目を列挙します。`"value"` と `"label"` が同じで良ければ、`"value"` だけを列挙することが出来ます。

詳細については、下記のマニュアルを参照してください。

- [Search](https://qwc-services.github.io/master/topics/Search/#configuring-the-qgis-feature-search) 
    - [Configuring the QGIS feature search](https://qwc-services.github.io/master/topics/Search/#configuring-the-qgis-feature-search)

メニューから「地物検索」を選ぶと、下の図のような「地物検索」パネルが開いて、検索方法を選ぶドロップダウン・メニューが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12310/d3638f3b-9ff7-4833-a372-11ad214df1ad.png)

「スポット種別検索」を選び、「種別」のドロップダウン・リストから「公共施設」を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12310/a61cb4d4-1150-4dc2-bfd0-1b86906e0ee5.png)

「検索」ボタンを押すと、該当する3つのスポットがリスト表示されるとともに、地図上でハイライト表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12310/f18af4cf-6416-4e97-a114-7454b96993cc.png)

リストのアイコンの意味は以下の通りです。

- `＋` アイコン ... 詳細表示（公開されているフィールドを全て表示）
- 「ルーペ」アイコン ... この地物にズーム
- 「情報」アイコン ... レイヤ情報

:::note warn
エクスポート機能のうち、「クリップボードにコピー」は `https` 環境でないと動作しません。
:::

なお、トップ・バーの検索ボックスでも地物の検索が行えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12310/5f746afa-485f-463f-818b-9ff6c1380d65.png)

検索結果のリストから地物を選ぶと、その地物にズームします。

### 1-11. リンクを共有

「リンクを共有」機能の設定は、`qwc2-demo-app/static/config.json` の中で `Share` プラグインを構成することで行います。

```json
    "plugins": {
        "common": [
            ...
            {
                "name": "Share",
                "cfg": {
                    "showSocials": true,
                    "showLink": true,
                    "showQRCode": true
                },
                "mapClickAction": "identify"
            },
            ...
```

- `"showSocials"` ... SNS への投稿機能を有効化
- `"showLink"` ... URL リンクの表示を有効化
    - 対応しているのは、`email, facebook, twitter, linkedin, whatsapp` です。ちょっと古いですね。
    - `true` ... 有効
    - `false` ... 無効
    - `[string]` ... 有効なものを列挙（例えば、`["emai", "facebook", "twitter"]`）
- `"showQRCode"` ... QR コードを有効化

メニューから「リンクを共有」を選ぶと、下の図のような画面になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12310/a4094bd5-1a91-4da3-a0ea-4a086d97a292.png)

「ピンを表示」を `OFF` にすると、下の図のように、地図画面中央のピンが非表示になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12310/47dd18fd-69c9-467f-811c-338025f1c87e.png)

縮尺を変更したり、スクロールしたり、レイヤの表示状態を変更したりして、好みの地図画面を表示させます。

このとき、ピンは常に画面の中心を差すように移動します。ピンが非表示の場合も、画面の中心に見えないピンがあると考えてください。

「永続リンクを生成」ボタンをクリックすると、下の図のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12310/2c221aaa-707d-4e99-a278-8093a57dd059.png)

`SNS` ボタンを使って投稿したり、リンクや `QRCode` をコピーしてどこかに貼り付けたりして、使います。

:::note warn
「クリップボードにコピー」ボタンは、`https` 環境でないと動作しません。
:::

:::note warn
トップ・バーの検索ボックスを使って地物を特定した場合、その地物を示すピンが表示されます。このピンはリンク生成時に画面中央位置のピンより優先されます。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12310/1c21d942-ea98-4a7e-806d-e5f2d9b9db5a.png)

上記の状態でリンクを生成すると、画面中央のピンは無視され、神光寺仁王門に立っているピンが画面中央を指すものとして使用されます。検索ボックスの検索結果を示したい場合はそれで良いのですが、そうでない場合は検索ボックスをクリアして、検索された地物に立っているピンを抜いてください。

### 1-12. ブックマーク

「ブックマークを保存するためにはログインする必要があります」とのことです。

`qwc-services` 環境でないと利用できないようですので、`qwc2-demo-app/static/config.json` を編集して、メニューから削除します。

```diff_json
{
        ---
        "plugins": {
            "common": [
                ...
                {
                    "name": "TopBar",
                    "cfg": {
                        "menuItems": [
                            ...
                            {
                                "key": "Share",
                                "icon": "share",
                                "shortcut": "alt+shift+s"
                            },
-                           {
-                               "key": "Bookmark",
-                               "icon": "bookmark",
-                               "shortcut": "alt+shift+b"
-                           },
                            {
                                "key": "Tools",
                                "icon": "tools",
                                "subitems": [...]
                            },
                            ...
```

### 1-13. 地図ツール

#### 1-13-1. 領域内の地物情報

トップ・バーのツールバーにあるものと同じ機能です。

[QGIS データを Web で表示 #8 - QWC2（続々々）](https://qiita.com/softark/items/cf7c4262b7377927ec1b) > [5-1-3. Identify ツール](https://qiita.com/softark/items/cf7c4262b7377927ec1b#5-1-3-identify-ツール) を参照してください。

#### 1-13-2. タイム・マネージャ

この機能は、QGIS プロジェクトに時間データ（年月日時分など）を持つベクタ・レイヤが存在することを前提にしています。そして、マニュアルによれば、`qwc-feature-info-service` が走っていないと正常に動作しない機能であるとのことです。

- [Temporal layers (Time Manager)](https://qwc-services.github.io/master/topics/TimeManager/)

これもまた宿題として残しておき、当面はメニューから削除します。

```diff_json
        "plugins": {
            "common": [
                ...
                {
                    "name": "TopBar",
                    "cfg": {
                        "menuItems": [
                            ...
                            {
                                "key": "Tools",
                                "icon": "tools",
                                "subitems": [
                                    {
                                        "key": "Identify",
                                        "icon": "identify_region",
                                        "mode": "Region"
                                    },
-                                   {
-                                       "key": "TimeManager",
-                                       "icon": "clock"
-                                   },
                                    {
                                        "key": "Measure",
                                        "icon": "measure"
                                    },
                                    ...
```

#### 1-13-3. 計測

トップ・バーのツールバーにあるものと同じ機能です。

[QGIS データを Web で表示 #8 - QWC2（続々々）](https://qiita.com/softark/items/cf7c4262b7377927ec1b) > [5-1-1. 計測ツール](https://qiita.com/softark/items/cf7c4262b7377927ec1b#5-1-1-計測ツール) を参照してください。

#### 1-13-4. 赤線引き

「赤線引き」は英語の "Redlining" を直訳した言葉です。日本語として不適切かも知れませんが、英語でも "Redlining" は「差別的な意図を持って地図上で区画分けをする」という意味で使われているようですので、「レッドライニング」と片仮名にしてしまうよりは良いでしょう。

機能としては、一時的なレイヤを作成して図形や文字を描画し、元からあるレイヤと重ねて表示する機能です。元の QGIS データを改変しないので、一時的な作業やプレゼンテーションに向いているでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12310/0e841be5-cbc0-496a-ac3a-0a66632c45ae.png)

上の図は、「赤線引き」の機能を使って、空想上の「秘密の温泉」を地図に追加したところです。

レイヤ・ツリーで確認すると、「赤線引き」というレイヤが追加されているのが分ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12310/b669956e-842b-4a3d-a84c-aec01093c9fd.png)

この機能で作成したレイヤのデータは QWC2 を終了すると失われますので、再利用の予定がある場合は、`KML` または `GeoJSON` としてエクスポートすることが出来ます。

エクスポートした「赤線引き」レイヤのデータは、レイヤ・ツリーの「レイヤをインポート」機能を使って再利用することが出来ます。

「赤線引き」の描画機能について詳細に解説することは、ここではしません。GIS というものに馴染んでいる人にはくだくだしい説明は鬱陶しいだけでしょうし、一方、そうでない人には面倒くさすぎて関心を持てないでしょうし、どちらにせよ、不要だと思います。

私としては、この機能も一般の人たちにとっては専門的すぎると思いますので、メニューからは削除する予定です。

:::note
用語については、近い将来に `qgis/qwc2` レポジトリの `master` において「赤線引き」から「スケッチ」に改訂される予定です。
:::

#### 1-13-5. 地図のエクスポート

メニューから「地図をエクスポート」を選ぶと、次のように、「地図をエクスポート」というパネルが表示され、地図キャンバス全体に薄い灰色のフィルタがかかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12310/a8322449-edc8-4ab0-8f06-fda99e0027b8.png)

地図キャンバス上に矩形を描くと、その部分に穴が開き、パネルの「エクスポート」ボタンが有効化されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12310/ece6edb3-e575-40f5-8d64-50befd55c4b2.png)

「エクスポート」ボタンを押すと、地図画像が生成され、ブラウザによって画像ファイルがダウンロードされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12310/012748c3-4469-4cdb-b1c8-280f8fc88c9b.png)

ラスタ・データのレイヤが含まれている場合は次のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12310/0f27f005-adb7-4900-8024-1bf1e7d68071.png)

背景レイヤは除外されます。

:::note
後述するように、「印刷」においても、外部背景レイヤはそのままでは印刷が出来ません。

しかし、同じ対策が有効ですので、[1-14-4. 背景レイヤを印刷する](#1-14-4-%E8%83%8C%E6%99%AF%E3%83%AC%E3%82%A4%E3%83%A4%E3%82%92%E5%8D%B0%E5%88%B7%E3%81%99%E3%82%8B) を参照してください。
:::

|  | 属性 | 説明 |
|--:|---|---|
| 1| `allowedFormats` | 許容するエクスポート形式の mimetype のリスト<br>指定しなければ、サポートされている形式全て<br>（既定値 = 指定無し）|
| 2| `allowedScales	` | 許容するエクスポート画像の縮尺のリスト<br>指定しなければ縮尺は自由に選択可能<br>`false` を指定すると、現在の縮尺のみを許容<br>（既定値 = 指定無し）|
| 3| `defaultFormat` | デフォルトのエクスポート形式の mimetype<br>指定しなければ、許容される形式の先頭のもの<br>（既定値 = 指定無し）|
| 4| `defaultScaleFactor` | エクスポート縮尺に適用する因数<br>（既定値 = `1`）|
| 5| `dpis` | エクスポート画像の解像度のリスト<br>指定しなければ、サーバの既定解像度<br>（既定値 = 指定無し） |
| 6| `exportExternalLayers` | 外部レイヤをエクスポートするか否か<br>（既定値 = `true`）|
| 7| `fileNameTemplate`	| ファイル名のテンプレート<br>（既定値 = `'{theme}_{timestamp}''）|
| 8| `formatConfiguration` | 形式ごとのカスタム設定<br>一つの形式に複数の設定がある場合はコンボボックスで選択<br>（既定値 = 指定無し）|
| 9| `pageSizes` | フリーハンド指定以外に提供するページ・サイズのリスト<br>（既定値 = `[]'）|

詳細については、下記マニュアルを参照してください。

- [QWC2 / QWC Services](https://qwc-services.github.io/master/) 
    - [Plugin reference](https://qwc-services.github.io/master/references/qwc2_plugins/) > [MapExport](https://qwc-services.github.io/master/references/qwc2_plugins/#mapexport)
    - [Map export](https://qwc-services.github.io/master/topics/MapExport/)

##### 1-13-5-1. エクスポート形式

サポートされている主なものは以下の4つです。

- `image/jpeg` ... JPEG
- `image/png` ... PNG
- `application/dxf` ... DXF
- `applicaiton/pdf` ... GeoPDF

`GeoTIFF(image/tiff)` をサポートするためには、QGIS Server で `wms_geotiff_output` プラグインをインストールする必要があります。

`DXF` 形式のエクスポートを有効にするためには、QGIS のプロジェクトでエクスポート対象レイヤを `WFS/OAPIF` で「公開」とする必要があります。

##### 1-13-5-2. エクスポート画像のサイズ

`pageSizes`(No.9) によって、エクスポートする画像のサイズのプリセットを指定することが可能になります。

```json
            {
                "name": "MapExport",
                "cfg": {
                    ...
                    "pageSizes": [
                        {
                            "name": "A4 縦",
                            "width": 210,
                            "height": 291
                        },
                        {
                            "name": "A4 横",
                            "width": 291,
                            "height": 210
                        }
                    ],
                    ...
```

`"width"` と `"height"` は `mm` 単位で指定します。

「マップをエクスポート」を開くと、次のような画面になり、「サイズ」指定欄で「画面上で選択」、「A4 縦」、「A4 横」を選択することが可能になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12310/e3c4578f-e1e5-4706-b1b2-fc8237af1ef6.png)

上の図で「A4 縦」を選択すると、下の図のように、プリセットされた範囲が地図上に表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12310/eb04afdc-c879-4ec1-bc6b-5126412c867e.png)

通常のディスプレイでは A4 縦は表示しきれないので、上下がはみ出していますので、マウス・ホィールで範囲全体が見えるように調整します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12310/2fb88d0d-af51-44e0-814d-23b0ded42b7e.png)

領域の中を掴んでドラッグすると領域を移動することが出来ます。

また、領域の四隅を掴んでドラッグすると、縦横比を維持したまま、領域を拡大縮小することが出来ます。

##### 1-13-5-3. エクスポート画像の縮尺

プリセットのサイズを選んだ場合は、`allowedScales`(No.2) の設定によって、エクスポート画像の縮尺の選択方法が変化します。

- 指定無し（default） ... 縮尺は自由に選択
    - 縮尺の数値を入力または `ー` と `＋` のボタンで変更
    - 領域の四隅をつかんでドラッグすると、領域のサイズに合わせて縮尺が自動変更
- `false` ... 「マップをエクスポート」を開いた時の縮尺に固定
    - 縮尺入力欄なし
    - 領域の四隅をつかんでドラッグできない
- 縮尺のリスト
    - 縮尺はドロップダウンで選択

ところが、縮尺のリストの指定方法がよく分りません。

```
"allowedScales": [0.0001, 0.005, 0.001],
```

のように実数で指定しても、うまく動きません。

```
"allowedScales": [1000, 500, 100],
```

では、分母だけを指定すれば良いのか、と思ってそうしてみてもダメでした。

おそらくバグなのでしょうが、当面、`"allowedScales"` は指定しないか、`false` に設定するしか無いようです。

:::note warn
さらに面妖なことに、実際にエクスポートされる画像の縮尺は、「エクスポート」ボタンを押したときの地図キャンバスの縮尺になります。つまり、縮尺に依存して表示が `ON/OFF` されるレイヤがエクスポートされるか否かは、地図キャンバスの縮尺に従うことになります。
:::

##### 1-13-5-4. 形式ごとの構成

`"formatConfiguration"` (No.8) によって、形式ごとの構成を指定することが出来ます。

```json
            {
                "name": "MapExport",
                "cfg": {
                    "allowedFormats": [
                        "image/png", "image/jpeg", "application/dxf", "application/pdf"
                    ],
                    "dpis": [96, 300],
                    "exportExternalLayers": true,
                    "defaultFormat": "image/png",
                    "formatConfiguration": {
                        "image/png": [
                        ],
                        "application/dxf": [
                        ]
                    }
                }
            },
```

詳細はマニュアルを参照してください。

#### 1-13-6. ルート探索

マニュアルによれば、`config.json` で `"routingServiceUrl"` に `"Valhalla"` ルーティング・サービスを指定する必要があるとのことです。

- [QWC2 / QWC Services](https://qwc-services.github.io/master/) 
    - [Plugin reference](https://qwc-services.github.io/master/references/qwc2_plugins/) > [Routing](https://qwc-services.github.io/master/references/qwc2_plugins/#routing)

これも今回はパスします。

### 1-14. 印刷

印刷機能の設定はマニュアルの以下の部分に書かれていますので、それを参照しながら進めていきます。

- [QWC2 / QWC Services](https://qwc-services.github.io/master/) 
    - [Plugin reference](https://qwc-services.github.io/master/references/qwc2_plugins/) > [Print](https://qwc-services.github.io/master/references/qwc2_plugins/#print)
    - [Printing](https://qwc-services.github.io/master/topics/Printing/)

#### 1-14-1. 印刷レイアウト

印刷をサポートするためには、テーマ（QGIS プロジェクト）が印刷レイアウトを持っている必要があります。

下の図のような印刷レイアウトをテーマに追加しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12310/6aadd76f-05c6-4974-935b-4a6f38f4adc3.png)

メインの地図に加えて、表題、方位記号、スケール・バー、凡例を印刷します。用紙は A4 縦です。

レイアウト名は「標準 A4 縦」としました。レイアウト名に日本語を使っても大丈夫です。

#### 1-14-2. 基本的な動作

メニューから「印刷」を選択すると、次のような画面になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12310/0757b12d-8360-40ab-90c2-6f716739228f.png)

そのまま「印刷」ボタンを押すと、下のような PDF ファイルがブラウザによってダウンロードされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12310/eaa63c87-4d99-4b13-921e-09c4230fb185.png)

- 背景は印刷されていない
- 地図の領域は QGIS の印刷レイアウトと異なる

地図キャンバス上の領域指定ボックスを指定し直し、ついでに「グリッド」も `ON` にしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12310/4bda88cb-6341-4a43-b788-548e2c172eee.png)

「印刷」ボタンを押した結果、次のような PDF が生成されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12310/ee252700-da7e-4b1e-9d33-582f2f3f8af1.png)

印刷の対象領域や対象レイヤはその場で設定出来る訳ですね。

#### 1-14-3. 印刷機能の設定

|  | 属性 | 説明 |
|--:|---|---|
| 1| `allowGeoPdfExport` | `GeoPDF` のエクスポートを許可するか否か<br>（既定値=指定無し）|
| 2| `defaultDpi` |	デフォルトの印刷解像度（`DPI`）<br>（既定値=`300`）|
| 3| `defaultScaleFactor` |	縮尺の初期値を決定するために地図縮尺にかける因数<br>（既定値=`0.5`）|
| 4| `displayPrintSeries` |	複数ページ印刷のオプションを表示するか否か<br>（既定値=`false`）|
| 5| `displayRotation` | 回転コントロールを表示するか否か<br>（既定値=`true`）|
| 6| `fileNameTemplate` | ダウンロード時のファイル名テンプレート<br>（既定値=`'{theme}_{timestamp}'`）|
| 7| `formats` | 出力ファイルの形式<br>QGIS Server がサポートしていないものを指定すると印刷に失敗する<br>（既定値=`['application/pdf', 'image/jpeg', 'image/png', 'image/svg']`）
| 8| `gridInitiallyEnabled` | グリッドを印刷するか否かの初期値<br>（既定値=`false`）|
| 9| `hideAutopopulatedFields` | 自動的に設定される内容を持つフォーム項目を非表示にする<br>例えば、検索結果のラベルなど<br>（初期値=指定無し）|
| 10| `inlinePrintOutput` |	印刷実行でダウンロードをトリガするのでなく、インライン・ダイアログで印刷結果を表示<br>（既定値=`false`）|
| 11| `printExternalLayers` | 外部レイヤを印刷するか否か<br>（既定値=`true`）|
| 12| `scaleFactor` | `GetPrint` に渡される「赤線引き」描画の線の太さ、フォントサイズなどに適用する縮尺因数<br>（既定値=`1.9`）|

`"displayRotation"`(No.5) は `false` が良いかなと思いますが、その他の項目は既定値で良いようです。

`"hideAutopopulatedFields"` の「自動的に設定される内容を持つフォーム項目」というのは、何のことだが分りませんが、高度な設定に属するようなので、そのままにしておきます。マニュアル（["Printing"](https://qwc-services.github.io/master/topics/Printing/)）を参照してください。

#### 1-14-4. 背景レイヤを印刷する

次のようにすると、外部 `XYZ` タイルで表示している背景レイヤを印刷することが出来るようになります。

#### 1-14-4-1. QGIS プロジェクトで背景レイヤも公開する

今まで、QGIS プロジェクトに含まれる外部 `XYZ` タイルで表示している背景レイヤは、QWC2 では不要だからと、QGIS Server に対して非公開としていました。具体的には、`プロジェクトのプロパティ > QGIS Server > WMS > レイヤの除外` に背景レイヤを含めていました。

これを元に戻して、背景レイヤも QGIS Server に公開するように変更します。

#### 1-14-4-2 テーマの背景レイヤ設定に `printLayer` の設定を加える

次のように、`qwc2-demo-app/themesConfig.json` を変更します。

```diff_json
    {
        "themes": {
            "items": [
                {
                    "id": "isg",
                    "url": "https://webgis.mydomain/qsv/isg/",
                    "externalLayers": [ ... ],
                    "backgroundLayers": [
                        {
-                           "name": "gsijp-std"
+                           "name": "gsijp-std",
+                           "printLayer": "gsijp-std"
                        },
                        {
-                           "name": "gsijp-photo"
+                           "name": "gsijp-photo",
+                           "printLayer": "gsijp-photo"
                        },
                        {
-                           "name": "g-map"
+                           "name": "g-map",
+                           "printLayer": "g-map"
                        },
                        {
                            "name": "g-sat",
+                           "printLayer": "g-sat",
                            "visibility": true
                        }
                    ],
                    ...
```

上記で、`"name"` は別途定義されている外部の背景レイヤの識別名、`"printLayer"` は印刷に使用する内部レイヤの識別名です。`"printLayer"` に指定された内部レイヤは印刷以外には使用されず、レイヤ・ツリーにも出現しません。

印刷の時だけ、QGIS Server 経由で `XYZ` タイルにアクセスする訳ですね。

:::note
なお、この方法によって、「マップをエクスポート」時の背景が印刷されない問題も解消します。
:::

### 1-15. 操作説明書（ヘルプ）

以下が現在の設定です。

```json
    "plugins": {
        "common": [
            ...
            {
                "name": "TopBar",
                "cfg": {
                    "menuItems": [
                        ...
                        {
                            "key": "Help",
                            "icon": "info",
                            "shortcut": "alt+shift+h"
                        },
                        ...
                    ],
                }
            }...
            ...
            {
                "name": "Help",
                "cfg": {
                    "bodyContentsFragmentUrl": "assets/help.html"
                },
                "mapClickAction": "identify"
            },
            ...
        ],
```

すなわち、操作説明書（ヘルプ）の機能は `"Help"` プラグインによって実現されており、実体としては、`"assets/help.html"` をインライン・ダイアログで表示するものとなっています。

メニューは `"Help"` プラグインを参照しているだけです。

どのような内容の操作説明書（ヘルプ）にするかは、ユーザに委ねられています。

なお、これを「ポータル」のメニューと同じように、外部リンクを開くようにすることも出来ます。

```diff_json
        "plugins": {
            "common": [
                ...
                {
                    "name": "TopBar",
                    "cfg": {
                        "menuItems": [
                            ...
                            {
                                "key": "Help",
                                "icon": "info",
+                               "url": "https://isarigami.net/site/map",
+                               "target": "iframe",
                                "shortcut": "alt+shift+h"
                            },
                            ...
                        ],
                    }
                }...
                ...
                {
                    "name": "Help",
                    "cfg": {
                        "bodyContentsFragmentUrl": "assets/help.html"
                    },
                    "mapClickAction": "identify"
                },
                ...
            ],
```

### 1-16. 設定

メニューから「設定」を選ぶと、下の図のように、言語とカラー・スキームを選択するパネルが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12310/917c6128-8790-4c94-89bb-feb5a582e77a.png)

言語とカラー・スキームの選択肢は以下のように定義されています。

```json
    "plugins": {
        "common": [
            ...
            {
                "name": "Settings",
                "cfg": {
                    "languages": [
                        {
                            "title": "English",
                            "value": "en-US"
                        },
                        {
                            "title": "Deutsch",
                            "value": "de-CH"
                        },
                        {
                            "title": "Italiano",
                            "value": "it-IT"
                        }
                    ],
                    "colorSchemes": [
                        {
                            "titleMsgId": "colorschemes.default",
                            "value": "default"
                        },
                        {
                            "titleMsgId": "colorschemes.highcontrast",
                            "value": "highcontrast"
                        },
                        {
                            "titleMsgId": "colorschemes.dark",
                            "value": "dark"
                        }
                    ]
                }
            },
```

縁起物なので、言語の選択肢に「日本語」を追加しておきましょう。

```diff_json
                        "languages": [
+                           {
+                               "title": "日本語",
+                               "value": "ja-JP"
+                           },
                            {
                                "title": "English",
                                "value": "en-US"
                            },
                            {
                                "title": "Deutsch",
                                "value": "de-CH"
                            },
                            {
                                "title": "Italiano",
                                "value": "it-IT"
                            }
                        ],
                    ...
```

### 1-17. 外部リンク

この部分は、自由に変更できます。

```diff_json
        "plugins": {
            "common": [
                ...
                {
                    "name": "TopBar",
                    "cfg": {
                        "menuItems": [
                            ...
-                           {
-                               "key": "ExternalLink",
-                               "icon": "link",
-                               "url": "http://example.com?extent=$e$",
-                               "target": "iframe"
-                           }
+                           {
+                               "key": "ExternalSites",
+                               "icon": "collapse",
+                               "subitems": [
+                                   {
+                                       "key": "GsiJp",
+                                       "icon": "open_link",
+                                       "url": "https://www.gsi.go.jp/"
+                                   },
+                                   {
+                                       "key": "Hyogo50cm",
+                                       "icon": "open_link",
+                                       "url": "https://www.geospatial.jp/ckan/dataset/2022-hyougo-geo-potal"
+                                   },
+                                   {
+                                       "key": "HinataGis",
+                                       "icon": "open_link",
+                                       "url": "https://hgis.pref.miyazaki.lg.jp/hinata/"
+                                   }
+                               ]
+                           }
                        ],
                    }
                }
            ],
```

上記では、ポータルのメニュー末尾と同じようにしましたが、いっそ何も無くても構わないでしょう。

## And so, what's next?

これで一連の記事は一通り完結しました。次はありません。

言及できなかった問題もたくさんあります。特に、編集関連の機能がまるまる手付かずのまま残っているのが気になる所です。

しかし、編集機能も備えた高機能な Web 地図アプリを制作するとなると、スタンドアローンの QWC2 と QGIS Server の組合せでは力不足であり、それらを含む総合的な Web GIS エコ・システムとしての `qwc-services` を導入する必要が出てくるでしょう。

それについては、以下の記事を参照してください。

- [QGIS データを Web で表示 #0 - 目次](https://qiita.com/softark/items/0615ed7611e9a410ab3b)
    - [qwc-services + MapCache + PostGIS](https://qiita.com/softark/items/0615ed7611e9a410ab3b#qwc-services--mapcache--postgis)

なお、一連の記事に間違いがあれば、適宜、修正したり追記したりしようと考えていますので、お気づきの点があれば是非ご教示ください。