Sentinel2 の衛星画像を使い衛星画像タイルを作成してみたので、何回かに分けて書いてみます。
まずこの記事では衛星画像を取得する Python ライブラリの sentinelsat について解説します。
-
sentinelsat
で衛星画像をダウンロードしてみる。 -
sentinelsat
での条件にあった衛星画像を取得するクエリの書き方。
sentinelsat で衛星画像ダウンロード
1. Copernicus Open Access Hub でユーザー登録
まず、衛星画像をダウンロードするために、Copernicus Open Access Hub にアクセスしユーザー登録をします。「Sign up」をクリックしてユーザー登録をして下さい。
https://scihub.copernicus.eu/dhus/#/home
ユーザー名とパスワードを sentinelsat
で指定して衛星画像をダウンロードするので、忘れないようにメモしておいて下さい。
Sentinel2のプラットフォームについて
ちなみにSentinel2の画像をダウンロードできるプラットフォームは色々ありますが、esa が運営しているプラットフォームは「Copernicus Open Access Hub」です。
「SentinelHub」など民間企業が運営している似たようなプラットフォームがあるので間違わないように気をつけて下さい。
2. sentinelsat で衛星画像をダウンロード
衛星画像のダウンロードに必要なライブラリをインストールします。
$ pip install sentinelsat
$ pip install matplotlib
$ pip install shapely
main.py
を作成して 必要なライブラリをインポートして下さい。
# manin.py
import os
from sentinelsat import SentinelAPI, read_geojson, geojson_to_wkt
import matplotlib.pyplot as plt
from shapely.geometry import MultiPolygon, Polygon
2.1. 衛星画像を取得したい範囲のGeoJSONを作成
衛星画像を取得したい範囲の緯度経度を取得し、GeoJSONを作成します。
キーン州立大学が公開しているツールを使い緯度経度を取得します。
https://www.keene.edu/campus/maps/tool/
GeoJSONを作成します。
# manin.py
# 衛星画像取得する範囲を指定
AREA = [
[
139.0240751,
36.1879383
],
[
139.0570341,
34.7880413
],
[
140.8093534,
34.8060848
],
[
140.8642851,
36.1591156
],
[
139.0240751,
36.1879383
]
]
from geojson import Polygon
m=Polygon([AREA])
# GeoJSON ファイルを出力
object_name = 'Tokyo_Bay'
import json
with open(str(object_name) +'.geojson', 'w') as f:
json.dump(m, f)
footprint_geojson = geojson_to_wkt(read_geojson(str(object_name) +'.geojson'))
2.2. 衛星画像をダウンロード
SentinelAPI.query
でパラメーターを指定して、衛星画像をダウンロードできます。
# manin.py
# Copernicus Open Access Hub のユーザー情報を設定
user = '自分のユーザー名を貼り付け'
password = '自分のパスワードを貼り付け'
api = SentinelAPI(user, password, 'https://scihub.copernicus.eu/dhus')
# 衛星画像を取得する条件を指定
products = api.query(footprint_geojson,
date = ('20200608', '20210608'), #取得希望期間の入力
platformname = 'Sentinel-2',
processinglevel = 'Level-2A',
cloudcoverpercentage = (0,100)) #被雲率(0%〜100%)
# 衛星画像のメタデータ
product = list(products.values())[0]
# ダウンロード
api.download(product['uuid'])
上記のコードを main.py
に追加しターミナルで以下を実行すると、ダウンロードが始まります。
$ python main.py
クエリの指定の仕方
SentinelAPI.query
で条件を指定してクエリを書くことが出来ます。
パラメーター
-
date: 検索する期間
yyyyMMdd
yyyy-MM-ddThh:mm:ss.SSSZ (ISO-8601)
yyyy-MM-ddThh:mm:ssZ
NOW
NOW-<n>DAY(S) (or HOUR(S), MONTH(S), etc.)
NOW+<n>DAY(S)
yyyy-MM-ddThh:mm:ssZ-<n>DAY(S)
NOW/DAY (or HOUR, MONTH etc.)
-
order_by
-
limit
その他にも以下のドキュメントにあるキーワードパラメーターとして使えます。
- platformname: 衛星の名前
- 例
- platformname:Sentinel-1
- platformname:Sentinel-2
- platformname:Sentinel-3
- platformname:Sentinel-5 Precursor
- 例
- cloudcoverpercentage: 被雲率(0%〜100%)
- cloudcoverpercentage:95
- cloudcoverpercentage:[0 TO 5]
- processinglevel: 衛星画像の処理のレベル
- Level-1C
- Level-2A
詳しくは公式ドキュメントをご参考ください。
processinglevel
クエリのパラメーターの中に、processinglevel
がありました。耳慣れない言葉ですが、衛星画像の処理レベルのことです。
今回は 'Level-2A' を指定していますが、
ここで取得するSentinel-2のプロダクトレベルは,L1-2Aを要求しています.
これは,衛星画像の位置合わせを終えたL-1Cレベルに,大気のゆらぎ(モヤ)を補正した画像になります.
人工衛星(Sentinel-2)の観測画像をAPIを使って自動取得してみた. - Qiita より引用
詳しく、衛星画像の処理レベルについて知りたい場合は、以下をご参考ください。
まとめ
今回は衛星画像のダウンロードまでをやってみました。また、続編として指定した期間の中で、1番雲が少ない画像を取得する方法や、ダウンロードした画像をタイルに変換する方法を書こうと思います。
参考