Traveler APIを利用し、シーンを検索して衛星データをダウンロードする(後編)
Tag
はじめに
本記事ではJupyterLabを使ってTraveler APIを利用し、シーンを検索して検索結果を元にシーン情報、ファイル情報を取得、ダウンロードURLを取得する方法を前編、後編に分けて紹介します。今回はその後編です。
ここで紹介しているAPIに使用するデータはデータセット詳細画面の「購入設定」>「販売方式」の欄に「Tellusアーカイブ」と記載のあるアーカイブデータセットを使用してください。
APIトークンの発行やrequests モジュールのインストール、検索条件を指定してシーンを検索する、検索結果を元にシーン情報を取得する方法については前編を、APIの詳細についてはこちらをご覧ください。
本記事においてJupyterLabを起動し、サンプルコードを貼り付ける際はTOKEN("TOKENXXXXXXXXXXXXXXXXXX"と表示されている部分)にAPIトークンを貼り付けてください。
事前準備
Traveler APIを使用するためにはAPIトークンが必要です。また、サンプルコード中でrequestsモジュールを使用しています。APIトークンの発行方法、モジュールのインストール方法については前編を参照してください。
Pillow、matplotlibライブラリーのインストール
JupyterLab上で画像処理を行うためにPillow、matplotlibのインストールを行います。
Macであればターミナル、Windowsであればコマンドプロンプト、JupyterLab上でコマンドを実行する場合はコマンドの頭に!を付けて実行してください。
Pillowインストール
pip install Pillow
JupyterLab実行イメージ
Matplotlibインストール
pip install matplotlib
JupyterLab実行イメージ
pip listでインストールできているか確認できます。
シーンのファイル情報を取得する
ファイル情報の一覧を取得するためにAPIの/datasets/{dataset_id}/data/{data_id}/files/を使用します。
JupyterLabを起動し以下のサンプルコードを貼り付けます。
メソッド呼び出し時の引数はファイル情報を取得したいシーン情報に差し替えていただくとそのシーンでのファイル情報一覧が取得できます。
import requests TOKEN = "TOKENXXXXXXXXXXXXXXXXXX" def get_files_list(dataset_id, data_id): url = 'https://www.tellusxdp.com/api/traveler/v1/datasets/{}/data/{}/files/'.format(dataset_id , data_id) headers = { "Authorization": "Bearer " + TOKEN, 'content-type': 'application/json' } r = requests.get(url, headers=headers) return r.json() print(get_files_list('ea71ef6e-9569-49fc-be16-ba98d876fb73','ced28b22-535a-48bb-bb1f-53f04ca4a3ee'))
JupyterLabの画面イメージは以下のようになります。
枠で囲っている部分はご自身のAPIトークンと調べたいシーン情報に置き換えてください。
dataset_id (データセットID)はTravelerの取得したいシーンのデータセット詳細ページのID、data_id(シーンID)は取得シーン詳細ページのIDを入力してください。
さらにAPIの/datasets/{dataset_id}/data/{data_id}/files/{file_id}/を使用するとシーンとファイルを指定してファイル情報を取得することができます。
ダウンロードURLを生成する
選択したファイルのダウンロードURLを生成するためにAPIの/datasets/{ dataset_id }/data/{ data_id }/files/{ file_id }/download-url/を使用します。
JupyterLabに以下のサンプルコードを貼り付けます。
メソッド呼び出し時の引数はダウンロードURLを生成したいファイル情報に書き換えてください。
TOKEN = "TOKENXXXXXXXXXXXXXXXXXX" def get_download_url(dataset_id, data_id, file_id): url = 'https://www.tellusxdp.com/api/traveler/v1/datasets/{}/data/{}/files/{}/download-url/'.format(dataset_id, data_id, file_id) headers = { "Authorization": "Bearer " + TOKEN, 'Content-Type': 'application/json', } r = requests.post(url, headers=headers) assert r.status_code == 200 return json.loads(r.content) print(get_download_url('ea71ef6e-9569-49fc-be16-ba98d876fb73','ced28b22-535a-48bb-bb1f-53f04ca4a3ee','9'))
JupyterLabの画面イメージは以下のようになります。
実行結果のURLからファイルをブラウザ上に表示することができます。生成されたダウンロードURLの有効期限は1時間です。
枠で囲っている部分はご自身のAPIトークンと調べたいシーン情報に置き換えてください。
また、実行時に422エラーで”このアクションを実行する権限がありません。"とメッセージが表示された場合は、該当の衛星データの基本情報に記載されている利用範囲を確認してください。
利用範囲が「Tellus環境限定」のデータについては、Tellusで提供している開発環境からのみAPIを利用できます。
また、ファイルのダウンロードURL生成を画面上で行いたい場合はファイルの「URLを表示」ボタンをクリックすると表示されます。
次に生成したダウンロードURLから衛星データをファイル出力します。
以下のサンプルコードを貼り付けて実行してください。
本記事の冒頭でインストールしたpillowとmatplotlibを使用します。
import requests from PIL import Image import matplotlib.pyplot as plt %matplotlib inline TOKEN = "TOKENXXXXXXXXXXXXXXXXXX" #ファイル情報取得API def get_file_info(dataset_id, data_id, file_id): url = 'https://www.tellusxdp.com/api/traveler/v1/datasets/{}/data/{}/files/{}/'.format(dataset_id , data_id, file_id) headers = { "Authorization": "Bearer " + TOKEN, 'content-type': 'application/json' } r = requests.get(url, headers=headers) return r.json() #ダウンロードURL取得API def get_download_url(dataset_id, data_id, file_id): url = 'https://www.tellusxdp.com/api/traveler/v1/datasets/{}/data/{}/files/{}/download-url/'.format(dataset_id, data_id, file_id) headers = { "Authorization": "Bearer " + TOKEN, 'Content-Type': 'application/json' } r = requests.post(url, headers=headers) return r.json() #ダウンロードしたいデータのファイル情報 dataset_id='ea71ef6e-9569-49fc-be16-ba98d876fb73' data_id='ced28b22-535a-48bb-bb1f-53f04ca4a3ee' file_id='4' #APIを呼び出す download_url = get_download_url(dataset_id,data_id,file_id) name = get_file_info(dataset_id,data_id,file_id) #取得した情報から必要な情報を取り出す url = download_url['download_url'] file_name = name['name'] size_bytes = name['size_bytes'] print('ファイル名:' + file_name) print('ファイルサイズ:' + str(size_bytes)) #ファイルを作成して取得したファイル内容を書き出す。 response = requests.get(url) with open(file_name, "wb") as f: for chunk in response.iter_content(chunk_size=1024): if chunk: f.write(chunk) f.flush() #出力したファイル画像を表示する im1 = Image.open(file_name) plt.imshow(im1)
JupyterLabの画面イメージは以下のようになります。
枠で囲っている部分はご自身のAPIトークンと出力したいファイル情報に置き換えてください。
画像ファイルによってはサイズがとても大きい(数百MiB~数GiB)場合があるため注意が必要です。ファイルが大きいと表示に少し時間がかかります。
取得したファイル名で新しくファイルが作成され、JupyterLab上に画像が表示されます。
サンプルコード実行時にpillowをインストールしているのにも関わらずpillowライブラリーが見つからないとエラーが出た場合はパスを確認してください。
JupyterLab上で以下のコードを実行するとパスを確認できます。
インストールされているpillowのパスを確認します。
コマンドプロンプトやターミナルで実行する場合は先頭の!を取ってください。
/home/Ubuntu/.local/lib/python3.8/site-packagesはJupyterLabのパスに含まれていないためインストールされているにもかかわらずimport時に見つからないとエラーが出ます。
衛星データをファイル出力するサンプルコードのインポート文にpillow のパスを追加するとエラーが解決できます。
ここで追加したパスはこのファイルでのみ有効になっているため環境設定ファイルにパスを追加すると都度有効にせずにすみます。
APIドキュメント上での確認方法
Traveler APIはTellus Satellite Data Traveler APIで確認できます。
また、各APIの動作についてTellus Satellite Data Traveler API上で確認することもできます。
APIドキュメント上で確認する場合は、アカウントに紐づいたCookie認証により、APIトークン認証を有効にする必要があるため、tellusにログインしていないブラウザまたはシークレットモード等で行ってください。
Tellusのサービス(OS・Market・Traveler)にログインしていない状態でドキュメント右上の「Authorize」ボタンをクリックします。
「Available authorizations」の「Value:」欄に先ほど生成したAPIキーを入力し、「Authorize」をクリック、「Close」ボタンをクリックしポップアップを閉じます。
使用したいAPI を選択し、表示されている「Try it out」ボタンをクリックしてください。
するとAPIによってParametersやRequest bodyが入力できるようになるので適切に編集し、「Execute」ボタンを押すと呼び出し結果が表示されます。
リクエストとレスポンスは以下のように表示されます。こちらは一例です。
まとめ
以上、Traveler APIを利用し、シーンを検索して衛星データをダウンロードする方法を紹介しました。
他にもいろいろなTraveler APIがありますので実際に触ってみて下さい。