关键词:modis,Python,批量下载,requests,json
一幅一幅下载modis影像是真的折磨人,不得不自己另辟蹊径。
话不多说,直接步入正题,如何通过Python批量下载modis影像。
以下载006版本-MOD11A1产品-瓦片h25v05-2010年影像为例,依次输入上述筛选条件,可检索到如下结果,登录后可进行手动下载。
点击下载第一幅影像,其下载链接为https://ladsweb.modaps.eosdis.nasa.gov/archive/allData/6/MOD11A1/2010/001/MOD11A1.A2010001.h25v05.006.2016025150452.hdf,不难发现下载链接由5部分组成:
-
https://ladsweb.modaps.eosdis.nasa.gov/archive/allData
-
版本号 6
-
年份 2010
-
积日 001
-
影像文件名
目前,已知下载链接中的1,2,3,只需获得5,便可通过切片得到4,最后组合就得到完整的下载链接。
那如何得到每个影像的文件名呢?
打开开发者工具,切换到网络,刷新页面,答案即将揭晓……
右图中逐个name对应的就是左边的filename,也就是我们所需的影像文件名。那如何获得右边的这堆数据呢?
访问该网址便可获得上图右边那堆数据,同样进行网址拆分,由6部分组成:
-
产品 product=MOD11A1
-
版本 collection=6
-
时间序列 dateRanges=2010-01-01..2010-12-31
-
感兴趣区 areaOfInterest=x80.46y40.06,x103.93y30.05
-
dayCoverage=true&dnboundCoverage=true
目前,已知该链接中所有组成部分(5填写一个矩形坐标范围,格式为x1y1,x2y2,其中(x1, y1)是该矩形左上角经纬度,(x2, y2)是该矩形右下角经纬度,此矩形必须与目标瓦片有重叠,且越小越好)。
于是,就可以开始快乐玩耍了!
通过requests库,访问链接,代码如下:
response = requests.get( f'https://ladsweb.modaps.eosdis.nasa.gov/api/v1/files/' f'product={product}&collection={collection}&' f'dateRanges={date1}..{date2}&' f'areaOfInterest={location}&' f'dayCoverage=true&dnboundCoverage=true', headers=headers) print(response.text)
将打印出所需数据,{"2372727299":{"name":"MOD11A1.A2010010.h23v05.006.2016025213211.hdf","size":"7322065","collection":6,"ESDT":"MOD11A1","start":"2010-01-10 00:00:00","end":"2010-01-10 00:00:01","FODCompression":null,"FOSDCompression":null,"status":"Online","fileURL":"\/archive\/allData\/6\/MOD11A1\/2010\/010\/MOD11A1.A2010010.h23v05.006.2016025213211.hdf"},……}
遍历这个字典,可提取到逐个影像文件名,并拼接成完整下载链接,写入txt。
for info in data.values(): name = info['name'] day = name[13:16] link_tile = name[17:23] url = 'https://ladsweb.modaps.eosdis.nasa.gov/archive/allData/6/{}/{}/{}/{}'.format(product, yr, day, name) with open(link_path, 'a+') as f2: if link_tile == tile: f2.write(url + '\n')
这样就将所有影像的下载链接保存到一个TXT文件中。
完整代码见公众号,回复关键字'cml'
已经获取了全部下载链接,如何根据链接批量进行下载呢?
公众号:小猪被骑的日常