Icesat-2 ATL13数据下载(不用python),python处理保姆式教学(附代码)

1.数据下载(不用python)

进入官网ICESat-2 Product Overviews | National Snow and Ice Data Center (nsidc.org)

067534836cbc491a89650ce4cc8bfb8a.png

 下滑找到你需要的产品,以下以ATL13为例

467f9cc209434b36b26fe768698d01e9.png

 

 点击进入,找到Data Access Tool,点击get

 

 

5a572d7eebda49999fb091df9c5ca3a2.png

 

 登录自己的 Earthdade账号322b3bf0189f4c88b01595d8102cb518.png

 

准备好自己研究区域 的shp矢量图,没有的话也可以自己圈画, 

609ceaf55db8449a8cd9f52829fe64f5.png8e9ad782d2094ccd981b40770aa04098.png

点击order之后点击两次ok,然后再这个网址找到你的订单(也会给你发送邮件Order History | National Snow and Ice Data Center (nsidc.org)),点击你现在的订单目录查看,下边zip下载,点击稍等片刻就会有下载弹窗391b10ab4c6b4f999bef0c50d3a2ed3f.png

 2数据处理(python3.11)

借鉴大佬的方法利用python读取ICESat-2ATL13数据_icesat2数据处理_华仔不爱marathon的博客-CSDN博客
 

里边涉及的软件包,缺少那个就直接使用win+r,cmd面板pip install +(缺少的软件)然后回车,等待下载完成。

 后续的代码是我自己手搓的,处理过程较为分散。

由于后边批量提取的时候需要将所有的h5文件和附带的xml文件提取到同一个文件夹中

代码实现如下:

#  Python 脚本。
import os
import shutil


def merge_folders(source_folder, destination_folder):
    # 检查目标文件夹是否存在,如果不存在则创建它
    if not os.path.exists(destination_folder):
        os.makedirs(destination_folder)

    # 遍历源文件夹及其子文件夹中的所有文件
    for root, dirs, files in os.walk(source_folder):
        for file in files:
            # 构建源文件的完整路径
            source_path = os.path.join(root, file)
            # 构建目标文件的完整路径
            destination_path = os.path.join(destination_folder, file)
            # 将源文件复制到目标文件夹中
            shutil.copy2(source_path, destination_path)

    print("文件夹合并完成!")

# 指定源文件夹和目标文件夹的路径
source_folder = 'D:/ATL/icesat18-20'
destination_folder = 'D:/ATL/icesatALLH5'

# 调用函数进行文件夹合并
merge_folders(source_folder, destination_folder)



#说明:请确保将 source_folder 和 destination_folder 的值替换为
#实际的文件夹路径。此代码将遍历源文件夹及其所有子文件夹,并将所有文
#件复制到目标文件夹中。最后,它将输出"文件夹合并完成!"作为合并过程
#的确认。


 使用利用python批量读取ICESat-2ATL13数据_利用python读取icesat-2atl13数据_华仔不爱marathon的博客-CSDN博客文章中的代码实现批量提取信息,将其稍作修改

代码如下:

import os
import glob
import h5py
import numpy as np
import pandas as pd

def batch_process_atl13(input_folder, output_folder, bbox=None):
    """
    Batch process ATL13 files in the input folder and save output files in the specified output folder.
    """

    #创建输出文件夹,如果它不存在
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    # 获取输入文件夹中所有h5文件的列表
    files = glob.glob(os.path.join(input_folder, '*.h5'))

    # Process each file
    for file in files:
        # Get the filename without the path
        filename = os.path.basename(file)

        # Each beam is a group
        group = ['/gt1l', '/gt1r', '/gt2l', '/gt2r', '/gt3l', '/gt3r']

        # Loop through beams
        for k, g in enumerate(group):

            # -----------------------------------#
            # 1) Read in data for a single beam #
            # -----------------------------------#

            # Load variables into memory (more can be added!)
            with h5py.File(file, 'r') as fi:
                lat = fi[g + '/segment_lat'][:]
                lon = fi[g + '/segment_lon'][:]
                ht_water_surf = fi[g + '/ht_water_surf'][:]
                segment_geoid = fi[g + '/segment_geoid'][:]
                ht_ortho = fi[g + '/ht_ortho'][:]
            if bbox:
                lonmin, lonmax, latmin, latmax = bbox
                bbox_mask = (lon >= lonmin) & (lon <= lonmax) & \
                            (lat >= latmin) & (lat <= latmax)
            else:
                bbox_mask = np.ones_like(lat, dtype=bool)  # get all

            # 定义输出文件名
            output_filename = filename.replace('.h5', '_' + g[1:] + '.h5')
            output_file = os.path.join(output_folder, output_filename)

            # Save variables
            with h5py.File(output_file, 'w') as f:
                f['lon'] = lon
                f['lat'] = lat
                f['ht_water_surf'] = ht_water_surf
                f['segment_geoid'] = segment_geoid
                f['ht_ortho'] = ht_ortho
                print('Output file:', output_file)

            # 另存为CSV
            output_csv = os.path.join(output_folder, output_filename.replace('.h5', '.csv'))
            result = pd.DataFrame()
            result['lon'] = lon
            result['lat'] = lat
            result['ht_water_surf'] = ht_water_surf
            result['segment_geoid'] = segment_geoid
            result['ht_ortho'] = ht_ortho
            result.to_csv(output_csv, index=None)
            print('Output CSV:', output_csv)

# 指定输入文件夹,输出文件夹和bbox如果需要
input_folder = r'D:/ATL/icesatALLH5'
output_folder = r'D:/ATL/Processed'
bbox = None

# Call the batch processing function
batch_process_atl13(input_folder, output_folder, bbox)

将input_folder = r'D:/ATL/icesatALLH5'替换为你含有所有h5文件的文件夹
output_folder = r'D:/ATL/Processed'替换为你想要输出的位置

将得到的csv文件使用自己研究区域的shp矢量图进行筛选。新的CSV文件的命名方式为原文件名加上"_shp"后缀:

代码实现如下:

#可以读取一个Shapefile文件(.shp)和一个文件夹中所有CSV文件(.csv),然后分别筛选出每个
#位于Shapefile范围内的CSV数据,并将筛选出的数据分别写入一个新的CSV文件中,新的CSV文件的命
#名方式为原文件名加上"_shp"后缀:


import os
import geopandas as gpd
import pandas as pd

# 读取Shapefile文件
gdf = gpd.read_file('D:/ATL/NMCshapefile/111.shp')

# 创建保存筛选结果的文件夹
output_folder = 'D:/ATL/FilteredCSV/'
os.makedirs(output_folder, exist_ok=True)

# 遍历CSV文件夹中的所有文件
csv_folder = 'D:/ATL/CSV2/'
for filename in os.listdir(csv_folder):
    if filename.endswith('.csv'):
        csv_path = os.path.join(csv_folder, filename)
        
        # 读取CSV文件
        df = pd.read_csv(csv_path)
        
        # 筛选出Shapefile范围内的数据
        df = df[(df['lon'] > gdf.bounds['minx'][0]) &
                (df['lat'] > gdf.bounds['miny'][0]) &
                (df['lon'] < gdf.bounds['maxx'][0]) &
                (df['lat'] < gdf.bounds['maxy'][0])]
        
        # 生成新的CSV文件路径
        output_filename = os.path.splitext(filename)[0] + '_shp.csv'
        output_path = os.path.join(output_folder, output_filename)
        
        # 将筛选出的数据写入新的CSV文件
        df.to_csv(output_path, index=False)

由于相同时间有六个csv文件,将其合并起来。

代码实现如下:

import os
import pandas as pd

# 创建保存整合结果的文件夹
output_folder = 'D:/ATL/OutputCSV/'
os.makedirs(output_folder, exist_ok=True)

# 遍历CSV文件夹中的所有文件
csv_folder = 'D:/ATL/FilteredCSV'
for filename in os.listdir(csv_folder):
    if filename.endswith('.csv'):
        csv_path = os.path.join(csv_folder, filename)

        # 从文件名中提取时间信息
        year = filename[6:10]
        month = filename[10:12]
        day = filename[12:14]
        date = f"{year}-{month}-{day}"

        # 读取CSV文件
        df = pd.read_csv(csv_path)

        # 生成新的CSV文件路径
        output_filename = f"{date}.csv"
        output_path = os.path.join(output_folder, output_filename)

        # 将数据追加到新的CSV文件中
        df.to_csv(output_path, mode='a', index=False, header=not os.path.exists(output_path))

然后就要将相同时间的水位高程信息进行平均,内有删除异常高程的方法(仅使用于湖泊等,按自己需要修改)

代码如下:

#将提取的时间和过滤后的水位平均值数据生成CSV文件
#在这个修改后的代码中,我们在计算过滤后的水位平均值之前,添加了一个条件判断,
#检查过滤后的数据是否为空。如果过滤后的数据非空,即存在过滤后的水位平均值数据,
#才进行计算和添加到 data_list 列表中。这样可以剔除没有过滤后的水位平均值数据对应的记录。


import os
import pandas as pd
import matplotlib.pyplot as plt

# 创建空列表用于存储时间和水位平均值数据
data_list = []

# 遍历CSV文件夹中的所有文件
csv_folder = 'D:/ATL/OutputCSV/'
for filename in os.listdir(csv_folder):
    if filename.endswith('.csv'):
        csv_path = os.path.join(csv_folder, filename)

        # 从文件名中提取时间信息
        time = os.path.splitext(filename)[0]

        # 读取CSV文件
        df = pd.read_csv(csv_path)

        # 计算水位平均值和标准差
        average_water_level = df['ht_water_surf'].mean()
        std_water_level = df['ht_water_surf'].std()

        # 根据平均值和标准差过滤异常值
        filtered_df = df[
            (df['ht_water_surf'] >= average_water_level - 3 * std_water_level) &
            (df['ht_water_surf'] <= average_water_level + 3 * std_water_level)
            ]

        # 如果过滤后的数据非空,则计算过滤后的水位平均值
        if not filtered_df.empty:
            filtered_average_water_level = filtered_df['ht_water_surf'].mean()

            # 将时间和过滤后的水位平均值添加到列表中
            data_list.append([time, filtered_average_water_level])

# 创建DataFrame对象
df_data = pd.DataFrame(data_list, columns=['Time', 'Average Water Level'])

# 生成CSV文件
csv_output_path = 'D:/ATL/FilteredData2.csv'
df_data.to_csv(csv_output_path, index=False)

最终得到下面数据:

aa5295217fa245f49649408948ff5f93.png

由于湖泊的纪年法为水文年,青藏高原的湖泊水文年为上一年10月01日到本年的9月30日。先使用代码将时间转换为相应的水文年,在对其每年的水位求平均值。

代码实现如下:

import pandas as pd

# 读取CSV文件
data = pd.read_csv('F:/I11.csv')

# 将时间列解析为日期格式
data['Time'] = pd.to_datetime(data['Time'])

# 筛选上一年10月1日至本年9月30日的数据
start_date = pd.Timestamp(data['Time'].dt.year.min(), 10, 1)  # 上一年10月1日
end_date = pd.Timestamp(data['Time'].dt.year.max() + 1, 9, 30)  # 本年9月30日
filtered_data = data[(data['Time'] >= start_date) & (data['Time'] <= end_date)]

# 计算水位平均值
average_elevation = filtered_data.groupby(filtered_data['Time'].dt.year)['Elevation'].mean()

# 导出到新的CSV文件
average_elevation.to_csv('F:/水位平均值_年度.csv', header=False, index=True)

得到

3e94eb7ba2494355aad63ddf41c3ee64.png

ok,后续就可以使用这些数据对湖泊水位变化进行绘图。

以上就是我对这一部分知识的全部了解了

 

 

 

  • 14
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值