目录

  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. libevent带负载均衡的多线程使用示例

    功能: 主线程根据负载工作线程负载均衡算法,每隔一秒钟向特定的工作线程发送一条字符串信息,工作线程简单的把字符串信息打开出来.   Makefile   eventtest : eventtest.c ...

  2. IOS中UIButton和UIImageView的区别

    1.使用场合 UIImageView:如果仅仅是为了显示图片,不需要监听图片的点击事件 UIButton:既要显示图片,又要监听图片等点击事件 2.相同点 都能显示图片 3.不同点 UIButton能 ...

  3. Netty4.0学习笔记系列之一:Server与Client的通讯

    http://blog.csdn.net/u013252773/article/details/21046697 本文是学习Netty的第一篇文章,主要对Netty的Server和Client间的通讯 ...

  4. 利用js制作html table分页示例(js实现分页)

    有时候table的列数太长,不利于使用者查询,所以利用JS做了一个table的分页,以下为相关代码 一.JS代码 <script type="text/javascript" ...

  5. AOP举例子

    切面类TestAspect package com.spring.aop; /** * 切面 * */ public class TestAspect { public void doAfter(Jo ...

  6. zabbix 添加jvm监控

    1. zabbix 服务端安装,监控jmx 需要--enable-java zabbix 客户端不需要 --enable-java 2.zabbix_server端安装jdk 安装jdk [root@ ...

  7. 【转】Android驱动开发之earlysuspend睡眠模式编程总结

    原文网址:http://blog.csdn.net/bigapple88/article/details/8669537 (1)添加头文件: #include <linux/earlysuspe ...

  8. 【动态规划】Vijos P1104 采药(NOIP2005普及组第三题)

    题目链接: https://vijos.org/p/1104 题目大意: T时间,n个物品,每个耗时ti,可获得收益ci,求最大收益. 题目思路: [动态规划] 01背包裸题.一维二维都过了,放个一维 ...

  9. HDOJ(HDU) 2178 猜数字(题意有点难理解、、、)

    Problem Description A有1数m,B来猜.B每猜一次,A就说"太大","太小"或"对了" . 问B猜n次可以猜到的最大数. ...

  10. 浅谈二维RMQ

    针对一些二维区间最值问题,用一维RMQ来解决显然是不够的.所以,要改进算法.鉴于网上没有PASCAL版的RMQ标程与解析,所以小可在这里简单的讲一下. 核心思想和一维的一样,只是在计算区间时略有不同. ...