見出し画像

Sentinel HUB 1: APIのコードを作成して、衛星画像をダウンロードしましょう (日本語版)

SENTINEL HUB APIのコードを作成する

Sentinel hubは30日間の無料のトライルを提供されて、それは、人工衛星画像のデータを扱うために、素晴らしいです。しかし、Pythonでコードを書くする前に、最初にアカウントとAPIのコードを作成しなければなりませんね。

Sentinel hubは、30日間の無料のトライアルを提供しており、人工衛星画像データの扱い方を知る良い機会になります。但し、このトライアルを実際に試すには、最初にアカウントとAPIのコードを作成しなければなりません。そのあとで、Pythonでデータをダウンロードしてみましょう。すべてのコードはGithub(JarvisSan22/JC_learn_python_Notebooks )でノートブックからロードできます (Link) 。そして、この記事は英語版がありますので、英語でコードを学びたい方は、ぜひ見てください(英語版)

画像1

1)アカウントを作成しましょう


最初にこのリンクをSentinelhubへ行き、アカウントを作成します。メールよるアカウント確認が必要なので、したメールボックスをチェックしてください。アカウント確認した後、無料のトライアルが始められます。

スクリーンショット 2021-10-31 084407

2) APIの鍵を作成

次に、ログインする鍵を作成するために、OAtuh Clinetを作りましょう。Sentinelhubのページで「create new」を押し、名前を記入した後、作成したOAuthの秘密の鍵をメモしてください。作成後、OAuthClientsの後ろに、あなたのClinetIDを示しています。それをもメモしてください

スクリーンショット 2021-10-31 084422

スクリーンショット 2021-10-31 084431

スクリーンショット 2021-10-31 084440

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

PythonでSentinelhubをセットアップしましょう。そログの付随しいるcolab notebook(リンク)や自分の環境をロードしてください。最初に、 pip3のインストールを行って、SHconfigでは、前に作成したIDや秘密鍵を記入してください

pip3 install sentinelhub 
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).")

もっと安全のように秘密鍵を扱い

秘密鍵を安全に保存するために、一般的に、自分の環境のディレクトリに保存して、Pythonでそのファイルの変数を読み込みます。Colabの環境には、その秘密の情報は、goolgedocsで.docsのファイルより保存してから、Colabでドライブを接続して、その秘密の情報のファイル名の拡張子を .docsから .envへ変換します。

sentinalhub.envの例

ID=”"{OAuth ID }"
Secret="{OAuth secret key}"
from google.colab import drive 
drive.mount('/content/drive')
!pip3 install python-dotenv
from dotenv import load_dotenv
import os 
load_dotenv("/content/drive/MyDrive/Accounts/sentinalhub.env")

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).")

スクリーンショット 2021-10-31 084452

4) 対象範囲を設定


最初にSentinelhubから三つの関数をインストールします。 BBox, CRS、 bbox_to_dimensions. 
BBoxは、画像の対策範囲を設定して、範囲の座標(その座標はGeojsonのサイトに簡単に作成できます)とcrsの座標系を入力しています

CRSBBoxのcrsには使用します。標準の緯度経度の座標系は CRS.WGS4 です。

bbox_to_dimesions はその対象範囲はピクセルに変換されています。そこで、画像の解像度を設定されています。

画像7

target_coords = [  
                -0.3273582458496094,
         51.45892724311225, 
      -0.2847862243652344,
         51.48801054716568
         
       ] #WGS84
res=2  #10  20 60 80
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')

5) データのダウンロード

最初にJavaでEvalscriptを作成します。これは、imangeのバンドを読み込むJavaの関数です。通常のカラーの画像のために、B02(青)、B03(緑)、B04(赤)というバンドを使用します。RGB画像とは逆の順番になっています。

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という関数を使用し、画像要求リクエストを作成しますを作成します。最初に、Evalscriotsを加えて、希望の人工衛星と時間 期間 とモザイク(mosaicking_order)を設定します。この例では、SENTINEL2_L1C のデータを使用し、DataCollectionからダウンロードします。 mosaicking_orderの設定は、希望の時間期間に、なるべく雲量が少ない画像から、モザイクのような画像を作成するのに使います。

次に、Responsesを設定します。そこでは、希望の画像の出力を設定できます。ここでの例では、通常のカラー画像が欲しいだので、MimeTypeを使用し、PNGを設定されています。

その後、bboxという対象範囲(target_box)とsizeという画像の解像度(target_size)とSenitnehubの資格情報を記入します。

最後に、{}.get_data()をつけて、SentinelHubRequestを実行して、データをダウンロードします。

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 

)


true_color_imgs = request_true_color.get_data()

6) プロットをしましょう。


最後にMatplotでデータを表示しましょう。得られた画像を見やすくするために、私の場合は 3.5/255を掛け算します。それは、データを正規化して、等しくに明るさを増す動作をします。

最後にMatplotでデータを表示しましょう。得られた画像を見やすくするために、私の場合は 3.5/255を掛け算します。それは、データを正規化して、等しくに明るさを増す動作をします。最後に、 SentinelHubRequest で時間時期を変更して、3月、6月、9月、12月のデータを読み出した。どれがどれか推測できますか?分かった人は、この記事にコメントをしてください。

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

スクリーンショット 2021-10-31 085516

スクリーンショット 2021-10-31 085526

そして、綺麗な画像だけほしくなくて、人工衛星画像の解析により、バンドの値の範囲を調べたいです。画像の素材を知りたいです。このために、ヒストグラムを作成しましょう。

画像10

この急なプロットから、明瞭に色のバンドを低い値できつくグループされています。これは、上記の画像では、見やすくなるために、補正が必要でした。それを直すために、0-255の値の範囲に広げるために、複数の手法があります。その手法は英語で「equalization」といって、日本語で「平坦化」といます。それはあなたたちの宿題です。あなたの補正された画像や手法は、私のTweet(@JarivsSan25)へ送ってお願いいたします。

最後まで読んでありがとうございました。この投稿は英語版があり、興味があれば、ぜひ見えてください。

https://jarvisjapan.com/2021/09/08/sentinel-hub-1create-a-api-key-and-basic-download-english/


この記事が気に入ったらサポートをしてみませんか?