〇〇県の登記所備付地図データをまとめてダウンロードする

# はじめに

G空間情報センターで公開されている[登記所備付地図データ（XML形式）](https://front.geospatial.jp/moj-chizu-xml-download/)は、法務局・出張所単位でファイルが分かれており、都道府県単位でまとめてダウンロードするのはブラウザから手作業で実行するのは大変です。

G空間情報センターでは [CKAN API](https://docs.ckan.org/en/2.9/api/) を使って検索やダウンロードすることが出来ます。そこでコマンドラインを使って複数データをまとめて検索・ダウンロードする方法を説明します。

# 動作環境

ここでは curl、jq、xargsそしてbasenameといったコマンドを使用します。また動作確認は macOSにて行っています。

:::note
Windowsでは PowerShellで実行される curlはいわゆる curlとは別物です。実際には curl.exeコマンドを使用する必要があります。
:::

# タグを使ってデータセットを検索する

まずはブラウザで[データセット](https://www.geospatial.jp/ckan/dataset/houmusyouchizu-2023-1-373)を開いてみます。

リソースのファイルが並んでいる下に、四角で囲まれた文字列が **タグ** です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291613/722ea127-0f8a-3856-d80e-651132506ae6.png)

タグを使って検索する場合は、検索する文字列を前に **tags:** を入れます。複数のタグを並べるときは半角スペースと **AND** で並べます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291613/2a2aa14e-81c1-fea4-257f-906ac8743025.png)

# 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形式を整形して表示してくれるので便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291613/8272df24-5793-1be7-63b6-a55fdbd3778e.png)

count要素を見ると 62個のデータセットがあることが分かります。また一つ目のデータセットには num_resources要素を見ると3つリソースがあることが分かります。

# curlコマンドで検索する

上記のURLをcurlコマンドで開いてみます。返り値のJSONデータは jqコマンドにパイプライで繋いで整形し、要素を指定することで値を抽出します。-sオプションは進行状況の表示をオフにします。

`jq '.result.count'`とするとcount要素の値を取り出すことが出来ます。

```shell
% 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要素の値を取り出すことが出来ます。

```shell
% 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データの各データセットには
1. 利用規約(PDF)
1. 2022年度データ(zip)
1. 2023年度データ(zip)

の3つのリソースが含まれています。ここでは話を簡単にするために **データセットには同じ順番でリソースが登録されていることを仮定** します。その場合、2023年度の3つ目のリソースのURLを抽出するには `jq '.result.results[].resources[2].url'` とすればOKです。

```shell
% 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* になっています。[安達郡安達町（福島地方法務局二本松出張所）](https://www.geospatial.jp/ckan/dataset/houmusyouchizu-2023-1-390)のデータセットは2022年度のリソースは存在していますが、2023年度は他の出張所にまとめられてしまったためかリソースが存在しません。

# curlコマンドで if文を使う

num_resources要素が 3以上の場合だけURLを取り出し、それ以外は空の値(empty)にする場合は`jq '.result.results[] | if .num_resources >= 3 then .resources[2].url else empty end'`と書きます。

```shell
% 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空間情報センターにログインした後、[ダッシュボードのページ](https://www.geospatial.jp/ckan/dashboard)を開くと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文字列から一番後ろのファイル名の部分を取り出しています。

```shell
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コマンド** を利用することができます。

```shell
% 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
```

## 関連ページ

https://qiita.com/tkhrmeme/items/6992de0bc7d134f500b5

https://qiita.com/tkhrmeme/items/74f7337b63bb26400fe9

https://qiita.com/tkhrmeme/items/2581cdf684369b9961b4