---
# System prepended metadata

title: 流路と5mシフトアップ領域の作成

---

流路と5mシフトアップ領域の作成
===

QGIS 3.4 で動作確認しています。

# DEMの準備

## 基盤地図情報の5mDEMを使う場合

### 取得

[基盤地図情報ダウンロードサービス](https://fgd.gsi.go.jp/download/menu.php) の数値標高モデル からダウンロードします。作成方法が異なるDEMが混ざるとよくないと思うので，5A（レーザー測量）のみをチェックを入れて取得するといいと思います。

### GeoTiff に変換
昨年度のGIS社内研修のテキストを参照してください

## 点群データをもとにDEMを作る場合
Clowd Compare というオープンソースソフトウェアを使ってDEMにします。点群が手に入った際にご相談ください

## 一定の範囲でクリップ

あまり大きなDEMだと処理に時間がかかるので，1000x1000px以下をめどに，必要範囲で切り抜いてください。

ラスタ > 抽出 > 範囲を指定して切り抜き で 切り抜き領域：キャンバス領域を使用 でアバウトに切り出してもいいし，

ベクタ > 調査ツール > レイヤ範囲の抽出 で 現地調査のGPSデータの領域を作成し，バッファ（先端スタイル: flat）で範囲をある程度大きくして，それを使って切り抜いてもいいと思います。小さくしすぎると地形から流路を計算できなくなるので注意です。

# 「流路」と「周囲の標高値ポイント」の作成

DEMを材料に流路のラインデータと，その周囲の標高値をサンプルしたポイントデータを作ります。図は処理の流れです。白い四角はQGISのプロセッシング内の各ツールでの処理です。

![](https://i.imgur.com/5qsyYNs.png)

一般的に，水門解析では初めにくぼ地の除去をするようです。

参考： [実務に効く!ArcGISでの解析手法と便利なツールのご紹介](https://blog.esrij.com/arcgisblog/wp-content/uploads/2016/08/2gislandslide_arcgis_.pdf)

手順はこちら [進捗報告: Watershed Basin in SAGA GIS](http://paneer-roll.blogspot.com/2014/06/watershed-basin-in-saga-gis.html) を参考にしました。


## 作成済みのQGISモデルを使う

処理の流れを試行錯誤するにあたりQGISのグラフィカルモデラーを使ったので，このときにできたモデルファイルを使うと，この一連の処理を流れを再現できます。

1. QGIS(3.4で動作確認済み)のメニューのプロセッシング > ツールボックス > ![](https://i.imgur.com/0kCaIWX.png) > 既存のモデルを開く or ツールボックスにモデルを追加 > flowpath_dempt.model3 を選択 > 再生ボタンで実行 or 追加されたモデル名をダブルクリック

1. DEMを指定して実行する。DEMのサイズが大きいとかなり時間がかかります。1000x1000px以下がいいと思います。

1. 流路と流路の垂線上の標高値をサンプリングしたポイントが作られます。

### パラメータ調整のしかた

#### 流路が想定より少ない・多いとき

どれくらい上流まで流路を抽出するかを調整できます。モデルの画面の Channel network をダブルクリックし，Initiation Threshold の値を変更します。初期値は [進捗報告: Watershed Basin in SAGA GIS](http://paneer-roll.blogspot.com/2014/06/watershed-basin-in-saga-gis.html) の記事を参考に100000になっているので，桁を増減してみてください

#### 垂線の長さが足りないとき

200mにしてあるので，トランセクトのトランセクトの長さを変更してください。変更した場合は，SQLの100の値を垂線の半分の値に変更する必要があります。

### その他伝達事項

- モデルを構成する各ツールを順番に使っていくのでもOKです。

- 一気に流路と標高値ポイントを作成するのではなく，流路をまず作成 → その中から余計な流路を削除 → それをもとに標高値ポイントを作成したい場合はモデルを分けますのでご相談ください

# 5mシフトアップポイントを抽出

たくさんの標高値ポイントの中から，流路の標高＋5mの標高値を持つポイントを抽出します。QGISでは無理だったので，PostGISを使います。

## PostGIS のインストール

PostGIS は PostgreSQL というデータベース（DB）ソフトの空間拡張プラグインです。一般的にDBソフトは，サーバにインストールして，Webアプリケーションなどへデータを提供するような使い方をしますが，ローカルのPCに入れることもできます。そうすると，DBソフトならではの大容量データの処理に役立ちます。通常のDBには文字や数字を格納するところ PostGIS には地物を入れられたり，QGISの比ではない数多くの空間処理の関数を使えたりします。

私は最近は不要になったら簡単に捨てられるので Docker というソフトを使って PostGIS を動かしていますが，普通にWindowsマシンにインストールすることもできます。お好みのほうを選んでください。

### 方法1. DockerでPostGISを動かす

### Docker のインストール

#### Dockerを入れる下準備

Hyper-Vを有効にします。Windowsの設定 の [Windowsの機能の有効化または無効化] の「Hyper-V」にチェックを入れて再起動する

参考： [Docker for Windowsをインストール](https://ops.jig-saw.com/techblog/docker-for-windows-install/)

#### Dockerのインストール

[Docker Desktop for Windows - Docker Hub](https://hub.docker.com/editions/community/docker-ce-desktop-windows) からインストーラを取得してインストールする

注: PCの導入時期によって Windows Update の適用状況が異なるので，最新のバージョンは動作しないかもしれません。そのときはご相談ください

#### Docker のプロキシ設定

インストールでき，Running状態になると，タスクバーの右のほうにクジラのアイコンが現れます。それを右クリック > Setting > Proxies に会社のプロキシのIPアドレスを入れます。

![](https://i.imgur.com/1Bvv1pI.png)

会社のプロキシは，Windows の インターネットオプション > 接続 > LANの設定 と同じものを入れてください。

### Docker で PostGIS を動かす

[Docker Hub](https://hub.docker.com/) というページでは，あらかじめDockerに各種のソフトをインストールした状態をコンテナという形で配布しています。そのなかのPostGISのコンテナ [mdillon/postgis - Docker Hub](https://hub.docker.com/r/mdillon/postgis) を使います。

#### コンテナをpull（取得）

Docker をインストールするとコマンドプロンプトでDockerコマンドが使えるようになっているので，PostGISのコンテナのページにあるコマンドを実行します。
```
docker pull mdillon/postgis
```

#### PostGISのコンテナの実行
```docker run``` コマンドでコンテナを実行します。上記のpullをしていない場合は，このタイミングでpullされます。
```!
docker run --name docker-postgis -e POSTGRES_PASSWORD=postgres -p 5432:5432 -d mdillon/postgis
```
これでPostGISが動いたはずです。

### 方法2. 普通にPostGISをインストールする
[PostgreSQLのインストール - GeoDjangoではじめる地理空間情報](https://homata.gitbook.io/geodjango/qian-zhun-bei/install#postgresqlnoinsutru) の手順でできると思います。スタックビルダの設定（以下のところまで）です。
```!
正常にインストールされた場合、メニューの「PostGIS」のグループが作成されます。 PostgreSQLサーバはWindowsが起動時に自動で実行されるように設定されます。
```
バージョンの選択肢はより新しいものを選んでも大丈夫です。フリーソフト利用申請が面倒な場合は既に申請されているバージョンを選ぶといいと思います。

パスワードは```postgres```でいいと思います。

## pgAdmin のインストール

いずれかの手順でPostGISを入れられたら，PostgreSQL のクライアントツールのpgAdminを入れます。入れなくてもPostGISをコマンドで操作できますが，GUIで操作できたほうがわかりやすいと思います。

[こちら](https://www.pgadmin.org/download/pgadmin-4-windows/) より，ダウンロード，インストールしてください。一番新しいもので大丈夫です。

注: まだ最新バージョンはフリーソフト利用申請されていないと思うので，引っかかった場合はこちらで早めに申請するようにします。

## PostGIS の初期設定

pgAdmin を起動するとブラウザで操作画面が開くので初期設定をしていきます。



### サーバと接続

1. Servers > Create > Server
2. General タブ
Name:（任意）例 docker_postgis
3. Connection タブ
Host: localhost
Port: 5432
Username: postgres
Password: （設定したもの）上記の docker コマンドであれば postgres
Save password: チェック
4. Save

### データベースの作成

1. 先ほど設定したサーバの下位に Databases という項目があるので右クリック > Create > Database
2. General タブ
Name:（任意）例 tanohata
3. Save

### Extension
1. 先ほど作成したデータベース（例 tanohata）を右クリック > Create > Extension
2. Name: postgis
3. Save

## 標高値ポイントのデータをPostGISに入れる

QGISで作成した標高値ポイントのデータをPostGISに格納します。

### PostGISとQGISの接続

1. QGISのメニューのレイヤ > データソースマネージャ > PostgreSQL > 新規
2. 接続情報
名前:（例）tanohata
ホスト: localhost
ポート: 5432
データベース: 先ほど設定したDB名（例）tanohata
3. 接続テスト をクリック
ユーザー名: postgres
パスワード: 設定したもの（例）postgres
4. OK > 閉じる

### 標高値ポイントをPostGISに入れる

1. QGISのブラウザパネルのPostGISの下に接続したDB（tanohata）があると思うので，さらに展開し，public を表示させる
1. レイヤパネルの標高値のポイント（モデルの出力結果のままであれば dempt）をドラッグして public に入れる（こちらではエラーという表示も出ましたがたぶん大丈夫）

### pgAdmin で確認

DB名（tanohata）> Schemas > public > Tables を確認する（なかったら Tables を右クリック > Refresh をしてみる）

## PostGIS で5mシフトアップのポイントを抽出

PostgreSQL はDBなのでSQLで操作をします。

1. pgAdmin の Tools > Query Tool
1. 以下をコピペ（もとにする標高値ポイントが dempt じゃないときは書き換えてください，5m以外でやるときは4行目を変更してください）
```sql!
DROP TABLE IF EXISTS shift5m;
create table shift5m as
SELECT a.rvalue_1, a."TR_ID",
abs(a.rvalue_1 - (b.rvalue_1 + 5)) as gapshift,
CASE
when distance < 100 then 0
when distance > 100 then 2
else 1
end as bank,
a.geom
FROM dempt as a left join
(
SELECT rvalue_1, "TR_ID"
FROM dempt
where distance = 100
) as b
on a."TR_ID" = b."TR_ID";

DROP TABLE IF EXISTS shift5mrank;
create table shift5mrank as
select *,
row_number() over(partition by "TR_ID", bank order by gapshift asc) as rank
from shift5m;
 
DROP TABLE IF EXISTS shift5mpick2pt;
create table shift5mpick2pt as
select * from shift5mrank
where rank = 1
and bank in (0,2);
```
3. ⚡マークをクリックして実行

そうすると，shift5mpick2pt というテーブルができます。

### 簡単な解説
SQLの一つ目のまとまりでは，「流路の標高値＋5mの値」と「各ポイントの標高値」の差の絶対値を求めています。同時に左岸/右岸のラベルを付けています。

二つ目では，差の絶対値が小さい順にランクを付けています。

三つ目では，各岸でランクが1のものをピックアップしています。

# QGIS でシフトアップポイントを面にする

## PostGISでの結果を QGIS に読み込む

1. QGIS に戻り，ブラウザパネルのPostGISのDB名（tanohata）を右クリック > 再読み込み すると，作成されたレイヤを確認できます（中間データもあります）
1. その中の shift5mpick2pt をダブルクリックやドラッグでQGISに読み込みます。
2. このポイントをPostGIS外で保存しておきたい場合は，レイヤパネルでshift5mpick2ptを右クリック > エクスポート > 地物の保存 で任意の形式（ESRI Shapefile や GeoPackage）にして，ファイル名の横の[...]から出力先のフォルダとファイル名を指定して保存します。

抽出されたポイントが200mの端のポイントの場合は垂線の長くしたほうがいいです。

## 結果のポイントを面にする

### 凹包ツールでポイントを面にする

1. QGISのプロセッシングツール > ベクタジオメトリ > 凹包（k近傍法）
入力レイヤ: shift5mpick2pt
隣接点の数: 3（最小）
1. 実行 > 閉じる

### 別の案

ここまで割と細かなデータを扱ってきたのにもかかわらず，凹包ツールはアバウトな結果を返します。それが気になる場合は，
1. プロセッシングツール > ベクタ作成 > 点をつないで線に
入力レイヤ: shift5mpick2pt
つなぐ順序のフィールド: TR_ID
グループを示すフィールド: bank
2. プロセッシングツール > ベクタジオメトリ > 線をセグメントに分解
3. 編集モードで始点や終点から遠くにつながる余分なラインを除去
4. プロセッシングツール > ベクタジオメトリ > 線をポリゴンに変換

という案もあります。こちらを使う場合には，各点がそのまま使われるので，河川構造物の影響で極端に流路に近い点や別の流路のポイントを編集モードで除去する必要があるかと思います。もし，こちらの方法を使う場合はまだ改善の余地があると思うのでご相談ください。

