AWSから衛星画像Landsat8のデータを大量にダウンロードする方法


背景

衛星画像と深層学習を使用して、湖水のクロロフィル濃度を推定する研究行っています。
最近では、衛星画像から物体検出のアルゴリズムで深層学習が使われていることがあるようですが、
深層学習にはとにかく大量のデータが必要!今回使用する衛星画像データは、AWS からダウンロードしてきました。AWSで提供されているLandsat8のデータは、L1プロダクトでGeotiff形式です。Geotiff形式なので、緯度経度からピクセルの値(DN値)を抽出できます!その方法はまた別の記事衛星画像から緯度経度を指定してその地点からピクセル値を抽出する方法にのってます!
今回はまず、大量にトレーニング用のデータをダウンロードするプログラミングについて、自分のために( ..)φメモとしてと、同じように衛星画像データ大量に欲しい人向けにこの記事を書きます!

AWSのLandsat8のデータダウロード先URL

Landsat8のデータは、↓のように、1つのURL先にいくつかのファイルが掲載されていますが、それはある1日で取得した衛星画像のデータすべてです。(バンド1~11の画像データと、メタファイルとBQAファイルというものなど)

詳しい話は割愛しますが、自分が欲しい場所の衛星画像は、Path と Row を指定して検索できます。
詳しくはこちら。→Accessing Landsat on AWS
まず、自分の欲しい場所と日にちのデータのURLリストを作成してください。
こんな感じ。
これをURL.csvとします。

今回のプログラミング

download.py
import os
import wget

#ダウンロード先のディレクトリPath作成
download_dir = 'D:/landsat8/'
#
extensions = ['_B1.TIF', '_B2.TIF', '_B3.TIF', '_B4.TIF', '_B5.TIF', '_B6.TIF', '_B7.TIF', '_B8.TIF',
              '_B9.TIF', '_B10.TIF', '_B11.TIF', '_BQA.TIF', '_MTL.txt']

with open("D:/URL.csv") as URL:
    #readlines で、URLを1行ずつリストに格納
    URLs = URL.readlines()
    for URL in URLs:
#for文で、1URLごとすべてのファイルを、ディレクトリをわけて格納
#(1URLごとに1ディレクトリ作成。その中にバンド1~11,BQA,metafileをダウンロード格納)
        for i in extensions:
            r = URL.split('/')
            name = r[8]
            html = URL.find("index.html")
            new_dir = download_dir + name
            if os.path.isdir(new_dir) == False:
                os.mkdir(new_dir)
            url = URL[0:html] +name+i
            print(url)
            wget.download(url=url, out=new_dir)

これで、↓みたいにシーン毎のフォルダが作成され、その配下にバンド別の衛星画像データがダウンロード格納されます。

ちなみに、これ全部ダウンロードするのに時間めっちゃかかります。普通のパソコンだと3日ぐらいかかるんじゃないかな??研究用のサーバ使用したけどそれでも1日はかかったかな?

今回便利だったモジュールやメソッド

wget
wget は、LinuxをはじめとするUNIX系のOSで多く利用されているHTTP, HTTPS, FTP, FTPSといったプロトコルを使用し、インターネット上のファイルを取得できるコマンドですが、Pythonでもモジュールがあります!Linuxのwgetコマンドのように、便利なオプションはあまりないようですが、十分使えます。例えば、
Linuxコマンドだったら、URL先にいくつかファイルがあって、その中の指定の拡張子だけのファイルをダウンロードしたい場合は、オプションで簡単に指定してwgetでダウンロードできます。Pythonじゃあそんなことできないためめんどくさいプログラミングを👆でしてるわけなんですよ。

readlines()
ファイルの内容を読みだす時に活用するメソッドで、似たようなのにread, readlineがあります。
それぞれの違いはリンク先で確認お願いいたします。

find()
指定した文字列の位置を取得する方法です。

OSモジュール

osモジュールは、OSに依存しているさまざまな機能を利用するためのモジュールです。
主にファイルやディレクトリ操作が可能で、ファイルの一覧やpathを取得できたり、新規にファイル・ディレクトリを作成することができます

終わりに

以上、長くなりましたが、これでAWSから大量に衛星画像データをダウンロードできるはずです。
もっと良い方法あったら教えてください^^/