【ゼロからのTellusの使い方】提供元オリジナルデータを取得する
本記事では、提供元オリジナルデータ(標準処理データや高次処理プロダクトなど)とは何か、実際にデータを取得する方法をご紹介します。
記事作成時から、Tellusからデータを検索・取得するAPIが変更になっております。該当箇所のコードについては、以下のリンクをご参照ください。
https://www.tellusxdp.com/ja/howtouse/access/traveler_api_20220310_
firstpart.html
2022年8月31日以降、Tellus OSでのデータの閲覧方法など使い方が一部変更になっております。新しいTellus OSの基本操作は以下のリンクをご参照ください。
https://www.tellusxdp.com/ja/howtouse/tellus_os/start_tellus_os.html
本記事では、提供元オリジナルデータ(標準処理データや高次処理プロダクトなど)とは何か、実際にデータを取得する方法をご紹介します。
提供元オリジナルデータとは
Tellusは衛星データプラットフォームとして様々な衛星データを提供していますが、フォーマットが大きく分けて2つあります。
一つ目は地図タイル(Webメルカトルで投影されたpng画像)というフォーマットです。
地図タイルはウェブ上で地図を扱うときに便利なフォーマットです。
もう一つは、衛星データプロバイダから提供を受けたままのデータです。
一度に広い範囲のデータを扱ったり、位置精度が必要な解析をするにはこちらのデータ形式がおすすめです。
2020年2月時点で公開されているデータは以下の3種類です。
- ・PALSAR-2 L1.1(CEOSフォーマット)
- ・PALSAR-2 L2.1(GeoTiff)
- ・AVNIR-2オルソ補正(GeoTiff)
LX.Xという形式で処理レベルが表現されるデータはどちらもJAXAが作成する標準処理データと呼ばれるものです。
標準処理データや高次処理プロダクトとは何かや、L1.1などの意味については、以下の記事で詳しく説明しているのでご覧ください。
【図解】衛星データの前処理とは~概要、レベル別の処理内容と解説~
配信するシーンの数やデータの種類は今後順次追加していきます。
本記事はこの中でも特殊なデータ形式であるCEOSフォーマットである、PALSAR-2L1.1について説明します。
CEOSフォーマットとは
CEOSフォーマットは、各国の宇宙機関や国際機関などが国際的な協力をするために組織した地球観測衛星委員会(Committee on Earth Observation Satellites)が定めたデータフォーマットです。
バイナリデータのどの位置にどのようなデータが収められているかは、衛星やセンサごとに異なるため、既存のソフトウェアやライブラリが対応していない観測データを利用するには各データプロバイダが公開しているドキュメントを読み込む必要があります。
PALSAR-2 プロダクトフォーマット説明書(JAXA)
科学者やプロ向けのデータで、衛星データに精通していない人が使うには少々手こずるかもしれません。
ですが、まずは提供元オリジナルデータを見てみたい!という方へ、今回はPALSAR-2 L2.1(GeoTiff)による開発環境でのデータの取得方法をわかりやすく紹介していきます。
取得方法
ファイルは次の3ステップで取得可能です。
APIはすべて開発環境からのみ利用可能です(2019年12月現在)。
ファイル検索
ファイルのメタ情報を検索します。
↓
取得URL発行
欲しいファイルのIDからファイル取得URLを発行します。
↓
ダウンロード
ファイルを開発環境でダウンロードし、保存してください。
PALSAR-2 L2.1のデータを取得しよう
ここで実際にデータを取得してみましょう。
今回はPALSAR-2 L2.1を例に取得方法を解説します。
Tellusで開発環境(Jupyter Lab)を使う方法は「Tellusの開発環境でAPI引っ張ってみた」をご覧ください。
ファイル検索(PALSAR-2 L2.1)
https://file.tellusxdp.com/api/v1/origin/search/palsar2-l21
引き数
すべて任意です。指定がない場合は何も絞り込みを行わない結果が返ります。
名称 | クエリ | サンプル | 絞り込み条件 |
検索開始時刻 | after | ISO8601 2017-10-05T15:00:00.000000+00:00 |
observation_datetimeがこれ以降なら返却する |
検索終了時刻 | before | ISO8601 2017-10-05T15:00:00.000000+00:00 |
observation_datetimeがこれ以前なら返却する。 |
偏波 | polarisations | 候補:HH, VH, VV, HV, HH+HV, VV+VH, HH+HV+VV+VH | 文字列で指定した組み合わせの観測を行っているデータセットを返す |
観測モード | code | 候補:SBS,UBS,UBD,HBS,HBD,HBQ,FBS, FBD,FBQ,WBS,WBD,WWS, WWD,VBS,VBD |
完全一致 |
観測方向 | observation_direction | 候補:R,L | 完全一致 |
軌道方向 | orbit_direction | 候補:A,D | 完全一致 |
ビーム番号 | beam_number | 候補:U2-6, …, | 完全一致 |
パス番号 | path_number | int | 完全一致 |
フレーム番号 | frame_number | int | 完全一致 |
運用モード | mode | 候補:SM-1, …, | 完全一致 |
検索範囲 | left_bottom_lon | デフォルト:-180 | バウンディングボックスが一部でもこの範囲に含まれていれば返却する。 |
right_top_lon | デフォルト:180 | ||
left_bottom_lat | デフォルト:-90 | ||
right_top_lat | デフォルト:90 | ||
返却数 | page_size | デフォルト:100
最大:1000 |
|
カーソル | cursor | ページネーション時に利用する |
APIはメタ情報の配列を返します。
返り値のメタ情報
名称 | プロパティ名 | 型とサンプル |
位置(四隅) | coordinates | array of float
[[左下経度, 左下緯度],[右下経度, 右下緯度],[右上経度, 右上緯度],[左上経度, 左上緯度]] |
観測開始時刻(UTC) | begin_datetime | ISO8601 |
観測終了時刻(UTC) | end_datetime | ISO8601 |
観測中心時刻(UTC) | center_datetime | ISO8601 |
軌道方向 | orbit_direction | string
D |
ビーム番号 | beam_number | string
U2-6 |
オフナディア角 | off_nadir_angle | float
29.5 |
観測モード | code | string
UBD |
観測方向 | observation_direction | string
R |
観測パス番号 | path_number | int |
中心フレーム番号 | frame_number | int
890 |
運用モード | mode | string
SM1 |
偏波 | polarisations | array of string
[HH, HV] |
dataset名 | dataset_id | Palsar2の場合、シーンID |
データセットのファイル一覧 | files | array of string
[ファイル名] Palsar2 L1.1の場合、 観測データ(geotiff)やサムネイル(jpg)、summary.txtなど |
Tellusでの公開日 | date_added | ISO8601 |
代表時刻 | observation_datetime | ISO8601 |
範囲 | bbox | [left_lon, bottom_lat, right_lon, top_lat] |
発行リンク | publish_url | ~ |
サンプルコード
import requests
from pprint import pprint
TOKEN = 'ここには自分のアカウントのトークンを貼り付ける'
def search_file(params={}, next_url=''):
if len(next_url) > 0:
url = next_url
else:
url = 'https://file.tellusxdp.com/api/v1/origin/search/palsar2-l21'
headers = {
'Authorization': 'Bearer ' + TOKEN
}
r = requests.get(url, params=params, headers=headers)
if not r.status_code == requests.codes.ok:
r.raise_for_status()
return r.json()
ret = search_file({'after': '2018-10-05T15:00:00'})
pprint(ret['count'])
pprint(ret['next'])
pprint(ret['items'])
トークンはマイページのAPIアクセス設定(要ログイン)から取得してください。
実行すると次のような結果が表示されます。
引き数で2018年10月15日以降のデータが返るよう指定したところ、該当するデータが表示されました。
数が100以上あったため(一度に取得できる数のデフォルト値が100、指定すれば最大1000件に変更可能)、該当するデータをすべて取得することはできませんでした。
続きを取得するにはnext_urlにnextで返されたURLを指定しましょう。
取得URL発行(PALSAR-2 L2.1)
検索で欲しいデータが見つかったら、そのデータを取得するためのURLを発行しましょう。
リクエストするたびにランダムなURLが発行されます。URLには有効期限があるので注意して下さい。
https://file.tellusxdp.com/api/v1/origin/publish/palsar2-l11/{dataset_id}
dataset_idには取得したいデータセット名(PALSAR-2の場合はシーンID)を指定します。
返り値
ISO8601
この時刻をすぎるとダウンロードURLが無効になります。
名称 | プロパティ名 | サンプル |
プロジェクト名 | project | ‘palsar2-l21’ |
データセット名 | dataset_id | Palsar2の場合、シーンID |
ダウンロード有効時間 | expires_at | |
ファイル情報 | files | [{‘file_name’: ファイル名, ‘file_size’: int, ‘url’: 発行されるランダムURL}] |
サンプルコード
def publish_files(dataset_id):
url = 'https://file.tellusxdp.com/api/v1/origin/publish/palsar2-l21/{}'.format(dataset_id)
headers = {
'Authorization': 'Bearer ' + TOKEN
}
r = requests.get(url, headers=headers)
if not r.status_code == requests.codes.ok:
r.raise_for_status()
return r.json()
published = publish_files('ALOS2217642720-180604')
pprint(published)
dataset_idに’ALOS2217642720-180604’を指定してリクエストした例です。
IDが’ALOS2217642720-180604’のシーンに含まれるファイルを取得するためのURLがファイルごとに発行されています。
ダウンロード
最後に、発行したURLからファイルをダウンロードします。
今回は先ほどリクエストした’ALOS2217642720-180604’の’’IMG-HH-ALOS2217642720-180604-UBSR2.1GUD.tif’(2番目のファイル)をダウンロードしてみます。
def download_file(url):
headers = {
'Authorization': 'Bearer ' + TOKEN
}
r = requests.get(url, headers=headers)
if not r.status_code == requests.codes.ok:
r.raise_for_status()
return r.content
def save_file(data, name):
with open(name, "wb") as f:
f.write(data)
file = download_file(published['files'][1]['url'])
save_file(file, published['files'][1]['file_name'])
print('done')
doneと表示されたら成功です(ファイルサイズが大きいので少しだけ時間がかかります)。
PALSAR-2のL2.1はGeotiffファイルなので、Pythonで簡単に読み込みと表示が可能です。
サンプルコード
from osgeo import gdal, gdalconst, gdal_array
from skimage import io
%matplotlib inline
tif = gdal.Open('IMG-HH-ALOS2217642720-180604-UBSR2.1GUD.tif', gdalconst.GA_ReadOnly)
# ファイル情報
print(tif.GetProjection())
print(tif.GetGeoTransform())
print(tif.RasterXSize, tif.RasterYSize)
print(tif.GetMetadata())
print('バンド数: {}'.format(tif.RasterCount))
# 画像表示
# 画像のサイズが27640 * 31340ピクセルと大きいため、すべてを一度に表示することができません。
# サンプルでは部分的に表示しています。
io.imshow(tif.GetRasterBand(1).ReadAsArray()[10000:11000, 10000:11000])
以上が、Tellusの開発環境で提供元オリジナルデータを取得する方法のご紹介でした。
PALSAR-2のデータ以外にも様々な衛星データを提供元オリジナルデータとして公開していく予定です。また、データを解析するツールも今後公開していく予定です。
楽しみにお待ちください。
【図解】衛星データの前処理とは~概要、レベル別の処理内容と解説~
参考資料
陸域観測技術衛星(ALOS-2) PALSAR-2 レベル 1.1/1.5/2.1/3.1 プロダクトフォーマット説明書 (CEOS SAR フォーマット)