G空間情報センターでCKAN APIをつかってみる（応用編）

# はじめに

「[G空間情報センターでCKAN APIを使ってみる（基本編）](https://qiita.com/tkhrmeme/items/74f7337b63bb26400fe9)」の続きです。

少し複雑な条件でデータセットを検索する方法を説明します。そして法務省登記所備付地図データを名前とタグを組み合わせた条件で検索し、複数のリソースをまとめてダウンロードします。

# 準備その1（APIキーの取得）

データセットには **public** なものと **private** なものがあり、それぞれメタデータの **private**属性が false / true となっています。

privateなデータセットは、そのデータセットを管理している「組織」に所属しているユーザーだけが閲覧やダウンローが可能です。このようなデータを処理する場合、APIを呼び出すときにAPIキーを付加する必要があります。

まずAPIキーを取得するにはG空間情報センターの[ユーザー登録](https://front.geospatial.jp/usermanager/signup)を行います。

ログインした後に表示される[ダッシュボード](https://www.geospatial.jp/ckan/dashboard)で、ニュースフィードのタブを選ぶと、ページの下の方に「API Key」が表示されています。APIキーの文字列は環境変数にセットしておくと良いでしょう。
`export GEOSPATIAL_CKAN_API_KEY=<あなたのAPIキー>`

<!--
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291613/2d1adb25-d87c-cc64-3184-37dcaafa2dda.png)
-->


# 準備その2（利用規約の確認）

法務省から公開されている登記所備付地図データは、政府標準利用規約（第2.0 版）に準拠したルールを守った上で利用することが出来ます。利用する前に[利用規約](https://www.geospatial.jp/ckan/dataset?organization=moj-mapdata)を一読して下さい。

参考：デジタル庁[「政府標準利用規約(第 2.0 版)」の解説](https://www.digital.go.jp/assets/contents/node/basic_page/field_ref_resources/f7fde41d-ffca-4b2a-9b25-94b8a701a037/a0f187e6/20220706_resources_data_betten_01.pdf)

# 複雑な条件でデータセットを検索する

登記所備付地図データにはタグとして「法務省」「地図情報」そして都道府県名や市区町村名が付与されています。

札幌市の場合、中央区、北区、東区といった区毎に法務局の出張所が分かれています。例えば、札幌市の地図データを一通り取得する検索条件は次のように表現できます。

`q=(tags:法務省 AND tags:地図情報 AND title:札幌市)`

この条件でデータセットを検索し、results 配列の先頭要素のデータセットからリソースの名前とフォーマットを取り出してみます。

```shell
> curl https://www.geospatial.jp/ckan/api/3/action/package_search?q=(tags:%E6%B3%95%E5%8B%99%E7%9C%81%20AND%20tags:%E5%9C%B0%E5%9B%B3%E6%83%85%E5%A0%B1%20AND%20title:%E6%9C%AD%E5%B9%8C%E5%B8%82) | jq '.result.results[0].resources[]|[.name,.format]'

[
  "利用規約",
  "PDF"
]
[
  "01101-4300.zip",
  "ZIP"
]
```

データセットには二つのリソースが配列に含まれています。リソースとして利用規約のPDFとXMLデータをアーカイブしたZIPファイルがあることがわかります。

そこで jqコマンドで formatが ZIPとなっているリソースを selectして、その URLを取り出します。

```shell
> curl https://www.geospatial.jp/ckan/api/3/action/package_search?q=(tags:%E6%B3%95%E5%8B%99%E7%9C%81%20AND%20tags:%E5%9C%B0%E5%9B%B3%E6%83%85%E5%A0%B1%20AND%20title:%E6%9C%AD%E5%B9%8C%E5%B8%82) | jq '.result.results[].resources[]|select(.format=="ZIP")|.url'

"https://www.geospatial.jp/ckan/dataset/2b06d80c-fc65-4b90-83b2-c8f8db4b2e8d/resource/d587ae20-a1b3-4518-8686-5f2a1b25a451/download/01101-4300.zip"
"https://www.geospatial.jp/ckan/dataset/c734cf96-e7d6-4ffd-92a5-9283adf75505/resource/7eaa665a-6eb3-4ec1-a3b4-5e7583feb4aa/download/01102-4306.zip"
"https://www.geospatial.jp/ckan/dataset/929c2446-d2a3-433a-8aa7-296bc7b9e29a/resource/50067981-2762-4f1b-aadd-7210c7e94e10/download/01103-4306.zip"
"https://www.geospatial.jp/ckan/dataset/65783f46-19ea-47ae-bd0a-b2a99ccb320e/resource/b9518dd8-f465-4073-9910-6507a5ab1d5a/download/01104-4316.zip"
"https://www.geospatial.jp/ckan/dataset/b1a3425c-af91-4cb4-a17f-10b6f96b45f2/resource/a7d77ec3-f68a-489e-975a-e28791829a3e/download/01105-4307.zip"
"https://www.geospatial.jp/ckan/dataset/032d800f-8c70-4850-bb34-48b5aecff48d/resource/9266f82e-d18e-45a6-a16e-721b8868122e/download/01106-4307.zip"
"https://www.geospatial.jp/ckan/dataset/5bc8edbf-ff62-4fc3-8dfe-155f564bf517/resource/ed520ea2-5c70-4c0c-b308-273122abc7bb/download/01107-4313.zip"
"https://www.geospatial.jp/ckan/dataset/9df7ab32-8ac1-4c86-9449-426862e6d83e/resource/af585809-b31e-45f3-aca0-cdba71d6c079/download/01108-4316.zip"
"https://www.geospatial.jp/ckan/dataset/014ca0de-f0f5-453c-ba96-e7a463b7c4ea/resource/cf370106-de6a-4b7a-abb3-aa648b26719b/download/01109-4313.zip"
"https://www.geospatial.jp/ckan/dataset/7e6bbb78-549a-49fe-b27c-11d867244d5d/resource/bcdf2def-bfc1-46e7-9592-903574cd6c4a/download/01110-4307.zip"
```
札幌市の10区分のURLを取り出すことができました。これを一旦　`> url_list.txt` としてテキストファイルに出力します。

```shell
curl https://www.geospatial.jp/ckan/api/3/action/package_search?q=(tags:%E6%B3%95%E5%8B%99%E7%9C%81%20AND%20tags:%E5%9C%B0%E5%9B%B3%E6%83%85%E5%A0%B1%20AND%20title:%E6%9C%AD%E5%B9%8C%E5%B8%82) | jq '.result.results[].resources[]|select(.format=="ZIP")|.url' > url_list.txt
```


# 複数のリソースをまとめてダウンロードする

URLを保存したファイルから **xargs** コマンドを使って **curl** を呼び出します。保存するファイル名は URLの文字列から **basename** コマンドで取り出しています。

curlコマンドは -H オプションで任意のヘッダーをリクエストに追加することができます。ここでは **X-CKAN-API-KEY** フィールドを追加し、値に環境変数にセットしたAPIキーを設定しています。

```zsh
> cat url_list.txt | xargs -n 1 sh -c 'file=$(basename $0); curl -L $0 -o $file -H X-CKAN-API-KEY: $GEOSPATIAL_CKAN_API_KEY'

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1139  100  1139    0     0   1014      0  0:00:01  0:00:01 --:--:--  1018
100 12.5M  100 12.5M    0     0  2651k      0  0:00:04  0:00:04 --:--:-- 4979k
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1139  100  1139    0     0   1099      0  0:00:01  0:00:01 --:--:--  1106
100 25.3M  100 25.3M    0     0  4506k      0  0:00:05  0:00:05 --:--:-- 5753k

# 以下リソースの数だけプログレスが表示される。
# 進捗表示が不要な場合は curlに -sオプションを追加する。
```

## 終わりに

CKAN APIを使うとデータセットやリソースを検索するものだけでなく、新規にデータセットを作成しリソースを追加することもできます。[CKAN API Guide](https://docs.ckan.org/en/2.10/api/index.html)を読んで色々試してみると良いでしょう。

# 参考リンク

- [ckan ホームページ（英語）](https://ckan.org/)
- [ckan ドキュメント（英語）](https://docs.ckan.org/en/2.10/)
- [G空間情報センター](https://front.geospatial.jp/)
  - [法務省登記所備付地図に関するご案内](https://front.geospatial.jp/moj-chizu-xml-readme/)