LoginSignup
6
4

More than 1 year has passed since last update.

Pythonで人工衛星画像を扱う:Sentinel Hub APIのコードを作成して、衛星画像をダウンロードしましょう

Posted at

イントロ

image.png
今回の記事には、SentinalというのESA(欧州宇宙機関)の人工衛星の画像を取得して、イギリスのKeyGardens(キューガーデン)を表示してみます。すべてのコードはcolabとgithubでアップしましたので、ぜひ使ってください
(Colabのリンク Githubのリンク)
image.png

APIの鍵を取得

最初は、API鍵を取得することは必要です。このために、SenteinelHubでアカウントを作れなければなりません。メールよるアカウント確認が必要なので、したメールボックスをチェックしてください。アカウント確認した後、無料のトライアルが始められます。
image.png
ログインして、AuthClientのボタンをして、APIが鍵を作れます。作成した後で、IDと鍵のコードをメモしてください。
image.png

PythonでSentinelhubをセットアップする

SentinelhubはPythonのモジュールがあります。インストールした後で、Sentinelの人工衛星画像を取得できます。

pip3 install sentinelhub 

次、PythonでSentinelhubをセットアップしましょう。最初にSHConfigという関数をインポートして、前に取得したAPI画像の情報を記入しまます

from sentinelhub import SHConfig
config = SHConfig()
config.sh_client_id="{OAuth ID }"
config.sh_client_secret="{OAuth secret key}"
if not config.sh_client_id or not config.sh_client_secret:
    print("Warning! To use Process API, please provide the credentials (OAuth client ID and client secret).")

API鍵を安全に扱い

image.png

.envというファイルを作成して、IDとSecretという変数では、APIのIDと鍵のコードを記入してください

ID=”"{OAuth ID }"
Secret="{OAuth secret key}"

次は、Pythonで「python-dotenv」というモジュールを利用して、このファイルは読み込めんで、変数は環境変数に設定してみます。

!pip3 install python-dotenv
from dotenv import load_dotenv
import os 
load_dotenv(".env")

そして、前にコードを同じようなSHconfigではAPI鍵を設定します。しかし、今回、os.environを利用して、鍵はコード内で表示しません。

from sentinelhub import SHConfig
config = SHConfig()
config.sh_client_id=os.environ["ID"]  
config.sh_client_secret=os.environ["Secret"] 
if not config.sh_client_id or not config.sh_client_secret:
    print("Warning! To use Process API, please provide the credentials (OAuth client ID and client secret).")

人工衛星画像をダウンロードする

対象範囲

人工衛星画像をダウンロードするために、最初にステップは何の座標範囲で画像を取得したいですか?緯度経度の座標が必要ですこそのために、Geojson.ioというサイトはとても役に立っています。下記にロンドンのKeyGardens(キューガーデン)の範囲を調べました。二つの点を設定して、緯度経度をメモしました。
image.png
次はこの緯度経度はSentinalhubで利用できる形式に変換します。sentinelhubのモジュールからBBoxとCRS(座標系)という関数をインポートして、target_bbox(対象範囲)という変数を作ります。次は、対象範囲はピクセルサイズに変換します。このために、解像度が必要です。今回 2m解像度を設定して、 bbox_to_dimensionsの関数に入り込み、ピクセルサイズを変換できます。

from sentinelhub import  CRS,BBox, bbox_to_dimensions
target_coords = [  
                 -0.3273582458496094,
          51.45892724311225, 
       -0.2847862243652344,
          51.48801054716568
        ] #WGS84
res=2
target_bbox= BBox(bbox=target_coords,crs=CRS.WGS84)
target_size= bbox_to_dimensions(target_bbox,resolution=res)

print(f'Image shape at {res} m resolution: {target_size} pixels')
#$Image shape at 2 m resolution: (1418, 1671) pixels

データのダウンロード

Sentinelhubからダウンロードするために、最初にデータの要求(sentinelHubRequest)を作れなければなりません。これは、evalscriptというjavaで書いていた人工衛星のバンドの情報を取り込んで、人工衛星の名前と時間時期と対象範囲の情報を記入した後で、データが存在している場合はダウンロードできます。

image.png

evalscriptはJavaで書かれていますが、バンド情報を表現する簡単な関数です。人工衛星画像は、RGBだけではなくて、いろいろな波長のデータを含めれます。今回 Sentinel-2 L1CのRGBのバンドを取得したいです。実はこの人工衛星は13バンドがあり、もっと情報を調べてみたい場合は、このリンクを確認してください。

evalscript_true_color="""
 //VERSION=3

    function setup() {
        return {
            input: [{
                bands: ["B02", "B03", "B04"]
            }],
            output: {
                bands: 3
            }
        };
    }

    function evaluatePixel(sample) {
        return [sample.B04, sample.B03, sample.B02];
    }
"""

次は、SentinelHubRequestを作りました。最初に上記のevalscriptを入り込み、人工衛星の入力データを設定します。SentinelHubRequest.input_data内で、data_collectionでは、希望の人工衛星を記入して、次は希望の時間時期(time_interval)を設定しています。最後にmosaicking_orderを設定しています。この設定は、leastCCを設定すると、なるべく雲量が少ない画像を作ります。入力のデータを設定した後で、希望のファイル式はresponsesで設定しています。今回普通のRBGの画像が欲しいので、PNGの式を設定します。最後に、前に設定した対象範囲とAPI鍵の変数を記入します。

from sentinelhub import  MimeType,SentinelHubRequest, SentinelHubDownloadClient, \
    DataCollection, DownloadRequest

request_true_color = SentinelHubRequest(
    
    evalscript=evalscript_true_color,
    
    input_data=[
        SentinelHubRequest.input_data(
            data_collection=DataCollection.SENTINEL2_L1C,
            time_interval=('2020-12-1', '2020-12-30'),
            mosaicking_order='leastCC', #mostRecent leastRecent 
        )
    ],
 
    responses=[
        SentinelHubRequest.output_response('default', MimeType.PNG)
    ],

    bbox=target_bbox, #Target area 対象範囲
    size=target_size, #Resolution 解像度
    config=config 

)

そして、次はこの要求で、「.get_data()」を加えると、画像をダウンロードします。

rue_color_imgs = request_true_color.get_data()

画像を表示

データをダウンロードした後で、pythonで表示しましょう。また、データを正規化し、より見やすくするために明るくしました。

import matplotlib.pyplot as plt
plt.imshow(true_color_imgs[0]*3.5/255)
plt.axis(False)

image.png
image.png
image.png
自分の画像をダウンロードしましたか?

ツイッターで結果を発表してください (@jarvissan22

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4