通过google数据云自动下载lansat7、8一级数据

tech2025-12-12  7

摘要:针对通过usgs官网下载需要梯子且手动操作重复繁琐的问题,采用python作为开发语言,利用Google Cloud上托管的Landsat数据集进行相关数据的查询和下载,此方法可无需梯子,提高数据下载的自动化程度,解放人力。本文主要借鉴了github上相关的项目,进行了项目的本地化安装,解决期间遇到的一些问题;在项目的基础上,根据自己的需求完成相关代码的修改。故此贴并不详细介绍相关技术,主要记录完成自动下载进行的工作。

一:问题描述

通过path、row查询、下载N个不同地点的landsat7和8的一级数据,在不变需求的情况下,只需点击一次鼠标就可以进行数据的查询和下载。如果地点有变,只需要改变path和row即可,跳出usgs 使用梯子、查询数据、下载数据的繁琐且重复的困恼。主要有两种想法:1.python爬虫技术,但是个人技术、时间有限,暂时不考虑;2.借鉴别人的工程(pylandsat),只需进行局部的修改和完善

也想过直接通过usgs下载数据,但是github可以直接下载数据的工程都多多少少遇到了我不能解决的问题,所以pylandsat现在是我较优的选择了。

二:pylandsat及依赖相安装

本次项目主要借鉴了pylandsat项目,该项目可通过经纬度、path/row值查询并下载谷歌云上的landsat影像。

2.1 方法可行性

pylandsat是一个Python软件包,可让您从谷歌云上托管的公共数据集中搜索和下载Landsat场景 。此外,它包括一组访问和预处理下载的场景的类和方法。谷歌云上的landsat数据集每天一更,大部分时间适合usgs上的数据一致的,偶尔会晚更新2-3天,已经可以满足我的业务需求。

功能:1.可以通过经纬度点查找对应的path/row值,进而查询、下载影像

           2.可以通过path/row值查询、下载影像

           3.可以按云量、日期进行影像筛选查询

2.2 pylandsat本地化安装

本项目的所有依赖项及源代码。如果速度国慢,可以参考下文进行管网下载。

链接:https://pan.baidu.com/s/1QXiPMK-rkvfyMP0kb-3bQQ  提取码:lr8s

2.2.1 pylandsat依赖包下载及安装

1.pylandsat项目的依赖包如下所示,直接到https://www.lfd.uci.edu/~gohlke/pythonlibs/下载即可,需先安装GDAL。还需要python-dateutil包,直接pip install python-dateutil即可。

2.sqlite3插件下载及配置:

cyqlite:https://sourceforge.net/projects/cyqlite/files/,下载即可。

libspatialite:http://www.gaia-gis.it/gaia-sins/,下载即可。

均下载完成后,解压,然后按照下图复制过去。

然后将libspatialite中所有的文件复制到当前python环境的根目录下,即你所用的python.exe所在的目录。

2.2.3 pylandsat安装

在做好前期准备工作的情况下,pylandsat的安装十分简单:pip install pylandsat。此处该有截图,但忘记截了。。。

2.2.4 pylandsat测试

1.下载测试:

pylandsat download LE07_L1TP_205050_19991104_20170216_01_T12.

2.数据数本地化测试: pylandsat利用sqlite进行了google云landsat数据库的本地化,方便进行影像的查询。 cmd  :pylandsat sync-database

会报错:程序被占用,直接忽略此错误即可。然后使用seach进行影像的查询。pylandsat search --begin 1999 --end 2000 --path 206 --row 50 --clouds 100

 

 

3.pylandsat应用及源码修改

pylandsat 可以根据path/row下载landsat数据,但是距离满足我的应用场景还有一定的距离。

修改后的pylandsat-tao:

补充:更新条代号存储位置——database.py文件中:

新链接如下:

'https://prd-wret.s3.us-west-2.amazonaws.com/assets/palladium/production/s3fs-public/atoms/files/WRS2_descending_0.zip'

 

1.修复了pylandsat示例代码中删除pandas依赖后遗留的bug,根据列表的key获取value值。

2.通过数组记录多个地点的path/row,path和row通过下表一一对应。

3.通过list记录多个地点对应的影像。

4.通过串行的方式进行list中影像的下载,每个影像单独一个文件夹。

#!/usr/bin/python #-*- coding:utf-8 -*- # @Author : qtwang # @Email : qtwang315518@163.com # @Time : 2020-9-2 14:42 #https://github.com/yannforget/pylandsat from datetime import datetime from shapely.geometry import Point from pylandsat import Catalog, Product catalog = Catalog() begin = datetime(2020, 7, 20) #开始时间 end = datetime(2020, 9, 4) #结束时间 path=[test,test] row=[test,test]#数组内替换为你需要的值。int类型 scenes = catalog.search(begin=begin,end=end,path=path,row =row,sensors=['LE07', 'LC08'],maxcloud=100) print("共查询到%s景数据,即将开始下载!"%(len(scenes))) for scene in scenes:#串行下载 product_id = scene['product_id']#根据key得到value # Download the scene product = Product(product_id) product.download(out_dir='data')#out_dir指定数据存放的位置

最后:

修改后的pylandsat源码包已经上传到了百度云,在安装pylandsat完成后可以直接替换。目前满足了我自己的需求,应该也不会继续完善了,除非应用场景改变。可能的修改:上传到github;支持并行。主要的困难就是pylandsat的安装。

十分感谢yannforget,他的工作给予了我莫大的帮助!

 

更新:

通过几次使用发现pylandsat sync-database更新数据库后,数据查询只是在本机数据库进行查询的。所以下载影像的日期在上一次更新数据库日期之后,则需要删除本机数据库然后重新pylandsat sync-database。

因为pylandsat sync-database这一步需要翻墙,每次时长5-10分钟,所以如果需要频繁的下载最新的影像,量也不打,不如直接到https://earthexplorer.usgs.gov/下载吧。

 

ENJOY!

 

 

 

 

 

 

 

 

 

 

 

最新回复(0)