はじめに
「G空間情報センターでCKAN APIを使ってみる(入門編)」の続きです。
ここでは CKANの中で扱われるデータセットとリソースの構造の概略を説明します。そしてコマンドラインで curlコマンドと jqコマンドを組み合わせてリソースのメタデータからデータの URL を取り出してダウンロードします。
データセットの検索とメタデータの取得
入門編でデータセットを検索するときにpackage_searchコマンドを使いました。レスポンスに返されるresult要素の下にはresults要素があり、各データセットのメタデータが配列として含まれています。先頭要素のデータセットを取り出すと下記のようなキーが存在しています。
% 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"
]
先頭要素のデータセットからいくつかの属性を指定して取り出してみます。
% 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 要素の配列の中にメタデータが格納されています。
次にリソースのメタデータを取り出してみます。
% 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の値を取り出します。
% 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オプションを付けてファイルに保存します。
% 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
次にPDF形式のデータを取得してみます。
% 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&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">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</a>. If not click the link.%
これはPDFのデータではなくHTMLが返ってきています。この場合、実際のデータはリダイレクトで別のURLに存在しています。レスポンスのヘッダーを調べてみます。
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オプションを使うとリダイレクト処理を行ってくれます。リダリレ区と先にあるデータをファイルに保存します。
% 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
終わりに
CKANのデータセットとリソースの構造について概略を説明しました。またcurlコマンドとjqコマンドを組み合わせて、リソースのメタデータからURLを取り出し、リダイレクトに対応したダウンロードの方法を説明しました。
基本編はここまで