目录

  1. 前言
  2. landsat数据情况简介
  3. 下载元数据
  4. 总结

一、前言

       最近由于工作需要,需要下载部分landsat数据的元数据,老板大手一挥,给了十几年的landsat的path、row以及日期等,就算交待完了。于是我就开始准备吭哧吭哧到USGS官网上去一个个找。程序员应该是世界上最懒的人,懒到哪怕只有几百个也不愿意一个个手动弄,于是在官网上翻腾半天,终于找到这么一个页面(https://landsat.usgs.gov/landsat-bulk-metadata-service),能够给定范围批量下载元数据,这是个好东西,基本几下就解决问题了。懒劲又升级了,这么一批一批的下下来我不是还要手工整理,于是就想写个程序自动下载然后筛选出我想要的部分。

二、landsat数据情况简介

       我相信接触过landsat的人这块应该都很清楚了,百度百科介绍如下:

美国NASA的陆地卫星(Landsat)计划(1975年前称为地球资源技术卫星 — ERTS ),从1972年7月23日以来, 已发射8颗(第6颗发射失败)。目前Landsat1—4均相继失效,Landsat 5仍在超期运行(从1984年3月1日发射至今)。 Landsat 7于1999年4月15日发射升空。Landsat8[1] 于2013年2月11日发射升空,经过100天测试运行后开始获取影像。

       具体信息可以自行查询,landsat的数据都是以带号进行命名的,信息包含path、row以及数据日期等。我们就要根据这些来实现批量下载landsat元数据。

三、下载元数据

3.1 分析下载元数据页面

       仔细分析上述usgs官网中的下载元数据页面,不难发现其是将行列号一定范围内以及日期一定范围内的元数据打包成一个文件发送到前台。并且发送的是一个GET请求,请求格式如下:

https://earthexplorer.usgs.gov/EE/InventoryStream/pathrow?start_path=131&end_path=140&start_row=35&end_row=38&sensor=LANDSAT_TM_C1&start_date=2011-06-01&end_date=2011-11-01&format=CSV

       参数名称也都通俗易懂,于是一切就豁然开朗了,我只需要写个程序根据需求拼接出此url,然后发送请求,就能得到结果。一切就是这么easy,不过拿到结果后你会发现事情稍微复杂一点,因为请求的区域及时间等都是范围,这就导致结果中有很多不是我们需要的,于是再完善程序循环遍历与我们输入数据的行列号逐一匹配,取出需要的结果即可。

3.2 程序实现

       程序整体界面如图所示:

       程序比较简单,只需要提供一个下载范围文件(csv格式),每行一个,选择下载的landsat的dataset即可。

       程序读取用户给定的范围自动算出行列号的范围以及日期范围,代码如下:

var lines = File.ReadAllLines(fileName);
var data = lines.Select(s => s.Split(',')).Select(s => new { Path = int.Parse(s[0]), Row = int.Parse(s[1]), Date = CommonHelper.ParseDate(s[2]) });
StartPath = data.Min(s => s.Path);
StartRow = data.Min(s => s.Row);
StartDate = data.Min(s => s.Date);
EndPath = data.Max(s => s.Path);
EndRow = data.Max(s => s.Row);
EndDate = data.Max(s => s.Date);

       之后拼接请求的URL,代码如下:

$"https://earthexplorer.usgs.gov/EE/InventoryStream/pathrow?start_path={StartPath}&end_path={EndPath}&start_row={StartRow}&end_row={EndRow}&sensor={DatasetType}&start_date={CommonHelper.FormatDate(StartDate)}&end_date={CommonHelper.FormatDate(EndDate)}&format=CSV"

       其中DatasetType是用户选择的landsat数据源,CommonHelper.FormatDate函数完成日期到字符串格式的转化,代码如下:

public static string FormatDate(DateTime date)
{
return date.ToString("yyyy-MM-dd");
}

       然后发送请求,获取结果,这块在网络爬虫之密码破解一文中已经介绍过,不再赘述。获取到结果后,将其与用户想要的结果一一比对,取出需要的结果,代码如下:

var orginResultList = orginResult.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries).Skip(1);
var source = File.ReadAllLines(file);
var data = source.Select(s => s.Split(',')).Select(s => new { Path = int.Parse(s[0]), Row = int.Parse(s[1]), Date = CommonHelper.ParseDate(s[2]) });
var endResult = new List<string>();
data.ToList().ForEach(s =>
{
var temp = orginResultList.Where(re =>
{
var arr = re.Split(',');
return int.Parse(arr[7]) == s.Path && int.Parse(arr[8]) == s.Row /*&& CommonHelper.ParseDate(arr[5]) == s.Date*/;
});
if (temp != null && temp.Count() > 0)
endResult.Add(temp.First());
});
File.WriteAllLines(Path.Combine(Path.GetDirectoryName(file), "res.csv"), endResult);

       其中orginResult表示请求返回的结果,这里面存在一个问题就是往往用户想要的元数据日期与返回的元数据日期不一致(原因可能有很多,用户输入不准确,或者有什么我未考虑到的因素),如果时间也进行匹配的话基本取不到结果,所以目前采用的方式只比对行列号。

四、总结

       通过以上方式即可实现批量下载landsat元数据,需要下载程序的可以直接点击这里,当然由于刚做出的程序,难免在代码逻辑或者业务逻辑上有BUG或者未考虑到的地方,欢迎批评指正,后续完善之后可能会将源代码开放到Github上,以供需要的人使用。

Landsat元数据批量下载工具的更多相关文章

  1. USGS bulk批量下载工具

    最近美国EarthExplorer上批量下载遥感数据---官方给出了批量下载工具BULK 下载地址:https://earthexplorer.usgs.gov/bulk/ bulk 使用帮助文档 根 ...

  2. 今日头条、抖音、西瓜、火山、微视、陌陌等自媒体平台小视频批量下载工具v1.1.0(视频搬运福利)

    前言 目前各大自媒体平台爆火,网络流量暴涨,各大自媒体平台的小视频为广大个广告主带来了如泉涌般的的视频流量,更给广大的自媒体小编带来了丰厚的利益回报,想要创做更多的自媒体内容着实不易,下面给广大的小视 ...

  3. Java实现的有道云笔记图片批量下载工具

    有朋友问我每天哪里找时间写这么多文章. 作为一个程序员,当然要善于利用各种工具提高自己做事情的效率了.如果没有现成的工具,就得自己造. 我写文章一般是在云笔记里编辑,完成之后直接复制粘贴到自媒体平台. ...

  4. 分享一款非常好用的Fatkun图片批量下载工具

    Fatkun图片批量下载 相信大家一定遇到过有着大量精美图片的网页,譬如美女照片.各种壁纸.设计素材.甚至是1024套图等等,但常常几十上百张的图要一张张手工去点击下载实在能让人抓狂!小编的工作中也常 ...

  5. stars-one原创工具——蓝奏云批量下载工具

    一款可以批量下载蓝奏云分享的文件夹下的所有文件 基于HtmlUnit和okhttp开源库,所以打包后的jar包文件有点大 蓝奏云下载地址 github地址 需求 之前找电子书资源的时候,网友分享的蓝奏 ...

  6. POP3:基于命令行的电子邮件(EMail)在线查看和批量下载工具

    使用该工具可以在不安装outlook和foxmail等邮件客户端的情况下快速下载指定邮箱的邮件,并将下载的邮件以eml格式进行保存. 附: 查看eml格式的邮件可使用 EmlReader 工具,该工具 ...

  7. C#实现图标批量下载

    本文略微有些长,花了好几晚时间编辑修改,若在措辞排版上有问题,请谅解.本文共分为四篇,下面是主要内容,也是软件开发基本流程. 阶段 描述 需求分析 主要描述实现本程序的目的及对需求进行分析,即为什么要 ...

  8. java批量下载文件为zip包

    批量下载文件为zip包的工具类 package com.meeno.trainsys.util; import javax.servlet.http.HttpServletRequest; impor ...

  9. KRPano资源分析工具使用说明(KRPano XML/JS解密 切片图批量下载 球面图还原 加密混淆JS还原美化)

    软件交流群:571171251(软件免费版本在群内提供) krpano技术交流群:551278936(软件免费版本在群内提供) 最新博客地址:blog.turenlong.com 限时下载地址:htt ...

随机推荐

  1. Protues中有源蜂鸣器BUZZER不响的解决办法(有图)

    这个是BUZZER有源蜂鸣器的protues连线图(FM是我自己的电压探针,可以删除的) 下面是我个人设置的蜂鸣器的参数(为什么很多人的这个蜂鸣器不响,是参数没有设置正确) 蜂鸣器不响的原因是 Ope ...

  2. JVM上的随机数与熵池策略

    在apache-tomcat官方文档:如何让tomcat启动更快里面提到了一些启动时的优化项,其中一项是关于随机数生成时,采用的“熵源”(entropy source)的策略. 他提到tomcat7的 ...

  3. Maven实战一

    转载:http://www.iteye.com/topic/1123221 1. 用Maven 命令创建一个简单的Maven项目 在cmd中运行如下命令: Cmd代码 mvn archetype:ge ...

  4. jQuery Validate 验证,校验规则写在控件中的具体例子

    将校验规则写到控件中 <script src="../js/jquery.js" type="text/javascript"></scrip ...

  5. 数据结构(块状链表):COGS 1689. [HNOI2010]Bounce 弹飞绵羊

    时间限制:1 s   内存限制:259 MB [题目描述] 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地 ...

  6. 【模拟】NCPC 2014 E ceremony

    题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1791 题目大意: N栋大楼(N<=100000),拆除的时候有两种选择的操作,可 ...

  7. Git 的优点

    1. 快速 如果你每移动一下鼠标都要等待五秒,是不是很受不了?版本控制也是一样的,每一个命令多那么几秒钟,一天下来也会浪费你不少时间.Git的操作非常快速,你可以把时间用在别的更有意义的地方. 2. ...

  8. redis学习心得之二【redis主从配置】

    在前一节我们已经实践启动了一个redis服务,我们将其作为主机,现为其创建一个从机作备份使用 1.复制一份配置出来为从机所用 ~$ cp       redis/etc/redis.conf     ...

  9. 加快maven中jar包的下载速度

    maven下载jar包的默认仓库是http://my.repository.com/repo/path速度较慢,通过配置国内镜像提高下载速度 1.打开eclipse--->Window---&g ...

  10. 隐式intent

    使用隐式Intent,我们不仅可以启动自己程序内的活动,还可以启动其他程序的活动, 这里我们首先指定了Intent的action是Intent.ACTION_VIEW,这是一个Android系统内置的 ...