Sentinel2で衛星画像タイルを作成する（１）衛星画像ダウンロード編


Sentinel2 の衛星画像を使い衛星画像タイルを作成してみたので、何回かに分けて書いてみます。

まずこの記事では衛星画像を取得する Python ライブラリの [sentinelsat](https://github.com/sentinelsat/sentinelsat) について解説します。


1. `sentinelsat`で衛星画像をダウンロードしてみる。
1. `sentinelsat`での条件にあった衛星画像を取得するクエリの書き方。



## sentinelsat で衛星画像ダウンロード

### 1. Copernicus Open Access Hub でユーザー登録

まず、衛星画像をダウンロードするために、Copernicus Open Access Hub にアクセスしユーザー登録をします。「Sign up」をクリックしてユーザー登録をして下さい。

[https://scihub.copernicus.eu/dhus/#/home](https://scihub.copernicus.eu/dhus/#/home)

![スクリーンショット 2021-06-10 13.14.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142797/ef45f438-3911-c274-1099-319cc05668cf.png)

ユーザー名とパスワードを `sentinelsat` で指定して衛星画像をダウンロードするので、忘れないようにメモしておいて下さい。

#### Sentinel2のプラットフォームについて

ちなみにSentinel2の画像をダウンロードできるプラットフォームは色々ありますが、[esa](http://www.esa.int/) が運営しているプラットフォームは「Copernicus Open Access Hub」です。

「SentinelHub」など民間企業が運営している似たようなプラットフォームがあるので間違わないように気をつけて下さい。


### 2. sentinelsat で衛星画像をダウンロード

衛星画像のダウンロードに必要なライブラリをインストールします。

```bash
$ pip install sentinelsat
$ pip install matplotlib
$ pip install shapely
```

`main.py` を作成して 必要なライブラリをインポートして下さい。

```python
# 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/](https://www.keene.edu/campus/maps/tool/)

![スクリーンショット 2021-06-10 13.41.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142797/12869e1f-c7aa-f6db-b1e2-1f419a36e51b.png)

GeoJSONを作成します。

```python
# 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`でパラメーターを指定して、衛星画像をダウンロードできます。

```python
# 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


詳しくは公式ドキュメントをご参考ください。

[https://sentinelsat.readthedocs.io/en/stable/api_reference.html#sentinelsat.sentinel.SentinelAPI.query](https://sentinelsat.readthedocs.io/en/stable/api_reference.html#sentinelsat.sentinel.SentinelAPI.query)


#### processinglevel

クエリのパラメーターの中に、`processinglevel` がありました。耳慣れない言葉ですが、衛星画像の処理レベルのことです。

今回は 'Level-2A' を指定していますが、

> ここで取得するSentinel-2のプロダクトレベルは，L1-2Aを要求しています．
これは，衛星画像の位置合わせを終えたL-1Cレベルに，大気のゆらぎ（モヤ）を補正した画像になります．

[人工衛星（Sentinel-2)の観測画像をAPIを使って自動取得してみた． - Qiita](https://qiita.com/nigo1973/items/e905959b6167ee1074d9) より引用

詳しく、衛星画像の処理レベルについて知りたい場合は、以下をご参考ください。

https://sentinel.esa.int/web/sentinel/missions/sentinel-2/data-products

## まとめ

今回は衛星画像のダウンロードまでをやってみました。また、続編として指定した期間の中で、1番雲が少ない画像を取得する方法や、ダウンロードした画像をタイルに変換する方法を書こうと思います。

## 参考

https://sorabatake.jp/9987/

https://qiita.com/nigo1973/items/e905959b6167ee1074d9