Python 栅格数据处理教程(二)

打印 上一主题 下一主题

主题 895|帖子 895|积分 2685

本文将介绍通过 ArcGIS Pro 的 Python 模块(arcpy)对栅格数据举行栅格计算及数据统计的方法。
1 数据来源及介绍

本文使用的数据为国家青藏高原科学数据中央的 中国1km分辨率逐月降水量数据集基础上通过《Python 栅格数据处理教程(一)》中的方法提取出的吉林省范围降水量数据。该数据降水量单元为 0.1 mm,本文通过栅格计算器将数据单元批量转换为 mm。根据各月份降水量叠加生成年降水量栅格及多年平均降水量栅格,同时统计历年降水量数据信息,并整理为 Excel 表。
2 示例代码

2.1 降水量单元转换
  1. import os
  2. import arcpy
  3. from arcpy import sa
  4. from tqdm import tqdm   # 进度条工具,需自行安装
  5. # 设置工作空间
  6. arcpy.env.workspace = "Pre_Jilin.gdb"
  7. # 如果在代码同级文件夹中没有结果数据库,则创建该数据库
  8. if "Pre_Jilin1.gdb" not in os.listdir("."):
  9.     print("即将为您创建用于保存结果栅格的文件地理数据库(Pre_Jilin1.gdb)……")
  10.     arcpy.CreateFileGDB_management(".", "Pre_Jilin1")
  11.     print("数据库创建完成!")
  12. # 遍历工作空间内所有栅格数据
  13. for raster in tqdm(arcpy.ListRasters()):
  14.     # 通过栅格计算器将栅格值单位转换为 mm,并保存到结果数据库
  15.     sa.RasterCalculator([raster], [raster], f"{raster} * 0.1").save(f"Pre_Jilin1.gdb/{raster}")
  16. print("计算完成!")
复制代码
栅格数据转换前如下所示:

栅格单元转换后如下所示:

2.2 根据各月份降水量生成年降水量栅格
  1. import os
  2. import arcpy
  3. from arcpy import sa
  4. from tqdm import tqdm
  5. # 设置工作空间
  6. arcpy.env.workspace = "Pre_Jilin1.gdb"
  7. # 创建栅格文件字典,以年份为键,值为该年份对应的各月份降水量栅格列表
  8. file_dict = dict()
  9. for raster in arcpy.ListRasters():
  10.     if raster[4:8] not in file_dict:
  11.         file_dict[raster[4:8]] = [raster]
  12.     else:
  13.         file_dict[raster[4:8]].append(raster)
  14. # 如果在代码同级文件夹中没有结果数据库,则创建该数据库
  15. if "Pre_Jilin_Year.gdb" not in os.listdir("."):
  16.     print("即将为您创建用于保存结果栅格的文件地理数据库(Pre_Jilin_Year.gdb)……")
  17.     arcpy.CreateFileGDB_management(".", "Pre_Jilin_Year")
  18.     print("数据库创建完成!")
  19. # 定义变量名,并构建代数表达式,以对输入栅格执行空间分析
  20. # 以 a-l 代表12个月份的降水量栅格,求全年总降水量
  21. input_names = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"]
  22. expression = "a + b + c + d + e + f + g + h + i + j + k + l"
  23. # 遍历栅格文件字典
  24. for year in tqdm(file_dict):
  25.     # 提取历年降水量栅格,通过栅格计算器生成年降水量栅格,并保存到结果数据库中
  26.     sa.RasterCalculator(file_dict[year], input_names, expression).save(f"Pre_Jilin_Year.gdb/Pre_{year}")
  27. print("计算完成!")
复制代码
2023年吉林省年降水量栅格如下图所示:

2.3 统计研究区年降水量的最值、均值、标准差等信息
  1. import os
  2. import arcpy
  3. from arcpy import sa
  4. from tqdm import tqdm
  5. # 设置工作空间
  6. arcpy.env.workspace = "Pre_Jilin_Year.gdb"
  7. # 如果在代码同级文件夹中没有结果数据库,则创建该数据库
  8. if "Pre_Jilin_Year_Info.gdb" not in os.listdir("."):
  9.     print("即将为您创建用于保存结果栅格的文件地理数据库(Pre_Jilin_Year_Info.gdb)……")
  10.     arcpy.CreateFileGDB_management(".", "Pre_Jilin_Year_Info")
  11.     print("数据库创建完成!")
  12. # 遍历工作空间内所有栅格数据
  13. for raster in tqdm(arcpy.ListRasters()):
  14.     # 统计吉林省范围内年降水量的最值、均值、标准差等信息,并以表格的形式保存到结果数据库中
  15.     sa.ZonalStatisticsAsTable("Data/Jilin.shp", "FID", raster, f"Pre_Jilin_Year_Info.gdb/{raster}")
  16. print("统计完成!")
复制代码
2.4 将统计信息表格导出为 txt 文本文件
  1. import os
  2. import arcpy
  3. from tqdm import tqdm
  4. arcpy.env.workspace = "Pre_Jilin_Year_Info.gdb"
  5. # 如果在代码同级文件夹中没有结果文件夹,则创建该文件夹
  6. if "Pre_Jilin_Year_Table" not in os.listdir("."):
  7.     print("即将为您创建用于保存转换结果的文件夹(Pre_Jilin_Year_Table)……")
  8.     os.mkdir("Pre_Jilin_Year_Table")
  9.     print("文件夹创建完成!")
  10. # 遍历工作空间内所有表格,将表格逐一导出为 txt 文本文件
  11. for table in tqdm(arcpy.ListTables()):
  12.     arcpy.ExportTable_conversion(table, f"Pre_Jilin_Year_Table/{table}.txt")
  13. print("转换完成!")
复制代码
2023 年的统计信息文本如下所示:

2.5 将历年的 txt 文件整理为 Excel 表
  1. import os
  2. import pandas as pd
  3. pre_dict = dict()
  4. # 遍历文件列表
  5. for fileName in os.listdir("Pre_Jilin_Year_Table"):
  6.     # 通过后缀名判断是否为 txt 文件
  7.     if fileName[-4:] == ".txt":
  8.         # 基于 UTF-8 编码读取 txt 文件内容
  9.         with open(f"Pre_Jilin_Year_Table/{fileName}", "r", encoding="utf-8") as file:
  10.             file_txt = file.readlines()
  11.             # 文本内容的第一行是标题,第二行是数据
  12.             # 读取第二行数据第5个数值开始的所有数据值,即 MIN,MAX,RANGE,MEAN,STD,SUM,MEDIAN,PCT90
  13.             # 将这些数据值合并为列表
  14.             # 注:ArcGIS Pro 不同版本转换得到的 txt 数据表字段可能不同,需要根据实际情况调整代码
  15.             val_list = file_txt[1].replace("\n", "").split(",")[4:]
  16.         # 将所有数据值从字符串类型转换为数值类型
  17.         for i in range(len(val_list)):
  18.             val_list[i] = eval(val_list[i])
  19.         # 以数值类型年份为键,数据值列表为值,将数据存入字典
  20.         pre_dict[eval(fileName[4:8])] = val_list
  21. # 将字典转换为 DataFrame 二维数据表
  22. df = pd.DataFrame(pre_dict, index="MIN,MAX,RANGE,MEAN,STD,SUM,MEDIAN,PCT90".split(",")).T
  23. print(df)
  24. # 将 DataFrame 导出为 Execl 表格
  25. df.to_excel("Pre_Jilin_Year_Table.xlsx")
  26. print("导出表格完成!")
复制代码
简朴调整 Excel 表的格式后,其展示效果如下图所示:

2.6 基于历年降水量生成多年平均降水量栅格
  1. import os
  2. import arcpy
  3. from arcpy import sa
  4. # 设置工作空间,并根据数据库中的栅格数据数量确定年份数量
  5. arcpy.env.workspace = "Pre_Jilin_Year.gdb"
  6. year_num = len(arcpy.ListRasters())
  7. # 定义变量名,并构建代数表达式,以对输入栅格执行空间分析
  8. # input_names = ["Pre_2001", "Pre_2002", "Pre_2003", ......, "Pre_2021", "Pre_2022", "Pre_2023"]
  9. # expression = "(Pre_2001 + Pre_2002 + Pre_2003 + ...... + Pre_2021 + Pre_2022 + Pre_2023) / 23"
  10. input_names, expression = [], ""
  11. for raster in arcpy.ListRasters():
  12.     input_names.append(raster)
  13.     if expression == "":
  14.         expression += raster
  15.     else:
  16.         expression += f" + {raster}"
  17. expression = f"({expression}) / {year_num}"
  18. # 如果在代码同级文件夹中没有结果数据库,则创建该数据库
  19. if "Pre_Jilin_Mean.gdb" not in os.listdir("."):
  20.     print("即将为您创建用于保存结果栅格的文件地理数据库(Pre_Jilin_Mean.gdb)……")
  21.     arcpy.CreateFileGDB_management(".", "Pre_Jilin_Mean")
  22.     print("数据库创建完成!")
  23. # 计算多年平均降水量栅格并保存到结果数据库中
  24. sa.RasterCalculator(arcpy.ListRasters(), input_names, expression).save("Pre_Jilin_Mean.gdb/Pre_Mean")
  25. print("计算完成!")
复制代码
运行完成后生成的效果栅格如下图所示:

3 降水数据参考文献格式

3.1 数据的引用

彭守璋. (2020). 中国1km分辨率逐月降水量数据集(1901-2023). 国家青藏高原数据中央. https://doi.org/10.5281/zenodo.3114194.
Peng, S. (2020). 1-km monthly precipitation dataset for China (1901-2023). National Tibetan Plateau / Third Pole Environment Data Center. https://doi.org/10.5281/zenodo.3114194.
3.2 文章的引用

1、Peng, S.Z., Ding, Y.X., Wen, Z.M., Chen, Y.M., Cao, Y., & Ren, J.Y. (2017). Spatiotemporal change and trend analysis of potential evapotranspiration over the Loess Plateau of China during 2011-2100. Agricultural and Forest Meteorology, 233, 183-194. https://doi.org/10.1016/j.agrformet.2016.11.129
2、Ding, Y.X., & Peng, S.Z. (2020). Spatiotemporal trends and attribution of drought across China from 1901–2100. Sustainability, 12(2), 477.
3、Peng, S.Z., Ding, Y.X., Liu, W.Z., & Li, Z. (2019). 1 km monthly temperature and precipitation dataset for China from 1901 to 2017. Earth System Science Data, 11, 1931–1946. https://doi.org/10.5194/essd-11-1931-2019
4、Peng, S., Gang, C., Cao, Y., & Chen, Y. (2017). Assessment of climate change trends over the loess plateau in china from 1901 to 2100. International Journal of Climatology.

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

缠丝猫

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表