【新人🐣開発】東京都内で30以上ある避難所オープンデータを全てまとめて可視化👀

# 記事について

こんにちは！

この記事では[前回](https://qiita.com/To-Ki-O/items/8760d2eb9f1b50a846ea)、学習した技術を使って、
**オープンデータの可視化をするための開発**について書いています！

↓今回作成したもの(**東京の避難所データを統合し、マップ上に可視化**)
<img width="600" alt="result.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730983/915a9c86-bca7-88cf-4cbb-74c54dcf929f.png">
※GitHubのリポジトリは[こちら](https://github.com/To-Ki-O/fiware-tokyo-opendata-integration)に公開しています。

↓今回作成したものの構成イメージ
![アーキテクチャ図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730983/dd8b0e6f-4b93-63ff-a791-af4ff8a962f4.png)


## 前回までのあらすじ

4月に入社後の新卒研修ではJavaやSQLなどの基本的(?)な内容を学習しました。
研修内容を復習し、いざ本配属！

そんな私に出された課題は「FIWAREでオープンデータを可視化する」というものでした...
次々に出てくる謎の単語達に若干のめまいすら覚えながら、必死にメモを取っていました:sweat_smile:
与えられた期間は１か月間...

**「やるしかない」**

そう考えた私は謎の単語達を学習し、開発を始めるのでした...

## 開発の軌跡

### 活用した技術

* FIWARE
* Deno
* Typescript
* Docker
* dim
* Git, GitHub

### 利用したサイト

* オープンデータ検索サイト
    * [データカタログ横断検索サイト](https://search.ckan.jp/)

* WireCloudのウィジェットまとめサイト
    * [WireCloud Appendix:Widgets](https://wirecloud.readthedocs.io/en/stable/widgets/)

* Typescriptを書く際のベストプラクティスをまとめたサイト
    * [TypeScript Deep Dive](https://typescript-jp.gitbook.io/deep-dive/)

### 何を開発するかの企画・検討

このフェーズが最も大変でした:sob:

実際に手を動かした内容としては以下の2つです。

1. どのようなデータが公開されているか調べる

    * 「東京　オープンデータ」などのワードでひたすら検索してデータを探しました。

        * [データカタログ横断検索サイト](https://search.ckan.jp/)という便利なサイトを発見しました！


2. オープンデータの利用事例を調べる

    * 「オープンデータ活用事例」などのワードで検索をしました！
    
        * デジタル庁が活用事例をまとめていた[オープンデータ100](https://www.digital.go.jp/resources/data_case_study/)を発見しました！

その後、何度も何度も先輩とディスカッションを重ね、開発するものを決定しました！

**東京避難所データの統合と可視化**

* これを進めることによって...

    * バラバラになっている避難所データを統合することが出来る
        * 複数のデータセットではなく、1つのデータセットとして扱える
        * 複数に散らばったデータ内容を1つにまとめられる
            * 都全体データと市区町村データの両方に存在するデータを統合
    
    * 形式や内容を統一出来るため、扱いやすくなる

といったメリットが生まれてくると考えています！

作るものが決まったので、開発を進めていきましょう！:thumbsup:

### データの取得

兎にも角にもデータが無ければ進めることは出来ません！

このデータ取得で非常にお世話になったのは<INS>**dim**</INS>です！

dimとは？

* コマンド上で**データ検索とダウンロード**を行える
* データの**取得元**と**データに対する処理を管理**してくれる
* dim.jsonファイルを共有することで**一括で全データを取得**できる
* 私が配属されたチームで開発をしています！

という便利なツールです！

今回は個人での開発ですが、データ取得するタイミングが複数回あり、非常に助かりました！

以下に[Qiita記事](https://qiita.com/ryo-ma/items/0505f7790ad2b12bcdc2)と[GitHunbのリポジトリ](https://github.com/c-3lab/dim)へのリンクを掲載しておきます。
興味のある方はぜひ、**issueを上げたり**、**Developerとして参加したり**して頂けると嬉しいです！

そんなdimを使って取得したオープンデータは全部で32！:open_mouth:

この数字は東京都の避難所について検索をした結果出てきたもの全てです。

この中には使わないデータもありましたので、実際は全部は加工しませんでしたが...
使用しなかったデータがあった理由としては以下の通りです。

* 完全に重複していたデータ(7個)
* 明らかに形式のおかしなデータ, 表になっていないデータ(2個)
    * 一つのシートに複数のテーブルがあるという...:sweat:
* 経度や緯度以外の座標系が用いられていたデータ(2個)
    * 国土地理院の計算ソフトで変換してみましたが、別の座標を指してしまいました...

そのため、実際に加工したデータは全部で21個です！

## dimに関するお知らせ

Code for Japan主催イベント「[Social Hack Day](https://shd-nhkhackathon.peatix.com/)」に<INS>**dimの開発プロジェクトを持ち込み参加します！**</INS>

https://shd-nhkhackathon.peatix.com/

日時：2022年10月22日(土) 11〜18時
(初参加の方は10:45からガイダンス / zoomは10:40より接続開始)
会場：Zoomでのオンライン開催

興味を持っていただけた方は是非！ご参加ください！
内容については以下のYouTube動画の48:15からお伝えしています。

[Code for Japan Summit](https://www.youtube.com/watch?v=P7N--4AolSM)に弊社が参加しました！

https://www.youtube.com/watch?v=P7N--4AolSM

### データの加工

Typescriptを用いたプログラムで加工を行いました！
作成した tsファイルはDeno環境下で実行しています！

tsファイルは全部で5つあり、以下の通りです。
* open_data_accessor.ts
* integration.ts
* entity.ts
* orion_client.ts
* main.ts

コードを書くと物凄く長くなるため、それぞれのコードへのリンクを張っています。
コード内にコメントを残しておりますので、ご覧ください。

#### open_data_accessor.ts

OpenDataAccessorクラスを定義しています。
CSVファイルのパスとカラムの名前(配列)を渡すことで、CSV形式のデータをレコード型に変換してくれます。

[コードはこちら！](https://github.com/To-Ki-O/fiware-tokyo-opendata-integration/blob/main/open_data_accessor.ts)

#### integration.ts

ShelterIntegratedクラスを定義しています。
引数であるレコード型配列内の新規データを識別し、統合してくれます！

[コードはこちら！](https://github.com/To-Ki-O/fiware-tokyo-opendata-integration/blob/main/integration.ts)

#### entity.ts

ShelterEntityクラスを定義しています。
引数として統合された配列を受け取り、NGSIv2形式に変換してくれます！

[コードはこちら！](https://github.com/To-Ki-O/fiware-tokyo-opendata-integration/blob/main/entity.ts)

convertToDisasterNameメソッドでは、
|洪水|地震|火災|...|
|---|---|---|---|
|1|0|1|...|

といった表を [洪水, 火災] というstring配列に変更しています。

#### orion_client.ts

OrionClientクラスを定義しています。
NGSIv2形式に変換されたデータ配列をFIWARE OrionへPOSTしてくれます！

[コードはこちら！](https://github.com/To-Ki-O/fiware-tokyo-opendata-integration/blob/main/orion_client.ts)

#### main.ts

紹介した4つを順次適用していきます。

[コードはこちら！](https://github.com/To-Ki-O/fiware-tokyo-opendata-integration/blob/main/main.ts)

材料が揃いましたので、データの可視化をしていきましょう！

※ここからは GitHub Codespaces を使って行いました

### Denoのインストール

- ターミナルを開き、以下のコードを打ち込みます。  
``` 
curl -fsSL https://deno.land/x/install/install.sh | sh
```  
※ ローカル環境にCloneして、実施する場合は環境に合わせて[こちら](https://yoshixmk.github.io/deno-manual-ja/getting_started/installation.html)からインストールしてください。

- インストール完了後に表示される以下のコードを打ち込みます。  
``` 
export DENO_INSTALL="/home/codespace/.deno" 
export PATH="$DENO_INSTALL/bin:$PATH"
```  

  Denoのインストールは完了です！

### dimのインストール

- 以下のコードを打ち込みます。  
```
 curl -L https://github.com/c-3lab/dim/releases/latest/download/x86_64-unknown-linux-gnu-dim -o ./dim 
```  
※ ローカル環境にCloneして、インストールする場合は[こちら](https://github.com/c-3lab/dim)を参考に進めてください。  

- インストールが完了したら、以下のコードで権限設定を行います。  
```
 chmod u+x ./dim 
```

  dimのインストールは完了です。

### dimを利用してオープンデータを”一括で”ダウンロード

- 以下のコマンドを打ち込みます。  
``` 
dim install -F
 ```

  このコマンドを打つだけで、
  dim.jsonファイルに登録されているデータが**すぐにダウンロード出来ます**！

### コンテナを起動(Docker)

ymlファイルとして
以下のサイトを参考にしました！

https://github.com/lets-fiware/lets-fiware.tutorials/tree/master/wirecloud

ご自身の環境に合わせてフォルダ直下に```docker-compose.yml```として保存してください！

- 以下のコードを打ち込みます。  
```
 docker compose up -d 
```

- コンテナが正常に立ち上がっているか確認してみましょう。  
```
 docker compose ps 
```  
  ※ 起動していないコンテナがあれば
```
 docker compose start 
```
と打ち込んでコンテナを起動します。

  全てのコンテナが起動していれば完了です。

### Wirecloudのスーパーユーザー登録

- 以下のコードを打ち込みます。  
```
 docker compose exec wirecloud python manage.py createsuperuser 
```

- ユーザー名、メールアドレス、パスワードを登録します。  
  この後、ユーザー名、パスワードは使用しますので、メモしておいてください。

### Typescriptの実行

```
deno run --allow-read --allow-net main.ts
```
を実行し、オープンデータの加工から投入までをしてしまいます！

### Wirecloudでの可視化

#### サインイン

``` http://localhost:80 ```にアクセスし、Wirecloudに接続します

右上のサインインボタンからサインインします
※先ほどメモをしたユーザ名とパスワードをここで使用します。

#### ウィジェットのインストール

以下のサイトからウィジェットを自身のPCにダウンロードします。

[地図ウィジェット](https://github.com/Wirecloud/ol3-map-widget/releases)
```CoNWeT_ol3-map_1.2.3.wgt```をダウンロードする。

[NGSIデータ取得ウィジェット](https://github.com/wirecloud-fiware/ngsi-source-operator/releases)
```CoNWeT_ngsi-source_4.2.0.wgt```をダウンロードする。

[地図ウィジェットにNGSIデータを入れるウィジェット](https://github.com/wirecloud-fiware/ngsi-entity2poi-operator/releases)
```CoNWeT_ngsientity2poi_3.2.2.wgt```をダウンロードする。

Wirecloudの画面に戻りまして...

画像の右から2番目の「マイ・リソース」をクリックする。
![MenuBar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730983/837416ae-729e-a4a4-411a-a2a05b109169.png)

左の「アップロード」をクリックする。
![MenuBar2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730983/d67c8f24-8b56-af48-13e0-8c8a5859b7df.png)
先ほどダウンロードした3つのウィジェットをアップロードする。

#### ワークスペースの作成

1つ前のページに戻り、ハンバーガーボタンから「新しいワークスペース」を選択する。
![NewWorkSpace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730983/2d5aa472-2443-bd06-e326-f9ddcdc5dea0.png)
好きな名前でワークスペースを作成してください。

#### 各ウィジェットの配置・設定

左から2つ目の「コンポーネントを追加」を選択する。
![MenuBar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730983/57caf746-c3de-0e3e-0c13-878cfc36e7f5.png)

左側に出てきた「OpenLayersMap」を+ボタンから追加する。
![Component.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730983/1015ae50-b8a7-58a1-fcf5-7c063f7b6534.png)

真ん中の「ワイヤーリング」を選択する。
![MenuBar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730983/57caf746-c3de-0e3e-0c13-878cfc36e7f5.png)

ハンバーガーボタンの右にある「コンポーネントの検索」を選択する。
オペレーターから「NGSI source」,「NGSI Entity To PoI」
ウィジェットをから「OpenLayers Map」を追加し、画像のようにつなぐ。
![operator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730983/111eb9d2-7b2f-d4fe-524b-a15f8324af57.png)

NGSI sourceの設定を画像のように設定する
<img width="350" alt="setting.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730983/fe78b172-6d1a-946e-6a9f-d5572d713fe0.png">

1つ戻って地図を確認すると...

<img width="600" alt="result.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730983/915a9c86-bca7-88cf-4cbb-74c54dcf929f.png">

避難所の位置がマッピングされています！

### まとめ

今回の開発を通じて、感じたことは
    
1. 自治体ごとに**公開されているデータが多かったり、少なかったりする**
   → 横展開がしずらくなっているのでは:thinking:
    
2. 公開されているデータの**形式や内容が統一されていない**
    → データを利用する際に加工する必要がある
    
3. 自治体によって**公開している場所がバラバラ**
    → 市区町村HPだったり、県や都のHPだったり、カタログサイトだったり...

4. 多く公開されている場所でも**データの種類が少ない**
    → やりたいことベースで考えると出来ない可能性がある

5. データや事例の**更新をあまり感じない**
    → データが更新されていない
    → サイトのレイアウトや事例紹介に古さを感じる:sweat_smile:

6. データの加工が面倒
    → 同じ種類のデータでも自治体によって中身が違うので加工方法も変える必要がある

という点が開発する上でネックになっていそうだと感じました。

こうした課題があるということを今後の業務に活かしていきたいと考えています！

最後まで読んでいただき、ありがとうございました。
皆様の何かしらのお役に立てれば嬉しいです！:blush: