首页 > 编程语言 >Python 栅格数据处理教程(二)

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

时间:2024-08-14 16:07:14浏览次数:14  
标签:Pre raster 教程 栅格 Python 栅格数据 import arcpy Jilin

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

1 数据来源及介绍

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

2 示例代码

2.1 降水量单位转换

import os
import arcpy
from arcpy import sa
from tqdm import tqdm   # 进度条工具,需自行安装

# 设置工作空间
arcpy.env.workspace = "Pre_Jilin.gdb"

# 如果在代码同级文件夹中没有结果数据库,则创建该数据库
if "Pre_Jilin1.gdb" not in os.listdir("."):
    print("即将为您创建用于保存结果栅格的文件地理数据库(Pre_Jilin1.gdb)……")
    arcpy.CreateFileGDB_management(".", "Pre_Jilin1")
    print("数据库创建完成!")

# 遍历工作空间内所有栅格数据
for raster in tqdm(arcpy.ListRasters()):
    # 通过栅格计算器将栅格值单位转换为 mm,并保存到结果数据库
    sa.RasterCalculator([raster], [raster], f"{raster} * 0.1").save(f"Pre_Jilin1.gdb/{raster}")
print("计算完成!")

栅格数据转换前如下所示:

image

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

image

2.2 根据各月份降水量生成年降水量栅格

import os
import arcpy
from arcpy import sa
from tqdm import tqdm

# 设置工作空间
arcpy.env.workspace = "Pre_Jilin1.gdb"

# 创建栅格文件字典,以年份为键,值为该年份对应的各月份降水量栅格列表
file_dict = dict()
for raster in arcpy.ListRasters():
    if raster[4:8] not in file_dict:
        file_dict[raster[4:8]] = [raster]
    else:
        file_dict[raster[4:8]].append(raster)

# 如果在代码同级文件夹中没有结果数据库,则创建该数据库
if "Pre_Jilin_Year.gdb" not in os.listdir("."):
    print("即将为您创建用于保存结果栅格的文件地理数据库(Pre_Jilin_Year.gdb)……")
    arcpy.CreateFileGDB_management(".", "Pre_Jilin_Year")
    print("数据库创建完成!")

# 定义变量名,并构建代数表达式,以对输入栅格执行空间分析
# 以 a-l 代表12个月份的降水量栅格,求全年总降水量
input_names = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"]
expression = "a + b + c + d + e + f + g + h + i + j + k + l"

# 遍历栅格文件字典
for year in tqdm(file_dict):
    # 提取历年降水量栅格,通过栅格计算器生成年降水量栅格,并保存到结果数据库中
    sa.RasterCalculator(file_dict[year], input_names, expression).save(f"Pre_Jilin_Year.gdb/Pre_{year}")
print("计算完成!")

2023年吉林省年降水量栅格如下图所示:

image

2.3 统计研究区年降水量的最值、均值、标准差等信息

import os
import arcpy
from arcpy import sa
from tqdm import tqdm

# 设置工作空间
arcpy.env.workspace = "Pre_Jilin_Year.gdb"

# 如果在代码同级文件夹中没有结果数据库,则创建该数据库
if "Pre_Jilin_Year_Info.gdb" not in os.listdir("."):
    print("即将为您创建用于保存结果栅格的文件地理数据库(Pre_Jilin_Year_Info.gdb)……")
    arcpy.CreateFileGDB_management(".", "Pre_Jilin_Year_Info")
    print("数据库创建完成!")

# 遍历工作空间内所有栅格数据
for raster in tqdm(arcpy.ListRasters()):
    # 统计吉林省范围内年降水量的最值、均值、标准差等信息,并以表格的形式保存到结果数据库中
    sa.ZonalStatisticsAsTable("Data/Jilin.shp", "FID", raster, f"Pre_Jilin_Year_Info.gdb/{raster}")
print("统计完成!")

2.4 将统计信息表格导出为 txt 文本文件

import os
import arcpy
from tqdm import tqdm

arcpy.env.workspace = "Pre_Jilin_Year_Info.gdb"

# 如果在代码同级文件夹中没有结果文件夹,则创建该文件夹
if "Pre_Jilin_Year_Table" not in os.listdir("."):
    print("即将为您创建用于保存转换结果的文件夹(Pre_Jilin_Year_Table)……")
    os.mkdir("Pre_Jilin_Year_Table")
    print("文件夹创建完成!")

# 遍历工作空间内所有表格,将表格逐一导出为 txt 文本文件
for table in tqdm(arcpy.ListTables()):
    arcpy.ExportTable_conversion(table, f"Pre_Jilin_Year_Table/{table}.txt")
print("转换完成!")

2023 年的统计信息文本如下所示:

image

2.5 将历年的 txt 文件整理为 Excel 表

import os
import pandas as pd

pre_dict = dict()
# 遍历文件列表
for fileName in os.listdir("Pre_Jilin_Year_Table"):
    # 通过后缀名判断是否为 txt 文件
    if fileName[-4:] == ".txt":
        # 基于 UTF-8 编码读取 txt 文件内容
        with open(f"Pre_Jilin_Year_Table/{fileName}", "r", encoding="utf-8") as file:
            file_txt = file.readlines()
            # 文本内容的第一行是标题,第二行是数据
            # 读取第二行数据第5个数值开始的所有数据值,即 MIN,MAX,RANGE,MEAN,STD,SUM,MEDIAN,PCT90
            # 将这些数据值合并为列表
            # 注:ArcGIS Pro 不同版本转换得到的 txt 数据表字段可能不同,需要根据实际情况调整代码
            val_list = file_txt[1].replace("\n", "").split(",")[4:]
        # 将所有数据值从字符串类型转换为数值类型
        for i in range(len(val_list)):
            val_list[i] = eval(val_list[i])
        # 以数值类型年份为键,数据值列表为值,将数据存入字典
        pre_dict[eval(fileName[4:8])] = val_list

# 将字典转换为 DataFrame 二维数据表
df = pd.DataFrame(pre_dict, index="MIN,MAX,RANGE,MEAN,STD,SUM,MEDIAN,PCT90".split(",")).T
print(df)

# 将 DataFrame 导出为 Execl 表格
df.to_excel("Pre_Jilin_Year_Table.xlsx")
print("导出表格完成!")

简单调整 Excel 表的格式后,其展示效果如下图所示:

image

2.6 基于历年降水量生成多年平均降水量栅格

import os
import arcpy
from arcpy import sa

# 设置工作空间,并根据数据库中的栅格数据数量确定年份数量
arcpy.env.workspace = "Pre_Jilin_Year.gdb"
year_num = len(arcpy.ListRasters())

# 定义变量名,并构建代数表达式,以对输入栅格执行空间分析
# input_names = ["Pre_2001", "Pre_2002", "Pre_2003", ......, "Pre_2021", "Pre_2022", "Pre_2023"]
# expression = "(Pre_2001 + Pre_2002 + Pre_2003 + ...... + Pre_2021 + Pre_2022 + Pre_2023) / 23"
input_names, expression = [], ""
for raster in arcpy.ListRasters():
    input_names.append(raster)
    if expression == "":
        expression += raster
    else:
        expression += f" + {raster}"
expression = f"({expression}) / {year_num}"

# 如果在代码同级文件夹中没有结果数据库,则创建该数据库
if "Pre_Jilin_Mean.gdb" not in os.listdir("."):
    print("即将为您创建用于保存结果栅格的文件地理数据库(Pre_Jilin_Mean.gdb)……")
    arcpy.CreateFileGDB_management(".", "Pre_Jilin_Mean")
    print("数据库创建完成!")

# 计算多年平均降水量栅格并保存到结果数据库中
sa.RasterCalculator(arcpy.ListRasters(), input_names, expression).save("Pre_Jilin_Mean.gdb/Pre_Mean")
print("计算完成!")

运行完成后生成的结果栅格如下图所示:

image

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.

标签:Pre,raster,教程,栅格,Python,栅格数据,import,arcpy,Jilin
From: https://www.cnblogs.com/qsgeo/p/18359178

相关文章

  • CTFHub~SQL注入超简单详细教程
    0x01整数型注入#本题告诉我们是整数型,所以就很容易了#判断字段数量1orderby2#判断回显点-1unionselect1,2#查询全部数据库名-1unionselect1,group_concat(schema_name)frominformation_schema.schemata#判断数据库中的表名-1unionselec......
  • Python - 详情介绍Zmail发送邮件(支持普通&企业邮箱,163、QQ、gmail...)
    Python-详情介绍Zmail发送邮件为了满足在python项目中收发邮件给其他人,可利用自己的邮箱账号结合Zmail来完成。Zmail使得在python3中发送和接受邮件变得更简单。你不需要手动添加服务器地址、端口以及适合的协议。Zmail仅支持python3,不需要任何外部依赖.不支持python2......
  • springboot+vue《Python数据分析》的教学系统【程序+论文+开题】-计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着大数据时代的到来,数据分析技能已成为各行各业不可或缺的核心竞争力之一。Python,作为一门高效、灵活且拥有丰富数据分析库的编程语言,正逐步成为数据分析领域的主流工具。然而,当前高等教育体系中,《Python数据分析》课程的教学仍面临......
  • IP SSL证书快速申请教程
    在互联网安全领域中,SSL证书是比较普遍的传输数据加密方式之一。SSL证书通过建立加密通道,确保客户端与服务器之间传输的数据不被第三方窃取或篡改。而大多数SSL证书,如单域名SSL证书、多域名SSL证书以及通配符SSL证书,在申请时必须有一个拥有管理权的域名网站,而没有域名网站的,只......
  • 通配符SSL证书快速申请教程
    目前SSL里面通配符证书使用率比较广,虽然没有单域名那么普及,但通配符仅次于单域名SSL证书,主要原因是因为通配符具备保护申请域名及下一级域名无限制的使用,好处是通配符SSL证书无需再另外花钱去买证书,一本通配符SSL证书可以涵盖了子域名,适合未来或者现在有很多子域名的网站。......
  • Robyn与FastAPI全面对比:选择最适合你的Python Web框架
    引言1.1背景介绍在当今的软件开发领域,选择合适的Web框架对于项目的成功至关重要。Python作为一种广泛使用的编程语言,其生态系统中涌现出了众多优秀的Web框架,如FastAPI和Robyn。FastAPI自发布以来,因其高性能、易用性和自动生成API文档的特性,迅速成为开发者的首选。而Robyn......
  • 3163:【例27.3】 第几项(C、C++、python)
    3163:【例27.3】第几项信息学奥赛一本通-编程启蒙(C++版)在线评测系统[例27.3]第几项2020:【例4.5】第几项信息学奥赛一本通(C++版)在线评测系统27.3_哔哩哔哩_bilibiliC语言代码:#include<stdio.h>#include<stdlib.h>intmain(){intm,s=0,n=0;s......
  • Python轻量级 NoSQL 数据库之tinydb使用详解
    概要在现代应用开发中,使用数据库来存储和管理数据是非常常见的需求。对于简单的数据存储需求,关系型数据库可能显得过于复杂。TinyDB是一个纯Python实现的轻量级NoSQL数据库,专为嵌入式场景设计,适用于小型项目、原型开发和教学等场景。本文将详细介绍TinyDB库,包括其安......
  • Python之sys.argv功能使用详解
    概要在Python编程中,命令行参数是与程序交互的重要方式之一。通过命令行参数,用户可以在运行脚本时传递输入值,从而影响程序的行为。Python提供了一个非常方便的模块——sys,其中的sys.argv列表可以轻松地获取命令行参数。在本文中,将深入探讨sys.argv的使用方法,结合实际示例展示......
  • Python编程中不可忽视的docstring使用详解
    概要在Python编程中,代码的可读性和可维护性至关重要。除了清晰的命名和结构良好的代码外,良好的文档字符串(docstring)也是确保代码易于理解和使用的关键工具。docstring是Python中用于记录模块、类、方法和函数行为的字符串,帮助开发者和用户快速了解代码的功能和用法。本文将......