Landsat元数据批量下载工具

news/2024/7/19 11:32:09 标签: 爬虫

目录

  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上,以供需要的人使用。

转载于:https://www.cnblogs.com/shoufengwei/p/6269091.html


http://www.niftyadmin.cn/n/802216.html

相关文章

计算机组成比分,东华大学2020考研计算机OJ题目解答分享——进阶篇(65)

65 乒乓球作者: ZhouMingLiang 时间限制: 10S章节: 字符串问题描述 :国际乒联主席沙拉拉自从上任以来就立志于推行一系列改革&#xff0c;以推动乒乓球运动在全球的普及。其中11分制改革引起了很大的争议&#xff0c;有一部分球员因为无法适应新规则只能选择退役。明明就是其中…

oracle导出数据特别慢_30岁女IT月薪3W的背后:从数据报表到数仓、中台,这工具帮了大忙...

大家可能见过女程序员、女IT工程师&#xff0c;但是我今天要讲的这位&#xff0c;肯定和你们看到的都不一样&#xff1a;一位30岁左右的女IT&#xff0c;为了自己的数据梦想&#xff0c;重构企业数据架构的故事&#xff0c;就以第一人称来说吧。我毕业快6年了&#xff0c;从事的…

ubuntu 下安装摄像头驱动

sudo apt-get install cheese sudo apt-get install camorama 然后可以打开应用cheese&#xff0c;观察可以得到图像。 也可以通过代码获取图像。python代码如下&#xff1a; 1 import cv2.cv as cv 2 3 import time 4 5 if __name__ __main__: 6 7 cv.NamedWindow(&qu…

django项目_将Django项目部署到Kubernetes

Source: Lukas Gentele本教程旨在为希望使用Kubernetes构建和部署Django项目时探索Kubernetes并提高生产率的Django开发人员提供指南。本教程独立于任何云平台。无论是使用Minikube或Docker桌面创建的本地单节点集群&#xff0c;还是GKE&#xff0c;AKS或EKS中的完全托管集群&a…

计算机一级中替换,08年计算机一级辅导:实战WPS转义符在查找替换中的应用

08年计算机一级辅导:实战WPS转义符在查找替换中的应用分类&#xff1a;计算机等级|更新时间&#xff1a;2008-10-15|来源&#xff1a;教育联展网用WPS表格制作了一个家校联系卡&#xff0c;有一位班主任比较聪明&#xff0c;将班主姓名都是用两个*表示的&#xff0c;本来以为到…

计算机硬件更新快,频繁更新电脑硬件驱动程序到底好不好?真相在此

原标题&#xff1a;频繁更新电脑硬件驱动程序到底好不好&#xff1f;真相在此有不少人认为硬件驱动越新越好&#xff0c;所以不断更新自己的显卡、主板、声卡、网卡……等一系列驱动程序&#xff0c;认为新版本的驱动有利于系统保持最新和第一时间修复系统问题&#xff0c;但最…

kettle配置集群_Linux环境下kettle集群部署小记(本文部署一主三从服务器)

kettle集群的部署已过了很长时间&#xff0c;今天突然想总结下部署过程&#xff0c;方便后人和自己以后部署方便。一、运行环境kettle众所周知是Java开发的开源项目&#xff0c;故kettle需要java环境&#xff0c;正常大型项目可能需要用到kettle的资源库配置&#xff0c;故需要…

Java入门第二季第2章封装

什么是 Java 中的内部类 问&#xff1a;什么是内部类呢&#xff1f; 答&#xff1a;内部类&#xff08; Inner Class &#xff09;就是定义在另外一个类里面的类。与之对应&#xff0c;包含内部类的类被称为外部类。 问&#xff1a;那为什么要将一个类定义在另一个类里面呢&…