使用 Google Colab 中的 Python 分析 Landsat-8 图像(2014-2023)以创建大盐湖表面区域的时间序列
目录
- 🌅大盐湖萎缩问题简介
- 💾下载 Landsat-8 图像
- 📈统计文件中的大盐湖地区时间序列
- ⚙️处理 Landsat-8 图像
- 🗺️大盐湖图像的可视化
- 🎥 大盐湖缩小的延时摄影
- 📉大盐湖地区分类图像的时间序列
- ⚖️比较统计文件和图像中的时间序列
- 📄 结论
🌅 大盐湖萎缩问题简介
美国犹他州的大盐湖正在经历长期的萎缩。据多份报告称,与1986年的最大面积相比,该湖已经缩小了30%以上。该湖水位下降的原因有多种,包括气候变化和农业用水分配。
关于气候变化因素,据报道,降水模式发生了变化,气温上升,导致积雪减少和流入湖泊的水量减少。
关于第二个原因,过去几年城市和农业面积都在扩大。城市和农业部门不断增长的需求进一步导致水位下降。
长期下降会对生态系统产生影响,特别是空气和水质。湖床区域的暴露会释放灰尘和盐,增加空气和水质的风险。
由于情况是动态的,并且关于跟踪水位下降的讨论正在进行中,我决定写这篇文章来演示我们如何使用卫星图像来监测湖泊表面积的变化,作为水位缩小的指标。
我使用了 Landsat-8 从 2014 年到 2023 年拍摄的所有图像,并在 Google Colab 中使用 Python 对其进行了分析。如果您有兴趣提取过去任何时期的湖泊表面积的时间序列,甚至有兴趣将此方法应用于其他湖泊,那么这篇博文适合您。
💾 下载 Landsat-8 图像
为了下载 Landsat-8 图像,我使用了一个名为 AρρEEARS 的网络应用程序。您可以通过此网络应用程序下载您感兴趣的区域 (AOI) 的卫星图像。这些图像将被剪辑并提供元数据和统计文件。您只需为 AOI 绘制一个多边形,选择产品,然后选择开始和结束日期。
在这篇文章中,我在大盐湖周围绘制了一个多边形,选择了 Landsat-8 ARD 产品,并设置了开始和结束时间以涵盖 2014 年至 2023 年的夏季月份(6 月、7 月和 8 月) 。只考虑在夏季拍摄的图像的决定基于两个原因:(1) 在夏季获得较少云图像的可能性更高,(2) 它限制了计算时间的图像总数。由于我们正在下载这几个月内所有年份的 Landsat-8 图像,因此不同年份的结果(估计的湖泊表面积)具有可比性。
数据政策:根据USGS网站,“从USGS下载Landsat数据没有任何限制;可以根据需要使用或重新分发”(链接)和“通过 LP DAAC 获取的所有 LP DAAC 当前数据和产品在重复使用、销售或重新分发方面没有限制”(链接)。
📈 统计文件中的大盐湖地区时间序列
在 AρρEEARS 中提交请求后,您有两种选择来估算湖泊的表面积。选项 1 是使用统计 CSV 文件中报告的预先计算的水像素数量,选项 2 是通过处理分类图像来计算水像素数量,我将在稍后解释。要遵循选项 1,请从 AρρEEARS 下载两个文件:“L08–002-QA-PIXEL-CU-Statistics-QA.csv”和“L08–002-QA-PIXEL-CU-lookup.csv”。
让我们快速浏览一下每个文件:
L08–002-QA-PIXEL-CU-Statistics-QA.csv 快照,作者图片
L08–002-QA-PIXEL-CU-lookup.csv 的快照,图片由作者提供
正如您在第一个文件“L08–002-QA-PIXEL-CU-Statistics-QA.csv”中看到的,每个图像(行)报告每个类(列)中的像素数。要解码这些列名称,我们需要第二个文件“L08–002-QA-PIXEL-CU-lookup.csv”。如果过滤标记为“水”的列,您可以找到水像素对应的类名称(列):
L08–002-QA-PIXEL-CU-lookup.csv 的快照,过滤水像素,图片由作者提供
我们可以看到,水类别考虑的代码为 21890、21952、22146、22208、54662、54724、54918、54980。因此,如果我们仅从“L08–002-QA-PIXEL-CU-Statistics-”中选择这些列QA.csv”并获得计数像素的总和,我们可以可视化大盐湖地区过去10年的时间序列。让我们编写一个 Python 脚本来绘制此图:
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdatescsv_file_path = 'L08-002-QA-PIXEL-CU-Statistics-QA.csv'# Column names for the water class
selected_columns = ['21890', '21952', '22146','22208','54662','54724','54918','54980']# Read the CSV file into a pandas DataFrame
df = pd.read_csv(csv_file_path)# Convert the 'date' column to datetime format
df['date'] = pd.to_datetime(df['Date'])# Select the water column
selected_data = df[['Date'] + selected_columns]# Calculate the summation for each row
selected_data['sum'] = selected_data[s