QGISで河川の上流からラベル番号をつける

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/2e6e63c4-3d05-e182-74ca-0492ceacf135.png)


## はじめに

業界にほほえみを振りまく記事が集う[MIERUNE Advent Calendar 2020](https://qiita.com/advent-calendar/2020/mierune) 19日目の記事です。

先日社内で話題にのぼったときに昔よくやってたニッチな手法を思いだしたので、メモとしてインターネッツに放流しておきます、どのくらいニッチかというと華麗な[アンコウのつるし切り](https://www.oarai-info.jp/page/page000031.html)のやり方マニュアルくらいニッチです。

河川の図はお決まりがそこそこあります。その中でけっこう厄介だったのが ***上流（または下流）から各ポリゴンのラベルが順番についていないといけないというルールです*** 。根性と残業を投資して属性入力でポチポチやっている方がいるかもしれないので、さっさと作って家に帰りましょう。Pythonなどでもさっくり華麗にできそうですが、とりあえずQGISのGUIベースでやってみますね。

## こんな方に
この記事は

- QGIS歴2ヶ月くらいで一級河川案件の図面担当になってしまった。
- 道路や水道管のデータの方向に沿ったポリゴンにNoをラベリングをしたい。
- ポリゴン数百個に一生懸命手でNoを入力していたら「あ、ごめん追加」といわれて7個ほどポリゴンが書き足されてしまい、ナンバリングがやり直しになった（なお締切は明日）。

…というかた向けに書いています。

## 大まかな手順


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/71100bfc-8fde-7efc-6df3-079ece01624a.png)

## 処理

サンプルデータは[こちら](https://drive.google.com/file/d/1XpK0LjAqQRzNn1Vnek_syV-mdVri0XOQ/view?usp=sharing)にあります。データは[OpenStreetMap](https://www.openstreetmap.org/)より多摩川周辺のデータをいただきました、いつもありがとうございます。
※Data by [OpenStreetMap contributors](https://www.openstreetmap.org/copyright/ja), under ODbL

### 中心線を引く
QGISを立ち上げて、対象ポリゴンを開いたのち、これらの並びを決めるための中心線をラインデータで書きます、大雑把でも方向とカーブが大まかに合わせてあればよいです。
河川の場合は中心を示す流心線、道路の場合も道路中心線を[QuickOSMプラグイン](https://www.google.com/search?q=QuickOSM&oq=QuickOSM&aqs=chrome..69i57.2439j0j1&sourceid=chrome&ie=UTF-8)などを用いてOpenStreetMapから持ってきてもOKです（線分が切れている場合があるので、その際はつなげてくださいね）。`waterway=stream` をもらってきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/74a2cbc6-ec93-1cb1-db89-68d7ea080db0.png)

### 等間隔ポイントを作成
では、中心線からQGISで等間隔ポイントを発生します。プロセッシングツールボックスの検索窓に`point`と入力すると`ジオメトリに沿った点群`という機能がでてきますので、起動します。
この機能は、読んで字のごとく入力レイヤに対して等間隔ポイントを生成してくれます。ラベルを付けたいポリゴンの分布具合にもよりますが、今回は50ｍ間隔で生成してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/239042b4-73bb-cc61-5a8d-460c81604211.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/0630be58-184c-7e68-eec3-7f9bdfd916c3.png)

ちゃんとラインの上に等間隔でポイントが出ていますね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/be9d3b44-03be-a574-f6ad-6787204910cc.png)

実行後生成されるポイントデータ(point)には始点からの距離が`distance`フィールドに入っています。これをポリゴンの並び順の参照にします。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/359f43b9-1c63-05e3-02e5-6cfffdf4c9e4.png)

### ポリゴンと空間結合
では最も近いポイントをポリゴンと空間結合します。先程と同様にプロセッシングツールボックスの検索窓に`near`と入力すると`属性の最近傍結合`という機能がでてきますので、起動します。この機能は、Aというレイヤに対し、もっとも近いBレイヤのフィーチャーの属性を取り込んでくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/7241115e-92c4-9346-de7e-0dea1fe75ca1.png)

起動後、入力レイヤ(くっつけたいデータ)にポリゴン…今回はparkを、第二の入力レイヤ(属性を持ってきたいデータ)に、さっき作成したpointのデータを指定して実行を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/cdf9470f-3c60-6dd4-e30f-190d29750988.png)

そうすると、各ポリゴンに最も近いポイントの属性が結合されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/f0ca72d7-86be-5103-9c69-c6f4afcaa9c1.png)

### 並び替え＆ラベル付け

このあとは、河川の`distance`フィールドを並び替えて、その順番にラベルの属性を入れれば終わりです。

同様にプロセッシングツールボックスの検索窓に`order`と入力すると`式による並び替え`という機能がでてきますので、起動…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/c15e9d10-499a-77e9-7ba2-4817c1b38d46.png)

とおもったのですが、2020/12現在この機能にはバグがあり、並び替えがちゃんと機能しづらいようで、[GitHubでも報告もされています。](https://github.com/qgis/QGIS/issues/29794)そのうちなおるものと信じて、Sort and Numberプラグインで解決しましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/df20ecdc-423c-8ed8-ffcd-fd42b30de256.png)

Sort and Numberプラグインをインストール＆起動後、さっき最近傍結合処理を行った結果のデータ(ここでは`最近傍結合`データ)を指定し、並び替えのフィールドに`distance` を指定し、New field nameに新規で作成される最終的な結果の`label_no`を入力し、OKを押します（基本昇順ですが、降順にしたい場合は`invert`にチェックを入れましょう）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/ce888f24-520d-291c-2c84-1b7ad63f3322.png)

これで中心線の始点から順にラベルIDが付与されています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/3f76e511-369d-a982-5bc2-1e9742cae7d7.png)


あとはよしなにラベルを付けると、ヘッダ画像のような並びで表示ができますね。これで1000個でも10000個でも流れに沿ったラベルがつけれます。なお、中心線との関係上多少前後することはありますので、その際はPOINTの配置を調整するか、右岸左岸などで別のラインを作るなどすればできるかと思います。

## さいごに
並び替え機能の不具合さえがなければプロセッシングでモデラーを作って華麗に公開！とかしたかったんですけど、まあ今度時間ができたら考えますね。