欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python landsatxplore下载Landsat8和Sentinel-2数据

程序员文章站 2022-07-12 23:49:15
...

说明:
1、通过landsatxplore进行query和download,需要在earthexplore网站注册
2、查询需要landsat8和sentinel-2的轨道文件,轨道文件与查询范围相交查询影像,landsat8的轨道文件网上较多,sentinel-2的轨道文件在另一篇博客中有提供下载地址(下载为kml,可转为shapefile文件)
3、参数:数据集名称(按规定填)、开始时间+结束时间(年-月-日格式)、云量、查询范围(shapefile文件,只查询第一个面要素)、存储文件夹(自定义,会在文件夹下按照年份再建一层文件夹,不想要可直接改掉)
4、代码逻辑:读取查询范围和轨道文件进行相交分析,得到轨道中心经纬度,加上数据集、时间、云量进行查询,查询结果的ID存储在列表中,根据ID列表一个个下载。
5、补充:虽然Sentinel-2查询输入的数据集是Sentinel2A,但是2A和2B都可查询得到。

import os,sys
from landsatxplore.api import API
from landsatxplore.earthexplorer import EarthExplorer
import geopandas as gpd
import warnings
warnings.filterwarnings(action="ignore")

username = 'username'  # 输入EE账号
password = 'password'  # 输入账号密码
# 初始化API接口获取key
api = API(username, password)

# 影像查询
def search_image(search_file,dataset,start_date,end_date,max_cloud_cover):
    # 输入要查询的边界
    data = gpd.read_file(search_file)
    # 输入轨道矢量
    if dataset.lower() == "sentinel_2a":
        grid_file = 'E:\*****\sentinel2_grid.shp'
    elif dataset.lower() == "landsat_8_c1":
        # 输入landsat轨道矢量
        grid_file = 'E:\*****\WRS2_descending.shp'
    wrs = gpd.GeoDataFrame.from_file(grid_file)
    # 查询边界覆盖的轨道中心坐标
    wrs_intersection = wrs[wrs.intersects(data.geometry[0])]
    longitude = (wrs_intersection.centroid).x.values
    latitude = (wrs_intersection.centroid).y.values
    # print(longitude, latitude)

    # 查询
    all_scene = []
    for i in range(len(latitude)):
        scenes = api.search(dataset=dataset,latitude=latitude[i],longitude=longitude[i],
        start_date=start_date, end_date=end_date, max_cloud_cover=max_cloud_cover)
        all_scene += scenes
    api.logout()
    return all_scene

# 下载影像数据
def Download_from_Landsatexplore(dataset,scene_list):
    if len(scene_list) > 0:
        # 根据ID下载影像
        for scene in scene_list:
            if dataset.lower() == "landsat_8_c1":
                output_dir = 'E:\***\Landsat8'# 输入下载路径
            elif dataset.lower() == "sentinel_2a":
                output_dir = 'E:\***\Sentinel2'  # 输入下载路径
            output_dir_demon = output_dir+'\\'+str(scene['acquisition_date'].year)
            if not os.path.isdir(output_dir_demon):
                os.mkdir(output_dir_demon)
            ee = EarthExplorer(username, password)
            print("Downloading: "+scene['display_id'])
            ee.download(identifier=scene['entity_id'], output_dir=output_dir_demon)
        ee.logout()

if __name__ == '__main__':

    """Landsat 5 TM Collection 1 Level 1-->landsat_tm_c1
        Landsat 5 TM Collection 2 Level 1-->landsat_tm_c2_l1
        Landsat 5 TM Collection 2 Level 2-->landsat_tm_c2_l2
        Landsat 7 ETM+ Collection 1 Level 1-->landsat_etm_c1
        Landsat 7 ETM+ Collection 2 Level 1-->landsat_etm_c2_l1
        Landsat 7 ETM+ Collection 2 Level 2-->landsat_etm_c2_l2
        Landsat 8 Collection 1 Level 1-->landsat_8_c1
        Landsat 8 Collection 2 Level 1-->landsat_ot_c2_l1
        Landsat 8 Collection 2 Level 2-->landsat_ot_c2_l2
        Sentinel 2A-->sentinel_2a"""
    # 输入查询条件
    dataset = sys.argv[1]#'landsat_8_c1' # 数据集
    start_date = sys.argv[2]#'2021-05-01' # 开始日期
    end_date = sys.argv[3]#'2021-05-20' # 结束日期
    cloud_cover = sys.argv[4]#15 # 云量(%)
    # 输入查询文件
    search_file = sys.argv[5]#r'E:\***\北京市.shp'  # 输入查询矢量

    # 查询数据
    search_list = search_image(search_file, dataset, start_date, end_date, cloud_cover)
    # print(search_list[0])
    # 下载数据
    Download_from_Landsatexplore(dataset, search_list)