ダム便覧のデータを使ってダムオタクになってみた

この記事は[国交DPFアドベントカレンダー2023](https://qiita.com/advent-calendar/2023/mlit-dpf)に参加しています。本日は24日目です。
残すところあと2日(´;ω;｀)

さて、、、
 ##### みなさんはサンタさんになにをお願いしましたか？？
私はダムカードをお願いしました。ダムカードって知ってますか？？

## ダムカードってなに？
国交省が管理するダムではそれぞれのダムごとに「ダムカード」というトレカみたいなカードを作成して、ダムを訪問した人に対してダムカードを配布しているんです！<br>そして、全国各地のダムを訪れてダムカードを収集するのが流行っているらしいです。
ダムカードにはダムの**形式**や**貯水容量**、**建設時に使われた技術**などのちょっとマニアックな情報も載っているそうです。<br>
著作権の関係上、実際の写真は載せられないのでどんなものか気になる人は[こちら](https://www.mlit.go.jp/river/kankyo/campaign/shunnkan/damcard.html)！

## ダムの形式って？
先ほど、ダムカードにはダムの形式についての情報が載っていると書きました。
そうなんです。ダムは13個もの違う形式があるんです！
それがこちら。

| ダム名称 | 略字 | 説明 |
| :- | :- | - |
| アーチダム | A | アーチの形状をしたダム。<br>アーチの形状によって、水の圧力を分散させて支えている。そのため水圧が大きい場所や、地盤が軟弱な場所に建設。 |
| バットレスダム | Ｂ | アーチダムの一種。<br>アーチの両端にバットレスと呼ばれる支柱を設置したダム。バットレスによって、アーチの構造を補強し、耐久性を高めることができる。 |
| 台形ＣＳＧダム | ＣＳＧ | コンクリートブロックを積み上げて作られたダム。<br>コンクリートブロックを組み立てるだけでダムを建設できるため、工期が短く、コストを抑えることが可能。 |
| アースダム | E | 土や砂などの材料を盛って作られたダム。<br>材料の重さや密度を利用して、水の重さを支える。主に洪水調節や灌漑などの目的で建設。 |
| 重力式コンクリートダム | Ｇ | 最も一般的なコンクリートダムの形式。<br>コンクリートの重さで水の重さを支え、水力発電、洪水調節、灌漑などの目的で建設。 |
| 重力式アーチダム | ＧＡ | アーチ式コンクリートダムと重力式コンクリートダムの両方の特徴を持つダム。<br>アーチの形状によって水圧を分散させ、コンクリートの重さによって水圧を支える。 |
| 重力式コンクリート・フィル複合ダム | ＧＦ | 重力式コンクリートダムとフィルダムの両方の構造を持つダム。<br>重力式コンクリートダムで水圧を支え、フィルダムで貯水池の底面を補強。 |
| 中空重力式コンクリートダム | ＨＧ | 重力式コンクリートダムの中を空洞にしたダム。<br>コンクリートの量を減らすことで、コストを抑えることが可能。 |
| マルティプルアーチダム | ＭＡ | 複数のアーチを組み合わせて作られたダム。<br>アーチの形状によって水圧を分散させ、耐久性を高めることが可能。 |
| ロックフィルダム | R | 岩や砂利などの材料を積み上げて作られたダム。<br>材料の重さや密度を利用して、水の重さを支えている。主に洪水調節や灌漑などの目的で建設。 |
| 堰 | ＦＧ | 川の流れをせき止めたり、水位を調節したりするための構造物。<br>ダムと比べると比較的小規模なものが多く、農業用水の取水や、河川の流量調節などに利用。 |
| アスファルトフェイシングフィルダム | ＦＡ | フィルダムの表面にアスファルトを舗装したダム。<br>アスファルトによって、水の浸透を防ぎ、貯水池の底面を保護することが可能。 |
| アスファルトコアフィルダム | ＦＣ | フィルダムの中央部にアスファルトを充填したダム。<br>アスファルトによって、フィルダムの強度を高め、耐久性を向上させることが可能。 |


なんかたくさんありますよね、２列目の「略字」は国交DPFに掲載されている「ダム便覧」上でダムの形式を識別するためのものです。
さて、ダムカードにもこれらの形式が記載されるのですが、
 ### 折角ならいろんな形式のダムカードを集めたくないですか？？

 と、いうことで本日はダム便覧のデータをGIS上に可視化し、**どこに**・**どの形式の**ダムがあるかを調べてみました！

 ## 下準備
 先ほど少しフライングしてしまったのですが、国交DPFには日本全国のダムのデータが掲載されています。それがこちら[**ダム便覧**](http://damnet.or.jp/Dambinran/binran/Others/Setumei.html)!
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629590/5bfe9dc7-f4a1-645c-a11d-6c83d0e629f1.png)

まずはこちらのデータを国交DPFの利用者向けAPIを使用して取得してみます。

これまでの記事でAPIについて説明してきたので細かい順序は省きます。。
まずはダム便覧のデータIDを調べます。
```
query {
  dataCatalog(IDs: null) {
    id
    title
  }
} 
```
すると、国交DPFの掲載データのデータセットっとIDの一覧が表示され、ダムのデータIDは
```
 {
        "id": "dhb",
        "title": "ダム便覧"
      }
  ```
とわかります。
では、ダム便覧のすべてのデータ属性一覧を取得しましょう。
 ```
query {
  search(
    term: "",
    phraseMatch: true,
    first: 0,
    size: 3000,
    attributeFilter: {
      AND:[
        {
          attributeName: "DPF:dataset_id",
          is: "dhb"
        }
      ]
    }
  ) {
    totalNumber
    searchResults {
      title
      lat
      lon
      metadata
    }
  }
}
 ```
jsonファイルの出力がちょっとうまくいかなかったので今回は出力結果をコピペしてjsonファイルを作っちゃいます。時には力技もだいじ。（小声）

次に出力したjsonファイルをcsvに変換します。これはがんばってプログラムかいてみた。
 ```
import json
import csv

# JSONファイル読み取り
json_file_path = 'ダム.json'  
with open(json_file_path, 'r', encoding='utf-8') as json_file:
    data = json.load(json_file)

# CSVファイル書き込み
csv_file_path = 'output.csv' 
with open(csv_file_path, 'w', newline='', encoding='utf-8') as csv_file:
    csv_writer = csv.writer(csv_file)

    # ヘッダー書き込み
    headers = data['data']['search']['searchResults'][0]['metadata'].keys()
    csv_writer.writerow(headers)

    # 各行を書き込み
    for result in data['data']['search']['searchResults']:
        row = [result['metadata'].get(key, "") for key in headers]
        csv_writer.writerow(row)
 ```
出力したのがこんな感じ。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629590/00968ef8-41cc-92a6-dc0b-fe107fb536da.png)

 ## QGISへ出力
 
ここからはCSVデータをQGISに出力してみましょう！CSVをQGISに出力するには「データソースマネージャ」の「CSVテキスト」欄を使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629590/ee51aca5-b9e5-5c62-35b5-6c37022b1454.png)

これをGIS上で反映すると・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629590/0d0adbed-2473-d45a-c80d-42c64f51ed31.png)

できた！！データのテーブルも問題なさそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629590/257ae211-89b7-511a-e693-17401cbf70d1.png)
ここからレイヤプロパティで色分けと凡例を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629590/017b75af-44ae-dcc6-856f-2c106d5d5a5b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629590/ff971cb7-ec4d-0647-65d0-12a0ed025144.png)
めっちゃカラフル！でもこれだとよくわからないのでポイントサイズを小さくしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629590/3ea796d4-4516-4e10-ea72-561fbda8db21.png)
よく見ると島しょ部にもダムがあるんですね～

そして、関東近郊ではとくに千葉の南房総周辺に様々な形式のダムがあることがわかりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629590/b0ac63a6-08a2-d4ef-7ef0-f2a6a71b4e06.png)

 ## さいごに
 いかがでしたか？DPFに載っているデータは属性情報が様々付随されているんだな、ということを知っていただけたら幸いです。
 ではみなさま、良いクリスマスを！