STAC APIとPythonで衛星データの取得を行う
前回、Sentinel-2のデータはAWS経由で取得しよう、という事を書きました。
この記事の中では、データの検索機能が一切ない、という事を書きましたが、後になって検索機能というものを見つけました。
STAC APIというもの
STACとは SpatioTemporal Asset Catalog (STAC)の事を言いまして、衛星データのカタログのフォーマット仕様となっています。
ここから自分の望む衛星データを取得する事が出来ます。
ここでSentinel-2などの光学衛星のデータは撮影する日の条件によって、画像に雲がかかっている場合があったりします。
撮影エリアの天気が曇りだったり雨だったりすれば、その部分の地表は見えません。
これが結構重要でして、撮影画像に対する雲量の率が高ければ、データとして使える可能性は低くなります。
なので、雲量がどれぐらいあるか?というのは画像検索の際に重要なポイントとなります。
当初、私はSTACを知らないでいたので、自力でSentinel-2のタイルを検索してデータを取得しようとしていて、雲量をキーに検索するにはどうしたら良いか、と調べていたらSTAC APIを知ったのでした。
https://registry.opendata.aws/sentinel-2-l2a-cogs/
例えば、上のように後から見れば「STAC」というキーワードはいくつも書かれていますが、STACについての説明がある訳では無いです。
個人的にはこの辺をちゃんと解説して欲しい、というのはありますね。
STAC APIを使えば雲量などの検索条件が使えます
Pythonであればpystac-clientが使えます。
from pystac_client import Client
# api version0
# stac_api = "https://earth-search.aws.element84.com/v0"
# api version1
stac_api = "https://earth-search.aws.element84.com/v1"
# クライアントの初期化
client = Client.open(stac_api)
aoi = {
"coordinates": [
[[minx, miny], [minx, maxy], [maxx, maxy], [maxx, miny], [minx, miny]]
],
"type": "Polygon"
}
time_range = f"{datefrom}T00:00:00+09:00/{dateto}T23:59:59+09:00"
# 検索条件の設定
search = client.search(
# collections=["sentinel-s2-l2a-cogs"], # api version 0 Sentinel-2のCOGデータ
collections=["sentinel-2-l2a"], # api version 1 Sentinel-2のCOGデータ(v1エンドポイント)
datetime=time_range, # 指定期間
query={
"eo:cloud_cover": {"lt": cloudcover} # 雲量が10%未満
},
intersects=aoi, # AOIと交差するアイテム
limit=500 # 取得するアイテムの最大数
)
サンプルコードはこんな感じになるかと思います。
pystacを使う上で気を付ける点
私もpystac-clientを使っていて気づいたのですが、エンドポイントが2023年現在では新しくなってきています。
ネット上の文献ではhttps://earth-search.aws.element84.com/v0のエンドポイントを使っている例がありましたが、Sentinel-2のデータについては2023/5以降のデータはv0のエンドポイントからは取得できませんでした。
↑この辺とかはv0を使っているので、古いデータであれば取得できますが、最新のデータは取得できないかと思います。
詳細を調べた訳では無いですが、
https://earth-search.aws.element84.com/v1という新たなAPIエンドポイントが出来ているようです。
v0からv1に対応するためにはコードの修正が少し必要となります。
一番大きいのは"sentinel-s2-l2a-cogs"から"sentinel-2-l2a"に代わっていたりするので、その辺に気をつけましょう。
古い名前で検索しても検索件数が0件となるだけで、pystacからはエラーが出るわけでは無いので見落とす可能性があります。
pystacを使って何をしているのか
自分はpystacを使って、NDVIの計算を行って結果をサーバ上に保管しています。それを自前のクライアントソフトを用いて閲覧するようにしてみました。
その中でNDVIは耕作地の植生を見るのに使っていまして、専用のEO Browserを使うよりも同等かそれ以上にサクサクと動かせる環境になって来ました。
NDVI以外についてもデータを集めてみると、色々と解析データの見比べが出来るようになるので、引き続きpystacを使ってデータの蓄積をしていきたいなと思っています。
と言う訳で、地図や衛星データの情報をまとめるべくnoteのマガジンを作りました!
私が共同代表を務めているGREEN OFFSHOREでは農業向けのIoTサービスを展開しています。
そちらにも様々な情報を展開しているので、ぜひ上記リンクをクリックしてみて下さい。