G空間情報センターでCKAN APIを使ってみる（基本編）

# はじめに

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

ここでは CKANの中で扱われるデータセットとリソースの構造の概略を説明します。そしてコマンドラインで curlコマンドと jqコマンドを組み合わせてリソースのメタデータからデータの URL を取り出してダウンロードします。

# データセットの検索とメタデータの取得

入門編でデータセットを検索するときに**package_search**コマンドを使いました。レスポンスに返されるresult要素の下にはresults要素があり、各データセットのメタデータが配列として含まれています。先頭要素のデータセットを取り出すと下記のようなキーが存在しています。

```shell
% curl -s "https://www.geospatial.jp/ckan/api/3/action/package_search?q=PLATEAU+札幌市&rows=5" | jq ".result.results[0]|keys"
[
  "area",
  "author",
  "author_email",
  "charge",
  "creator_user_id",
  "emergency",
  "fee",
  "groups",
  "id",
  "isopen",
  "license_agreement",
  "license_id",
  "license_title",
  "license_url",
  "maintainer",
  "maintainer_email",
  "metadata_created",
  "metadata_modified",
  "name",
  "notes",
  "num_resources",
  "num_tags",
  "organization",
  "owner_org",
  "private",
  "quality",
  "registerd_date",
  "relationships_as_object",
  "relationships_as_subject",
  "resources",
  "restriction",
  "revision_id",
  "spatial",
  "state",
  "tags",
  "thumbnail_url",
  "title",
  "type",
  "url",
  "version"
]
```
先頭要素のデータセットからいくつかの属性を指定して取り出してみます。
```shell
% curl -s "https://www.geospatial.jp/ckan/api/3/action/package_search?q=PLATEAU+札幌市&rows=5" | jq ".result.results[0]|[.id,.name,.title,.maintainer,.author_email,.num_resources]"
[
  "b13ac8ba-2bdb-40c4-b4a5-954e671e39a3",
  "plateau-01100-sapporo-shi-2020",
  "3D都市モデル（Project PLATEAU）札幌市（2020年度）",
  "国土交通省都市局都市政策課",
  "hqt-mlit-plateau@mlit.go.jp",
  9
]
```
データセットのID、名前、タイトル、管理者、メールアドレス、そしてリソースの個数を取り出すことが出来ました。ここではリソースが9個あることがわかります。リソースは **resources** 要素の配列の中にメタデータが格納されています。

次にリソースのメタデータを取り出してみます。
```shell
% curl -s "https://www.geospatial.jp/ckan/api/3/action/package_search?q=PLATEAU+札幌市&rows=5" | jq ".result.results[0].resources[]|[.name,.format,.url]"                           
[
  "データ目録",
  "XLSX",
  "https://www.geospatial.jp/ckan/dataset/b13ac8ba-2bdb-40c4-b4a5-954e671e39a3/resource/d0ec89b1-3451-4987-b3c2-f92674afd1fd/download/01100_sapporo-shi_2020catalog.xlsx"
]
[
  "図郭マップ",
  "PDF",
  "https://www.geospatial.jp/ckan/dataset/b13ac8ba-2bdb-40c4-b4a5-954e671e39a3/resource/97b8bfd8-513d-4585-aa08-8fb2ea91253f/download/01100_indexmap_op.pdf"
]
[
  "CityGML",
  "ZIP",
  "https://gic-plateau.s3.ap-northeast-1.amazonaws.com/2020/01100_sapporo-shi_2020_citygml_3_op.zip"
]
[
  "3D Tiles, GeoJson, MVT, Shape",
  "ZIP",
  "https://gic-plateau.s3.ap-northeast-1.amazonaws.com/2020/01100_sapporo-shi_2020_3Dtiles_etc_1_op.zip"
]
[
  "FBX",
  "ZIP",
  "https://gic-plateau.s3.ap-northeast-1.amazonaws.com/2020/01100_sapporo-shi_2020_fbx_3_op.zip"
]
[
  "OBJ",
  "ZIP",
  "https://gic-plateau.s3.ap-northeast-1.amazonaws.com/2020/01100_sapporo-shi_2020_obj_3_op.zip"
]
[
  "ファイルジオデータベース",
  "7z",
  "https://3d-city-model-ej-fgdbs.s3.ap-northeast-1.amazonaws.com/01100_sapporo-shi_2020/01100_sapporo-shi_fgdb.7z"
]
[
  "ファイルジオデータベース（防災）",
  "7z",
  "https://3d-city-model-ej-fgdbs.s3.ap-northeast-1.amazonaws.com/01100_sapporo-shi_2020/01100_sapporo-shi_saigai_fgdb.7z"
]
[
  "GeoTIFF",
  "7z",
  "https://gic-plateau.s3.ap-northeast-1.amazonaws.com/2020/ortho/01100_sapporo-shi_2020_ortho_3_op.zip"
]

```
リソースの名前、データフォーマット、データのURLを取り出すことが出来ました。名前が"OBJ"のリソースをjqコマンドで **select** してurlの値を取り出します。

```shell
% curl -s "https://www.geospatial.jp/ckan/api/3/action/package_search?q=PLATEAU+札幌市&rows=5" | jq '.result.results[0].resources[]|select(.name == "OBJ")|.url'
"https://gic-plateau.s3.ap-northeast-1.amazonaws.com/2020/01100_sapporo-shi_2020_obj_3_op.zip"
```


## リソースのダウンロード

OBJ形式のデータをダウンロードしてみます。curlコマンドに-oオプションを付けてファイルに保存します。

```shell
% curl "https://gic-plateau.s3.ap-northeast-1.amazonaws.com/2020/01100_sapporo-shi_2020_obj_3_op.zip" -o sapporo_obj.zip
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  716M  100  716M    0     0  24.7M      0  0:00:28  0:00:28 --:--:-- 27.8M
```
保存された.zipファイルを展開するとフォルダが現れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291613/7c3b420a-06ed-862b-6b26-81a62ce50d11.png)

次にPDF形式のデータを取得してみます。
```shell
% curl "https://www.geospatial.jp/ckan/dataset/b13ac8ba-2bdb-40c4-b4a5-954e671e39a3/resource/97b8bfd8-513d-4585-aa08-8fb2ea91253f/download/01100_indexmap_op.pdf"       
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>Redirecting...</title>
<h1>Redirecting...</h1>
<p>You should be redirected automatically to target URL: <a href="https://ckan-storage.s3.amazonaws.com/ckan/resources/97b8bfd8-513d-4585-aa08-8fb2ea91253f/01100_indexmap_op.pdf?response-content-disposition=attachment%3B%20filename%3D01100_indexmap_op.pdf&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Expires=3600&amp;X-Amz-Credential=AKIAIJLU3H4E64UZ5VEA%2F20230321%2Fus-east-1%2Fs3%2Faws4_request&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Date=20230321T124247Z&amp;X-Amz-Signature=1a06eb7605f106ebc42f297016b61852603eb8898af9ba36cebcedaed734d99b">https://ckan-storage.s3.amazonaws.com/ckan/resources/97b8bfd8-513d-4585-aa08-8fb2ea91253f/01100_indexmap_op.pdf?response-content-disposition=attachment%3B%20filename%3D01100_indexmap_op.pdf&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Expires=3600&amp;X-Amz-Credential=AKIAIJLU3H4E64UZ5VEA%2F20230321%2Fus-east-1%2Fs3%2Faws4_request&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Date=20230321T124247Z&amp;X-Amz-Signature=1a06eb7605f106ebc42f297016b61852603eb8898af9ba36cebcedaed734d99b</a>.  If not click the link.%
```

これはPDFのデータではなくHTMLが返ってきています。この場合、実際のデータはリダイレクトで別のURLに存在しています。レスポンスのヘッダーを調べてみます。


```shell
curl --head "https://www.geospatial.jp/ckan/dataset/b13ac8ba-2bdb-40c4-b4a5-954e671e39a3/resource/97b8bfd8-513d-4585-aa08-8fb2ea91253f/download/01100_indexmap_op.pdf"
HTTP/2 302 
content-type: text/html; charset=utf-8
content-length: 1167
location: https://ckan-storage.s3.amazonaws.com/ckan/resources/97b8bfd8-513d-4585-aa08-8fb2ea91253f/01100_indexmap_op.pdf?response-content-disposition=attachment%3B%20filename%3D01100_indexmap_op.pdf&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=3600&X-Amz-Credential=AKIAIJLU3H4E64UZ5VEA%2F20230321%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-SignedHeaders=host&X-Amz-Date=20230321T124247Z&X-Amz-Signature=1a06eb7605f106ebc42f297016b61852603eb8898af9ba36cebcedaed734d99b
access-control-allow-origin: *
```

HTTPレスポンスの 302 はリダイレクトを表しており、実際のデータの場所は localtion:フィールドの値にURLが入っています。

curlコマンドの -Lオプションを使うとリダイレクト処理を行ってくれます。リダリレ区と先にあるデータをファイルに保存します。

```shell
% curl -L "https://www.geospatial.jp/ckan/dataset/b13ac8ba-2bdb-40c4-b4a5-954e671e39a3/resource/97b8bfd8-513d-4585-aa08-8fb2ea91253f/download/01100_indexmap_op.pdf" > indexmap.pdf
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1167  100  1167    0     0   5478      0 --:--:-- --:--:-- --:--:--  5453
100 2685k  100 2685k    0     0   967k      0  0:00:02  0:00:02 --:--:-- 1788k
```
PDFデータをダウンロードすることが出来ました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291613/fbcfddc4-4700-01bf-a6d6-adf4afe200c5.png)

# 終わりに

CKANのデータセットとリソースの構造について概略を説明しました。またcurlコマンドとjqコマンドを組み合わせて、リソースのメタデータからURLを取り出し、リダイレクトに対応したダウンロードの方法を説明しました。

基本編はここまで

# 参考リンク

- [ckan ホームページ（英語）](https://ckan.org/)
- [ckan ドキュメント（英語）](https://docs.ckan.org/en/2.10/)
- [G空間情報センター](https://front.geospatial.jp/)
  - [3D都市モデル(Project PLATEAU)ポータルサイト](https://www.geospatial.jp/ckan/dataset/plateau)