摘要:针对通过usgs官网下载需要梯子且手动操作重复繁琐的问题,采用python作为开发语言,利用Google Cloud上托管的Landsat数据集进行相关数据的查询和下载,此方法可无需梯子,提高数据下载的自动化程度,解放人力。本文主要借鉴了github上相关的项目,进行了项目的本地化安装,解决期间遇到的一些问题;在项目的基础上,根据自己的需求完成相关代码的修改。故此贴并不详细介绍相关技术,主要记录完成自动下载进行的工作。
通过path、row查询、下载N个不同地点的landsat7和8的一级数据,在不变需求的情况下,只需点击一次鼠标就可以进行数据的查询和下载。如果地点有变,只需要改变path和row即可,跳出usgs 使用梯子、查询数据、下载数据的繁琐且重复的困恼。主要有两种想法:1.python爬虫技术,但是个人技术、时间有限,暂时不考虑;2.借鉴别人的工程(pylandsat),只需进行局部的修改和完善。
也想过直接通过usgs下载数据,但是github可以直接下载数据的工程都多多少少遇到了我不能解决的问题,所以pylandsat现在是我较优的选择了。
本次项目主要借鉴了pylandsat项目,该项目可通过经纬度、path/row值查询并下载谷歌云上的landsat影像。
pylandsat是一个Python软件包,可让您从谷歌云上托管的公共数据集中搜索和下载Landsat场景 。此外,它包括一组访问和预处理下载的场景的类和方法。谷歌云上的landsat数据集每天一更,大部分时间适合usgs上的数据一致的,偶尔会晚更新2-3天,已经可以满足我的业务需求。
功能:1.可以通过经纬度点查找对应的path/row值,进而查询、下载影像
2.可以通过path/row值查询、下载影像
3.可以按云量、日期进行影像筛选查询
本项目的所有依赖项及源代码。如果速度国慢,可以参考下文进行管网下载。
链接:https://pan.baidu.com/s/1QXiPMK-rkvfyMP0kb-3bQQ 提取码:lr8s
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所在的目录。
在做好前期准备工作的情况下,pylandsat的安装十分简单:pip install 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
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/下载吧。
