東アフリカの水道ベクトルタイルについて

## 開発のきっかけ

[FOSS4G Hokkaido](https://foss4g.hokkaido.jp)や[FOSS4G Korea](https://foss4g.osgeo.kr/en.html)で発表をしたのでご存知の方もいるかと思いますが、私が東アフリカの水道局と行っているベクトルタイルのOSS活動について日本語でちゃんと説明したこともなかったので、ご紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858331/9d6dc5ad-dc4e-c43d-817b-a7c80b27baeb.png)


私は、2014年から現在まで東アフリカのケニアとルワンダの水道局とGISのお仕事をしてきました。最初は青年海外協力隊でケニアのナロック水道で活動し、その後はJICA専門家として2019年末までルワンダで主に地方給水メインで活動してきました。東アフリカの水道局は往々にして非常に小さな組織が多く、GIS活動のための予算が潤沢にあるとは言えません。せっかく苦労してGISデータを収集しても、それを共有・普及させるための設備投資ができず、結局データが使われないまま数年が経過し、またデータ収集を一からやり直すということが頻繁に起きています。

私はGISデータを水道局内外で広く共有する仕組みがあり、データの利用者が増えて、それがある意味でインフラ的な意味合いを持つようになれば、GISデータの継続的な更新が止まることはなくなるはずという仮説を立てて、彼らと活動を続けています。

今年に入り、本業の方でベクトルタイル配信に深く関わり、自分が求めていた答えを見つけた気がしました。今年3月頃からケニアのナロック水道局とベクトルタイルの開発をはじめ、6月には完全に無償でベクトルタイルを配信運用し、データの更新も完全に自動化するところまで漕ぎ着けました。7月には同様のアプローチをルワンダの水道公社にも展開し運用を開始しました。

## コンセプト

このOSS活動は水道局をはじめいかなる組織でも手軽に使えるように、以下の3つを目的としています。

- 低コスト（できれば無償）で自社で保有しているGISデータを配信して広く共有できる
- 完全に自動化し、データ配信や、配信データの更新などにかかる手間をかけないようにする（データのメンテナンスのみに集中できる）
- 基本的に成果は全てオープンソースにし、ケニアとルワンダ以外でも適用可能なツールにする

注意点として、ここでご紹介する方法はあくまでも小規模なGISデータの配信に限定した話で、非常に大規模なデータ配信を行う場合にはそれなりにコストがかかる点ご留意いただければと思います。ただし、水道局レベルの組織のGISについてはほぼ無償で運用できると考えています。

そして、これは水道業務に限った話ですが、日本を始め水道局でのGISの利用はまだ途上であり、GISxオープンソースを通して、水道局の業務をいかに改善できるか、この活動の中でケニアとルワンダの水道局と先進的に試行錯誤して開発を進めています。

## 現在ベクトルタイルを運用している水道システム

現在運営している水道システムのマップは[こちら](https://watergis.github.io/water-map)からご覧いただけます。ズームして後にクリックして出てくるポップアップのURLからより詳細な地図に飛べます。

- 現在ルワンダ全国でベクトルタイルを運用している1100以上のWASACの地方給水システム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858331/a5e4094f-9ab3-9955-65fd-9ff57b85fe39.png)

- 現在ケニアで３水道局（ナロック、ナクル、ナニュキ）で運営している６つの都市給水システム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858331/8f10b4a3-5217-fee9-063a-9389ee0ed05f.png)

## ドキュメンテーション
ケニアとルワンダの水道局と一緒に開発した一連の仕組みとソフトウェアをオープンソースとして公開し、ドキュメント([GIS for Water](https://docs.water-gis.com))を整備しています。水道以外の分野でも活用していけると考えており、ご紹介したいと思います。また世界中の水道局や、GISデータを保有している組織に手軽に活用してほしいと考えているため、英語と日本語でドキュメントを整備しています。

## ベクトルタイル配信と自動更新の仕組み

簡単にベクトルタイル配信と自動更新の仕組みについてご紹介します。まず以下のシステム概要図をご覧ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858331/7333c784-0eab-330f-ec50-99bfb3a8bf56.png)

この仕組みは主に２つに分かれています

- ローカルマシン: PostGISデータベースを構築し、タイル生成とGithubへのアップロードを行う
- Github pages: アップロードされたデータをGithub pagesに自動デプロイする他、ベクトルタイル配信に必要なその他機能（スプライトファイル、スタイルファイル、Mapbox GL JSアプリ）も全て管理する

前提条件として、PostGISを導入していることが大前提となりますが、基本的にはGithubで公開している[watergis/vt-boilerplate](https://github.com/watergis/vt-boilerplate)のテンプレートをベースに作業をしていくことになります。具体的な作業の流れは以下のようになります。

1. 設定ファイルで各レイヤごとにPostGISから取得するSQLを作成
1. `vt`ツールでmbtilesを作成（内部でtippecanoeなど使っていますがdocker-composeで実行可能）
1. mapbox studioやmaptilerにmbtilesをアップロード
1. style.jsonを作成する（背景にはサードパーティの地図を使い、そこに独自データを重ねる）
1. 独自のアイコンがある場合はMapboxやMaptilerのスタイルで使うアイコンをダウンロードして独自のアイコンと合わせて[sprite-creator](https://github.com/watergis/sprite-creator)モジュールを使って、専用のスプライトファイルを作成する
1. 2から5の作業を繰り返してベクトルタイルとスタイルファイルを完成させる
1. vtリポジトリでmbtiles生成後にGithubに定期的にプッシュするようにタスクスケジューラを組む。Github Actionでmbtilesを展開し、Github pagesにデプロイするようにもする
1. 作成したスタイルファイルとスプライトファイルを別のリポジトリで作成し、Github pagesにデプロイする。その際タイルセットのURLはvtリポジトリのものに設定する
1. 最後に、Mapbox GL JS v1を使用してアプリを作成する。Mapbox GL JS v1を簡単に導入できるように[ボイラープレート](https://github.com/watergis/mapboxgljs-boilerplate)を用意しています。

なお、このツールはフォントファイルの生成はサポートしていません。基本的には背景に使うサードパーティ製の地図が使用するフォントファイルを流用するというスタンスを取っているためです。

## このツールのメリット

PostGISからSQLでデータを作るようにしているので、どんなデータでもDBにさえ入れてしまえば如何様にも料理できる。PostGISの空間演算を使用してかなり複雑な空間処理を施してタイルを作ることも可能。

Github pagesに最終的にデプロイするので小規模な利用なら完全に無償で運用可能。

## このツールの利用に向かないケース

- 大規模なGISデータを保有しており、ベクトルタイルを運用したい場合

そもそもGithub pagesの最大容量が1GBなので生成後のタイルサイズがそれを超える場合は運用できない。また非常に大きなデータの場合PostGISからSQLでGeoJSONを作る際に落ちてしまう可能性があるため、別の方法を考える必要がある。

参考までに、ルワンダ全国のParcels（筆ポリゴン）データをアプリに組み込むために1.3GBくらいあるタイルデータをNetlifyで公開運用できているという例があります。また筆ポリゴンデータがGeoJSONとして取り出してTippecanoeに渡すことができずに、1タイルごと生成してmbtilesに入れるという生成方法([watergis/mvt-generator](https://github.com/watergis/mvt-generator))をとっています。

- クローズドなタイル運用をしたいケース

Github pagesを使った運用は自ずとオープンデータになってしまうので、クローズドな運用をしたい場合はこの方法は使えません。

- 大量のユーザーを抱えるケース

この方法はMapboxやMaptilerなどのサードパーティの地図の上に自組織のデータを手軽に重ねて運用しています。したがって、大量のアクセスがあるウェブアプリなどの場合、MapboxやMaptilerの無料利用枠を大きく超えてしまい、利用料金がかかってしまう可能性があります。

## 今後について

現在はケニアのナロックとルワンダのWASACにおいて定期的に更新を行い、タイル運用をしています。ケニアのナクルとナニュキについては完全自動化まではできていませんので、いずれ実施できるようにしたい。またケニアとルワンダ以外の水道局にも展開していけたらとも思っています。

### 追加していきたい機能について

ケニアとルワンダでデータ整備をしたのを第一フェーズ、ベクトルタイル化したのを第二フェーズとすると、次の第三フェーズでは水道業務を支援するための様々な機能を開発していきたいと考えています。具体的には、

- Terrain RGBを使用した標高サービス。水道の設計・運用では標高は非常に重要な要素となるので何らかの標高サービスを追加したい
- アプリ自体に管網解析ソフトのEPANETのシミュレーション結果などを連携できるような機能を作りたい

また、先日Mapbox GL JSがv2になりプロプライエタリソフトになった点を考慮し、今後v1を引き継ぐライブラリが明確になった段階で、Mapbox GL JS v1からの移行も考えるとともに、現在Mapboxの背景を使っているところもMaptilerなど他サービスを検討するなどしていかないといけないかと考えています。

### このオープンソースプロジェクトへのコントリビューション

様々なベクトルタイルや水道関係のオープンソースプロジェクトを[GIS for Water](https://github.com/watergis)内においています。関連ドキュメントも[こちら](https://docs.water-gis.com/ja/)のサイトでまとめています。ソースコードやドキュメントに対するIssueやプルリクエストはいつでも歓迎いたします。また[Githubスポンサー](https://github.com/sponsors/JinIgarashi)を通して、FOSS4Gでアフリカの水道局を支援するサポートを頂けるととてもありがたいです。

## 謝辞

まず、GISデータの収集やメンテナンスをしてくれているケニアの水道局と、ルワンダの水道公社には改めて感謝しています。彼らのデータがあってこその活動なので本当にありがたいです。

また、このオープンソース活動をするにあたって、[国連ベクトルタイルツールキット](https://github.com/unvt)の[hfu](https://github.com/hfu)さんからの助言をいただき運用まで漕ぎ着けることができました。ケニアとルワンダ向けに背景として使えるOSMベースのベクトルタイルも提供していただきました。大変感謝しております。今後も国連ベクトルタイルツールキットにも可能な限りコミットメントしていきたいと考えています。