宙畑 Sorabatake

Tellusの使い方

【ゼロからのTellusの使い方】提供元オリジナルデータを取得する

本記事では、提供元オリジナルデータ(標準処理データや高次処理プロダクトなど)とは何か、実際にデータを取得する方法をご紹介します。

本記事では、提供元オリジナルデータ(標準処理データや高次処理プロダクトなど)とは何か、実際にデータを取得する方法をご紹介します。

提供元オリジナルデータとは

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])
Credit : Original data provided by JAXA

以上が、Tellusの開発環境で提供元オリジナルデータを取得する方法のご紹介でした。

PALSAR-2のデータ以外にも様々な衛星データを提供元オリジナルデータとして公開していく予定です。また、データを解析するツールも今後公開していく予定です。
楽しみにお待ちください。

参考資料

陸域観測技術衛星(ALOS-2) PALSAR-2 レベル 1.1/1.5/2.1/3.1 プロダクトフォーマット説明書 (CEOS SAR フォーマット)