はじめに
G空間情報センターで公開されている登記所備付地図データ(XML形式)は、法務局・出張所単位でファイルが分かれており、都道府県単位でまとめてダウンロードするのはブラウザから手作業で実行するのは大変です。
G空間情報センターでは CKAN API を使って検索やダウンロードすることが出来ます。そこでコマンドラインを使って複数データをまとめて検索・ダウンロードする方法を説明します。
動作環境
ここでは curl、jq、xargsそしてbasenameといったコマンドを使用します。また動作確認は macOSにて行っています。
Windowsでは PowerShellで実行される curlはいわゆる curlとは別物です。実際には curl.exeコマンドを使用する必要があります。
タグを使ってデータセットを検索する
まずはブラウザでデータセットを開いてみます。
リソースのファイルが並んでいる下に、四角で囲まれた文字列が タグ です。
タグを使って検索する場合は、検索する文字列を前に tags: を入れます。複数のタグを並べるときは半角スペースと AND で並べます。
CKAN APIで検索する
ブラウザで下記のURLを開くと CKAN APIを呼び出すことが出来ます。
https://www.geospatial.jp/ckan/api/3/action/package_search?q=tags:地図情報 AND tags:法務省 AND tags:福島県
実際には日本語で入力した部分や半角スペースは「URLエンコード」されて下記の様な文字列になります。FirefoxやChromeなどのブラウザではURLフィールドに日本語が入っていても、コピーするとURLエンコードされた文字列を取り出すことが出来ます。
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%20tags:%E7%A6%8F%E5%B3%B6%E7%9C%8C
レスポンスはJSON形式で返ってきます。FirefoxではJSON形式を整形して表示してくれるので便利です。
count要素を見ると 62個のデータセットがあることが分かります。また一つ目のデータセットには num_resources要素を見ると3つリソースがあることが分かります。
curlコマンドで検索する
上記のURLをcurlコマンドで開いてみます。返り値のJSONデータは jqコマンドにパイプライで繋いで整形し、要素を指定することで値を抽出します。-sオプションは進行状況の表示をオフにします。
jq '.result.count'
とするとcount要素の値を取り出すことが出来ます。
% curl -s 'https://www.geospatial.jp/ckan/api/3/action/package_search?q=tags:%E5%9C%B0%E5%9B%B3%E6%83%85%E5%A0%B1%20AND%20tags:%E6%B3%95%E5%8B%99%E7%9C%81%20AND%20tags:%E7%A6%8F%E5%B3%B6%E7%9C%8C' | jq '.result.count'
62
jq '.result.results[0].num_resources'
とすると一つ目のデータセットのnum_resources要素の値を取り出すことが出来ます。
% curl -s 'https://www.geospatial.jp/ckan/api/3/action/package_search?q=tags:%E5%9C%B0%E5%9B%B3%E6%83%85%E5%A0%B1%20AND%20tags:%E6%B3%95%E5%8B%99%E7%9C%81%20AND%20tags:%E7%A6%8F%E5%B3%B6%E7%9C%8C' | jq '.result.results[0].num_resources'
3
リソースのURLをcurlコマンドで取り出す
登記所備付地図XMLデータの各データセットには
- 利用規約(PDF)
- 2022年度データ(zip)
- 2023年度データ(zip)
の3つのリソースが含まれています。ここでは話を簡単にするために データセットには同じ順番でリソースが登録されていることを仮定 します。その場合、2023年度の3つ目のリソースのURLを抽出するには jq '.result.results[].resources[2].url'
とすればOKです。
% curl -s 'https://www.geospatial.jp/ckan/api/3/action/package_search?q=tags:%E5%9C%B0%E5%9B%B3%E6%83%85%E5%A0%B1%20AND%20tags:%E6%B3%95%E5%8B%99%E7%9C%81%20AND%20tags:%E7%A6%8F%E5%B3%B6%E7%9C%8C&rows=20' | jq '.result.results[].resources[2].url'
"https://www.geospatial.jp/ckan/dataset/79ef9787-986d-4183-938c-a297cd7db2ad/resource/dff05501-7982-4b82-bd0b-77bafd15aa88/download/07201-3800-2023.zip"
"https://www.geospatial.jp/ckan/dataset/6c8d2c98-c2dc-4342-b89c-c325ef5bdbf4/resource/68eed9e9-d37b-442b-a89c-1173fb4f7e8d/download/07202-3804-2023.zip"
"https://www.geospatial.jp/ckan/dataset/2ca7f3c8-b701-4417-8de3-c8deb5db1c9b/resource/87466cde-86f2-4a26-9383-2ce1445d9cb7/download/07203-3802-2023.zip"
"https://www.geospatial.jp/ckan/dataset/66f6fe58-b66d-4787-b051-57c32a26c622/resource/e4f3594a-b70c-457a-ba40-99893eac18ea/download/07204-3805-2023.zip"
"https://www.geospatial.jp/ckan/dataset/d574da71-107f-4f78-91f5-69410800892d/resource/4eaf933d-d373-4da0-8ead-8108fcc9fa96/download/07205-3803-2023.zip"
"https://www.geospatial.jp/ckan/dataset/57fb55cb-c825-46c2-846c-252953fc991c/resource/76ee595e-426d-49e2-9b86-3e77d6e5a018/download/07207-3802-2023.zip"
"https://www.geospatial.jp/ckan/dataset/9a43cb63-8566-4255-976e-1f6bd8c52ff7/resource/5a92e0c0-ab2a-460e-94cc-f8eaa285faee/download/07208-3804-2023.zip"
"https://www.geospatial.jp/ckan/dataset/18801ba6-519d-4a6f-b5d5-c10b45e8d8f4/resource/d6ac4899-33c5-4f0e-9c57-8881b071df2b/download/07209-3801-2023.zip"
"https://www.geospatial.jp/ckan/dataset/5818f711-4d68-48d2-a386-bafb304eddb3/resource/e21139a5-d089-41a8-a6b1-d45e95aa81ab/download/07210-3808-2023.zip"
"https://www.geospatial.jp/ckan/dataset/7a30cbb3-9667-4dc3-81fe-80d43d1aed48/resource/c79f7c98-dee1-42e2-9f76-304d19714270/download/07211-3802-2023.zip"
"https://www.geospatial.jp/ckan/dataset/c0449654-e2e2-4933-808c-2122f8cd6ad1/resource/c353cab1-45dd-4539-810f-3208340ff7a2/download/07212-3801-2023.zip"
"https://www.geospatial.jp/ckan/dataset/d051b1f4-e80a-490b-8ab7-5f818fd8d4b1/resource/c57895ca-ab71-4535-b70e-74f678ea76d7/download/07213-3800-2023.zip"
"https://www.geospatial.jp/ckan/dataset/1f431bf9-9564-49a7-87ab-bbbe874a5ab9/resource/b2d91e85-4ba8-4a5c-af2c-48c2a0f00d41/download/07214-3808-2023.zip"
"https://www.geospatial.jp/ckan/dataset/75d805be-4b82-4d4f-b42a-3c1f73ae539a/resource/ec137fdc-a9ff-448c-aacb-2cab244d2509/download/07301-3800-2023.zip"
"https://www.geospatial.jp/ckan/dataset/e952640c-3916-47a9-a483-6a8ff434f68e/resource/3fc22496-de67-4bd5-a6e1-debe724b2926/download/07303-3800-2023.zip"
"https://www.geospatial.jp/ckan/dataset/26154123-7222-42a1-89f1-1bc9c96ef2fe/resource/218f5055-6cd9-4fce-821a-7074cffc6ca3/download/07308-3800-2023.zip"
"https://www.geospatial.jp/ckan/dataset/3d063402-6cd5-4cc7-9d35-3abd21db190e/resource/f1725568-ec95-4d3c-b041-d41e7ae9457b/download/07309-3800-2023.zip"
null
"https://www.geospatial.jp/ckan/dataset/dc2e0f0b-3e17-4067-b2f2-59edc380158b/resource/ad95248c-7a0a-47aa-9173-48652ce4346a/download/07322-3808-2023.zip"
"https://www.geospatial.jp/ckan/dataset/c491c526-0e68-4672-807c-6d525784c11d/resource/e934b9c3-74c9-4559-90e8-8dba4cec4a44/download/07342-3802-2023.zip"
ここではCKAN APIを呼び出すパラメータで &rows=20
を追加して、検索結果を20件まで返すように指定しています。
さて、18行目が null になっています。安達郡安達町(福島地方法務局二本松出張所)のデータセットは2022年度のリソースは存在していますが、2023年度は他の出張所にまとめられてしまったためかリソースが存在しません。
curlコマンドで if文を使う
num_resources要素が 3以上の場合だけURLを取り出し、それ以外は空の値(empty)にする場合はjq '.result.results[] | if .num_resources >= 3 then .resources[2].url else empty end'
と書きます。
% curl -s 'https://www.geospatial.jp/ckan/api/3/action/package_search?q=tags:%E5%9C%B0%E5%9B%B3%E6%83%85%E5%A0%B1%20AND%20tags:%E6%B3%95%E5%8B%99%E7%9C%81%20AND%20tags:%E7%A6%8F%E5%B3%B6%E7%9C%8C&rows=20' | jq '.result.results[] | if .num_resources ==3 then .resources[2].url else empty end'
"https://www.geospatial.jp/ckan/dataset/79ef9787-986d-4183-938c-a297cd7db2ad/resource/dff05501-7982-4b82-bd0b-77bafd15aa88/download/07201-3800-2023.zip"
"https://www.geospatial.jp/ckan/dataset/6c8d2c98-c2dc-4342-b89c-c325ef5bdbf4/resource/68eed9e9-d37b-442b-a89c-1173fb4f7e8d/download/07202-3804-2023.zip"
"https://www.geospatial.jp/ckan/dataset/2ca7f3c8-b701-4417-8de3-c8deb5db1c9b/resource/87466cde-86f2-4a26-9383-2ce1445d9cb7/download/07203-3802-2023.zip"
"https://www.geospatial.jp/ckan/dataset/66f6fe58-b66d-4787-b051-57c32a26c622/resource/e4f3594a-b70c-457a-ba40-99893eac18ea/download/07204-3805-2023.zip"
"https://www.geospatial.jp/ckan/dataset/d574da71-107f-4f78-91f5-69410800892d/resource/4eaf933d-d373-4da0-8ead-8108fcc9fa96/download/07205-3803-2023.zip"
"https://www.geospatial.jp/ckan/dataset/57fb55cb-c825-46c2-846c-252953fc991c/resource/76ee595e-426d-49e2-9b86-3e77d6e5a018/download/07207-3802-2023.zip"
"https://www.geospatial.jp/ckan/dataset/9a43cb63-8566-4255-976e-1f6bd8c52ff7/resource/5a92e0c0-ab2a-460e-94cc-f8eaa285faee/download/07208-3804-2023.zip"
"https://www.geospatial.jp/ckan/dataset/18801ba6-519d-4a6f-b5d5-c10b45e8d8f4/resource/d6ac4899-33c5-4f0e-9c57-8881b071df2b/download/07209-3801-2023.zip"
"https://www.geospatial.jp/ckan/dataset/5818f711-4d68-48d2-a386-bafb304eddb3/resource/e21139a5-d089-41a8-a6b1-d45e95aa81ab/download/07210-3808-2023.zip"
"https://www.geospatial.jp/ckan/dataset/7a30cbb3-9667-4dc3-81fe-80d43d1aed48/resource/c79f7c98-dee1-42e2-9f76-304d19714270/download/07211-3802-2023.zip"
"https://www.geospatial.jp/ckan/dataset/c0449654-e2e2-4933-808c-2122f8cd6ad1/resource/c353cab1-45dd-4539-810f-3208340ff7a2/download/07212-3801-2023.zip"
"https://www.geospatial.jp/ckan/dataset/d051b1f4-e80a-490b-8ab7-5f818fd8d4b1/resource/c57895ca-ab71-4535-b70e-74f678ea76d7/download/07213-3800-2023.zip"
"https://www.geospatial.jp/ckan/dataset/1f431bf9-9564-49a7-87ab-bbbe874a5ab9/resource/b2d91e85-4ba8-4a5c-af2c-48c2a0f00d41/download/07214-3808-2023.zip"
"https://www.geospatial.jp/ckan/dataset/75d805be-4b82-4d4f-b42a-3c1f73ae539a/resource/ec137fdc-a9ff-448c-aacb-2cab244d2509/download/07301-3800-2023.zip"
"https://www.geospatial.jp/ckan/dataset/e952640c-3916-47a9-a483-6a8ff434f68e/resource/3fc22496-de67-4bd5-a6e1-debe724b2926/download/07303-3800-2023.zip"
"https://www.geospatial.jp/ckan/dataset/26154123-7222-42a1-89f1-1bc9c96ef2fe/resource/218f5055-6cd9-4fce-821a-7074cffc6ca3/download/07308-3800-2023.zip"
"https://www.geospatial.jp/ckan/dataset/3d063402-6cd5-4cc7-9d35-3abd21db190e/resource/f1725568-ec95-4d3c-b041-d41e7ae9457b/download/07309-3800-2023.zip"
"https://www.geospatial.jp/ckan/dataset/dc2e0f0b-3e17-4067-b2f2-59edc380158b/resource/ad95248c-7a0a-47aa-9173-48652ce4346a/download/07322-3808-2023.zip"
"https://www.geospatial.jp/ckan/dataset/c491c526-0e68-4672-807c-6d525784c11d/resource/e934b9c3-74c9-4559-90e8-8dba4cec4a44/download/07342-3802-2023.zip"
null の行が取り除かれて19件のURLが取り出せました。
URLからリソースをダウンロードする
登記所備付地図をダウンロードする場合には CKAN APIキーを付加することが 推奨 されます。G空間情報センターにログインした後、ダッシュボードのページを開くとAPI Keyが表示されていますので、この文字列を利用します。
curlコマンドでは -Hオプションで X-CKAN-API-KEY: を追加します。ここでは環境変数 GEOSPATIAL_CKAN_API_KEY に値を設定して利用しています。
前述の処理で19件のURLが取り出せたので、パイプラインでxargsコマンドにデータを渡します。xargs -n 1
で一行ずつURLを処理します。
CKANからダウンロードするときには curlに -Lオプションを付けてリダイレクトを指定します。また -oオプションを付けて保存先のファイル名を指定します。
basenameコマンドはURL文字列から一番後ろのファイル名の部分を取り出しています。
curl -s 'https://www.geospatial.jp/ckan/api/3/action/package_search?q=tags:%E5%9C%B0%E5%9B%B3%E6%83%85%E5%A0%B1%20AND%20tags:%E6%B3%95%E5%8B%99%E7%9C%81%20AND%20tags:%E7%A6%8F%E5%B3%B6%E7%9C%8C&rows=20' | xargs -n 1 sh -c 'xargs -n 1 sh -c 'curl -L $0 -o $(basename $0) -H X-CKAN-API-KEY: $GEOSPATIAL_CKAN_API_KEY'
上記のスクリプトを実行すると19個のzipファイルがダウンロードされます。
おまけ
コマンドラインで日本語の文字列などをURLエンコードする時に jqコマンド を利用することができます。
% echo '地図情報' | jq -Rr '@uri'
%E5%9C%B0%E5%9B%B3%E6%83%85%E5%A0%B1
% echo '法務省' | jq -Rr '@uri'
%E6%B3%95%E5%8B%99%E7%9C%81
% echo '福島県' | jq -Rr '@uri'
%E7%A6%8F%E5%B3%B6%E7%9C%8C
関連ページ