遥感影像深度学习样本对制作教程3——从GEE下载训练数据

2023-11-08

关注公众号GeodataAnalysis,回复20230505获取示例数据和代码,这三章的代码都放在一起,上手运行一下代码更容易弄懂。

遥感数据多种多样,存储格式各异,处理起来很麻烦。比如很多MODIS数据都是采用HDF格式存储的,在制作深度学习样本时,需要把它转换为GeoTiff格式,可能还需要进行重投影或重采样的操作。

GEE在这方面的主要有以下优点

  • 数据全面,不仅有很多官方数据,还有个人上传的数据。
  • 全球数据统一,不用考虑数据分景的问题。
  • 导出时可以方便的指定分辨率、坐标系。
  • 可以批量下载。

下面介绍一下怎么从GEE下载训练数据。

1 确定数据的空间范围

训练数据往往在空间分布上是零散的,如下图所示。在时间上可能各个位置也需要不同时间的数据。这个时候就需要先确定每一块的空间范围和时间。

空间范围的信息为,这一块影像的上下左右的四个坐标值,以及坐标系(每一块影像的坐标系可能不同)。时间信息为年、月、日等。

上两章我们用Langdsat8数据为例,这次也以两景Landsat8数据为例,提取这两景数据对应的相同时间相同空间位置的MODIS数据。数据存储格式如下

- data
	- LC08_L1TP_018030_20150907_20200908_02_T1
		- LC08_L1TP_018030_20150907_20200908_02_T1_B1.TIF
	- LC08_L1TP_039035_20160304_20200907_02_T1
		- LC08_L1TP_039035_20160304_20200907_02_T1_B1.TIF

以下代码用于提取两景影像的空间范围:

df = pd.DataFrame(columns=['id', 'year', 'left', 
						   'top', 'right', 'bottom', 'crs'])
for i, id in enumerate(os.listdir('./data/')):
    src = rio.open(
        os.path.join('./data/', id, id+'_B1.TIF')
    )
    df.loc[i, 'id'] = id
    df.loc[i, 'year'] = int(id[17:21])
    df.loc[i, 'left'] = src.bounds.left
    df.loc[i, 'bottom'] = src.bounds.bottom
    df.loc[i, 'right'] = src.bounds.right
    df.loc[i, 'top'] = src.bounds.top
    df.loc[i, 'crs'] = src.crs.to_epsg()
df.to_csv('./data/list.csv', index=False)
df

2 把上一步提取的信息上传到谷歌云盘

这次使用Python版的GEE下载数据,相比JavaScript版本,Python版本可以方便的读取表格数据。而JavaScript版本只支持很有限的格式,而且读取起来也很麻烦。

Python版的GEE需要在Google Colab中操作,如果不会用可以参考我的另一篇文章基于Python的遥感云计算

3 在Colab中读取表格信息

首先新建一个 Jupyter 笔记本,使用如下代码连接到自己的谷歌云盘。

from google.colab import drive
drive.mount('/content/drive')

Colab的Python环境自带很多数据分析的包,如pandasnumpy等,而且还可以自己安装需要的包。下面使用pandas读取表格信息。

import pandas as pd
df = pd.read_csv('./drive/MyDrive/MCD12Q1/list.csv')
df.head()

4 连接Earth Engine API

# 导入API
import ee

# 验证身份信息
ee.Authenticate()

# 初始化
ee.Initialize()

5 下载数据

下面的代码中,第十三行用于定义下载数据的空间范围,如果训练数据的空间范围是用shp数据指定的话,把这部分改为读取shp数据的边框范围即可。

tasks = []

for row in df.itertuples():
  right, bottom = row.right, row.bottom
  left, top = row.left, row.top
  crs = row.crs
  year = str(row.year)
  id = row.id

  image = ee.ImageCollection('MODIS/061/MCD12Q1') \
	        .filterDate(year + '-01-01', year + '-12-31') \
	        .select('LC_Prop2').first()
  roi = ee.Geometry.Rectangle([left, bottom, right, top], 
	            proj=f'EPSG:{crs}', evenOdd=False)

  # 设置导出参数
  task_config = {
      'driveFolder': 'MCD12Q1',  # Google云盘中的文件夹名称
      'driveFileNamePrefix': id,  # 导出图像的文件名前缀
      'scale': 480,  # 导出图像的空间分辨率
      'region': roi,  # 导出图像的区域
      'maxPixels': 1e13,  # 允许的最大像素数
      'crs': f'EPSG:{crs}'
  }

  # 开始导出任务
  task = ee.batch.Export.image.toDrive(image, **task_config)
  task.start()
  tasks.append(task)
  print(id)

6 检测数据下载是否完成

上述代码只是提交了下载任务,以下代码用于检查这些任务有没有全部下载完成。

import time
import numpy as np

tasks_status = [False] * len(tasks)
num = 0
while True:
  for i, task in enumerate(tasks):
    status = task.status()
    if status['state'] == 'COMPLETED':
      tasks_status[i] = True

  time.sleep(10)
  num += 1

  if np.all(np.array(tasks_status)):
    break

  if num % 60 == 0:
    print(f'Check {num % 60}', tasks_status)
print('Done')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

遥感影像深度学习样本对制作教程3——从GEE下载训练数据 的相关文章

  • 如何查看Databricks中的所有数据库和表

    我想列出 Azure Databricks 中每个数据库中的所有表 所以我希望输出看起来像这样 Database Table name Database1 Table 1 Database1 Table 2 Database1 Table
  • Django 管理员在模型编辑时间歇性返回 404

    我们使用 Django Admin 来维护导出到我们的一些站点的一些数据 有时 当单击标准更改列表视图来获取模型编辑表单而不是路由到正确的页面时 我们会得到 Django 404 页面 模板 它是偶尔发生的 我们可以通过重新加载三次来重现它
  • 通过最小元素比较对 5 个元素进行排序

    我必须在 python 中使用元素之间的最小比较次数来建模对 5 个元素的列表进行排序的执行计划 除此之外 复杂性是无关紧要的 结果是一个对的列表 表示在另一时间对列表进行排序所需的比较 我知道有一种算法可以通过 7 次比较 总是在元素之间
  • 使用 matplotlib 绘制时间序列数据并仅在年初显示年份

    rcParams date autoformatter month b n Y 我正在使用 matpltolib 来绘制时间序列 如果我按上述方式设置 rcParams 则生成的图会在每个刻度处标记月份名称和年份 我怎样才能将其设置为仅在每
  • 从字符串中删除识别的日期

    作为输入 我有几个包含不同格式日期的字符串 例如 彼得在16 45 我的生日是1990年7月8日 On 7 月 11 日星期六我会回家 I use dateutil parser parse识别字符串中的日期 在下一步中 我想从字符串中删除
  • 如何从网页中嵌入的 Tableau 图表中抓取工具提示值

    我试图弄清楚是否有一种方法以及如何使用 python 从网页中的 Tableau 嵌入图形中抓取工具提示值 以下是当用户将鼠标悬停在条形上时带有工具提示的图表示例 我从要从中抓取的原始网页中获取了此网址 https covid19 colo
  • 测试 python Counter 是否包含在另一个 Counter 中

    如何测试是否是pythonCounter https docs python org 2 library collections html collections Counter is 包含在另一个中使用以下定义 柜台a包含在计数器中b当且
  • BeautifulSoup 中的嵌套标签 - Python

    我在网站和 stackoverflow 上查看了许多示例 但找不到解决我的问题的通用解决方案 我正在处理一个非常混乱的网站 我想抓取一些数据 标记看起来像这样 table tbody tr tr tr td td td table tr t
  • 添加不同形状的 numpy 数组

    我想添加两个不同形状的 numpy 数组 但不进行广播 而是将 缺失 值视为零 可能最简单的例子是 1 2 3 2 gt 3 2 3 or 1 2 3 2 1 gt 3 2 3 1 0 0 我事先不知道形状 我正在弄乱每个 np shape
  • 如何在ipywidget按钮中显示全文?

    我正在创建一个ipywidget带有一些文本的按钮 但按钮中未显示全文 我使用的代码如下 import ipywidgets as widgets from IPython display import display button wid
  • 无法在 Python 3 中导入 cProfile

    我试图将 cProfile 模块导入 Python 3 3 0 但出现以下错误 Traceback most recent call last File
  • Pandas:merge_asof() 对多行求和/不重复

    我正在处理两个数据集 每个数据集具有不同的关联日期 我想合并它们 但因为日期不完全匹配 我相信merge asof 是最好的方法 然而 有两件事发生merge asof 不理想的 数字重复 数字丢失 以下代码是一个示例 df a pd Da
  • Fabric env.roledefs 未按预期运行

    On the 面料网站 http docs fabfile org en 1 10 usage execution html 给出这个例子 from fabric api import env env roledefs web hosts
  • 将图像分割成多个网格

    我使用下面的代码将图像分割成网格的 20 个相等的部分 import cv2 im cv2 imread apple jpg im cv2 resize im 1000 500 imgwidth im shape 0 imgheight i
  • 如何在seaborn displot中使用hist_kws

    我想在同一图中用不同的颜色绘制直方图和 kde 线 我想为直方图设置绿色 为 kde 线设置蓝色 我设法弄清楚使用 line kws 来更改 kde 线条颜色 但 hist kws 不适用于显示 我尝试过使用 histplot 但我无法为
  • 对年龄列进行分组/分类

    我有一个数据框说df有一个柱子 Ages gt gt gt df Age 0 22 1 38 2 26 3 35 4 35 5 1 6 54 我想对这个年龄段进行分组并创建一个像这样的新专栏 If age gt 0 age lt 2 the
  • Conda SafetyError:文件大小不正确

    使用创建 Conda 环境时conda create n env name python 3 6 我收到以下警告 Preparing transaction done Verifying transaction SafetyError Th
  • Scrapy:如何使用元在方法之间传递项目

    我是 scrapy 和 python 的新手 我试图将 parse quotes 中的项目 item author 传递给下一个解析方法 parse bio 我尝试了 request meta 和 response meta 方法 如 sc
  • 如何将输入读取为数字?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 Why are x and y下面的代码中使用字符串而不是整数 注意 在Python 2
  • NotImplementedError:无法将符号张量 (lstm_2/strided_slice:0) 转换为 numpy 数组。时间

    张量流版本 2 3 1 numpy 版本 1 20 在代码下面 define model model Sequential model add LSTM 50 activation relu input shape n steps n fe

随机推荐

  • deepsort算法原理以及代码解析

    概述 前边我们讲了sort算法的原理 并且指出了它的不足 IDsw过大 为了解决该问题 17年时候sort算法的团队又提出了DeepSort算法 Deepsort在原来Sort算法的基础上 改进了以下内容 使用级联匹配算法 针对每一个检测器
  • .NET通用开发框架

    在开源中国社区 简单整理了下比较好的 NET通用开发框架 一个好的通用框架大概包括 开源 扩展性好 灵活性好 复用性好 维护性好 易测试 易发布 易部署 快速业务搭建 或业务集成 通用性强 参考资料多 持续技术支持 社区疑难问题建设 NET
  • 顺序表的基本操作(初始化、插入、删除、查询、扩容、打印、清空等)

    顺序表的基本操作 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构 一般情况下采用数组存储 在数组上完成数据的增删查改等基本操作 初始化 初始化结构体 开辟空间 void SeqListInit SeqList ps size
  • TypeScript 中的 any、unknown、never 和 void

    any any 表示 任意类型 它是任意类型的父类 任意类型的值都可以赋予给 any 类型 编译不会报错 let anything any 前端西瓜哥 let flag boolean true anything flag anything
  • 数据库实体关系模型 --- ER Model

    数据库实体关系图 The Entity Relationship Model ER Model ER模型的作用 ER模型的基本组成 E R 图 ER图的基本组成 不同的键 Key 超码 superkey 候选码 candidate key
  • 微服务多模块:Springboot+Security+Redis+Gateway+OpenFeign+Nacos+JWT (附源码)仅需一招,520彻底拿捏你

    可能有些人会觉得这篇似曾相识 没错 这篇是由原文章进行二次开发的 前阵子有些事情 但最近看到评论区说原文章最后实现的是单模块的验证 由于过去太久也懒得验证 所以重新写了一个完整的可以跑得动的一个 OK 回到正题 以下是真正对应的微服务多模块
  • python习题及答案/4.16

    文章目录 1 从键盘输入两个数 求它们的和并输出 2 从键盘输入三个数到a b c中 按公式值输出 3 输出 Python语言简单易学 4 使用函数求特殊a串数列和 5 使用函数求素数和 6 使用函数统计指定数字的个数 1 从键盘输入两个数
  • 以太坊学习笔记(三)——搭建以太坊私链

    以太坊私链的搭建可以直接通过下载程序进行安装 也可以通过编译源码安装 本文介绍通过编译源码进行安装 编译源码 1 准备环境 我们下载的是go语言的源码 首先需要正确的安装go语言环境 如何正确安装go语言环境 大家可以去网上找教程 2 下载
  • AndroidO audio系统之AudioPolicyService分析(三)

    1 AudioPolicyService基础 AudioPolicy在Android系统中主要负责Audio 策略 相关的问题 它和AudioFlinger一起组成了Android Audio系统的两个服务 一个负责管理audio的 路由
  • QStringList 常用方法

    QStringList类 常用方法 定义一个字符串链表 QStringList weekList 往链表中添加元素 weekList lt lt 星期一 lt lt 星期二 lt lt 星期三 lt lt 星期四 weekList lt l
  • 麻雀算法SSA优化LSTM超参数

    前言 LSTM 航空乘客预测单步预测的两种情况 简单运用LSTM 模型进行预测分析 加入注意力机制的LSTM 对航空乘客预测采用了目前市面上比较流行的注意力机制 将两者进行结合预测 多层 LSTM 对航空乘客预测 简单运用多层的LSTM 模
  • Shapley Values

    今天来学习一下Shapley Values 先上概念 以及研究背景 borrowed from Wikipedia The Shapley value is a solution concept in cooperative game th
  • 环形链表之快慢指针

    环形链表 前言 一 案例 1 环形链表 2 环形链表II 二 题解 1 环形链表 2 环形链表II 3 源码 4 寻找入环点的数学解法 总结 参考文献 前言 对于环形链表 通过快慢指针 如果存在环 这这两个指针一定会相遇 这是一种经典的判断
  • 服务器虚拟化的七大好处

    将服务器物理资源抽象成逻辑资源 让一台服务器变成几台甚至上百台相互隔离的虚拟服务器 我们不再受限于物理上的界限 而是让CPU 内存 磁盘 I O等硬件变成可以动态管理的 资源池 从而提高资源的利用率 简化系统管理 实现服务器整合 让IT对业
  • 遇到的问题----java.lang.reflect.InvocationTargetException

    发现问题 因为是从servlet中反射调用方式 所以只要是在调用反射方法中出现的任何错误都会包此错误 关键在于看下面的错误报告 如下图 解决问题 然后经过一点点的排查发现 namespace com bjsxt mapper Employe
  • 将List中的某一个元素移动到首位或指定位置

    List集合的特点是有序 有下标 可重复的 问题场景 从数据库查询多条数据放到List集合中 但突然想把集合中某一条数据向上移动 放到某一条数据后边 此时你又不能改变从数据库中查询结果的顺序 所以只能对集合进行处理 方法一 使用 Colle
  • How to Control Power Switch Rush Current

    原文链接 https community cadence com cadence blogs 8 b lp posts how to control power switch rush current While there are mul
  • mysql列转行

    原表select from test table 列转行select sheng substring index substring index b shi a help topic id 1 1 as shi from mysql hel
  • C#怎么测试静态方法?我给出了2种方案

    问题 假设有一个方法需要判断当前小时范围 代码如下 public class Class1 public bool SomeMethod var hour DateTime Now Hour if hour gt 9 hour lt 12
  • 遥感影像深度学习样本对制作教程3——从GEE下载训练数据

    关注公众号GeodataAnalysis 回复20230505获取示例数据和代码 这三章的代码都放在一起 上手运行一下代码更容易弄懂 遥感数据多种多样 存储格式各异 处理起来很麻烦 比如很多MODIS数据都是采用HDF格式存储的 在制作深度