Python的ArcPy基于Excel表格对大量遥感影像批量重分类

本文介绍基于Python 中的ArcPy模块,以Excel 表格内的信息,对遥感影像加以重分类的方法。

首先,明确一下本文的需求。现有按照文章ArcPy批量将栅格文件的属性表导出为Excel表格的方法https://blog.csdn.net/zhebushibiaoshifu/article/details/146456864)中方法,从大量遥感影像中导出的栅格数据属性表,其均为`.csv`格式的表格文件。以其中一个`.csv`格式文件为例,其数据信息如下图所示。

其中,.csv文件的VALUE列表示遥感影像原本的像素值;而我们希望,将每一个像素,由原本的值(VALUE列)重分类为上图中mvalue列表示的值------例如,如果原本像素为1,那么将其重分类为123000。此外,还需要注意,对于mvalue列,如果其原本的数字位数不够6位,则在其右侧补0直至满6位------例如,如果mvalue列原本的值为23,那么需要在重分类时,重分类为230000

明确了需求,我们就可以开始撰写代码。本文所用代码如下。

python 复制代码
# -*- coding: utf-8 -*-

import arcpy
import os
import pandas as pd
from arcpy.sa import *

tif_folder = r'E:/06_Extra/202503_SC/TIFF/'
csv_folder = r'E:/06_Extra/202503_SC/Re/'
output_folder = r'E:/06_Extra/202503_SC/ReTIFF2/'

def format_value(val):
    """确保 mvalue 值为6位,在右侧补0"""
    if val == "":
        return None
    try:
        # 确保是整数,并转换为字符串
        str_val = str(int(val))
        # 计算需要补充的0的数量
        padding_length = 6 - len(str_val)
        if padding_length > 0:
            # 在右侧填充0
            formatted_val = str_val + '0' * padding_length
        else:
            # 如果已经是或超过6位,则直接返回
            formatted_val = str_val
        return int(formatted_val)
    except ValueError:
        return None

tif_files = [f for f in os.listdir(tif_folder) if f.endswith('.tif')]

for tif_file in tif_files:
    tif_path = os.path.join(tif_folder, tif_file)
    print(tif_path)
    
    csv_file = tif_file.replace('.tif', '.tif.csv')
    csv_path = os.path.join(csv_folder, csv_file)
    print(csv_path)
    
    df = pd.read_csv(csv_path)
    df = df.dropna(subset=['mvalue'])
    df['mvalue'] = df['mvalue'].apply(format_value)
    df = df.dropna(subset=['mvalue'])  # 再次删除格式化后可能产生的NaN值
    if df.empty:
        print("No valid data found in {}, skipping.".format(csv_file))
        continue
    
    reclass_rules = []
    for index, row in df.iterrows():
        value = int(row['Value'])
        mvalue = int(row['mvalue'])
        print(mvalue)  # 打印格式化后的 mvalue 值
        reclass_rules.append((value, mvalue))
    
    myRemapValue = RemapValue(reclass_rules)
    reclass_table = arcpy.sa.Reclassify(tif_path, "Value", myRemapValue, "NODATA")
    
    # 输出路径
    output_path = os.path.join(output_folder, tif_file)
    
    # 保存重分类后的栅格数据
    reclass_table.save(output_path)

print("Batch processing completed.")

其中,代码整体思路也很简单。

首先,tif_folder是存储.tif格式栅格图像文件的路径,csv_folder是存储与每个.tif文件对应的.csv文件的路径,也就是包含重分类规则的Excel 文件的路径;output_folder则是用于保存处理后的重分类结果(也是.tif文件)的路径。

随后,format_value函数接收一个数值val,将其转换成字符串,并保证长度为6位;如果不足6位,则在右侧填充0,如果输入为空或无效值,则返回None

接下来,列出tif_folder目录下所有以.tif结尾的文件名,并循环遍历每一个文件------首先构建当前.tif文件的完整路径,随后查找对应的.csv文件(同名但扩展名为.tif.csv的文件);使用Pandas 读取.csv文件,删除mvalue列中为空的行,对mvalue列应用上面定义的format_value函数进行格式化;随后,再次删除格式化失败导致的空值;如果处理后没有有效数据,跳过该文件。

紧接着,遍历DataFrame 的每一行,提取Value和格式化后的mvalue,将它们构造成一个元组(原值, 新值),存入reclass_rules列表。随后,使用arcpy.sa.RemapValue()创建一个映射规则对象,并调用arcpy.sa.Reclassify()进行重分类------输入栅格为tif_path,按照像素值Value进行重分类(应用myRemapValue规则),且未匹配的像素设为NODATA

最后,构建输出路径,并保存重分类后的栅格图像到指定位置。处理完所有文件后打印完成信息。

执行上述代码,即可对每一个遥感影像,按照每一个Excel文件内的规则,加以重分类。

至此,大功告成。

欢迎关注:疯狂学习GIS

相关推荐
THMAIL1 天前
机器学习从入门到精通 - 机器学习调参终极手册:网格搜索、贝叶斯优化实战
人工智能·python·算法·机器学习·支持向量机·数据挖掘·逻辑回归
ERP老兵-冷溪虎山1 天前
Python/JS/Go/Java同步学习(第三篇)四语言“切片“对照表: 财务“小南“纸切片术切凭证到崩溃(附源码/截图/参数表/避坑指南/老板沉默术)
java·javascript·python·golang·中医编程·四语言同步学习·职场生存指南
科技树支点1 天前
无GC的Java创新设计思路:作用域引用式自动内存管理
java·python·go·web·编程语言·编译器
THMAIL1 天前
机器学习从入门到精通 - 集成学习核武器:随机森林与XGBoost工业级应用
人工智能·python·算法·随机森林·机器学习·集成学习·sklearn
程序员miki1 天前
Pytorch的CUDA版本安装使用教程
人工智能·pytorch·python
小冷coding1 天前
随时随地写代码:Jupyter Notebook+cpolar让远程开发像在本地一样流畅
ide·python·jupyter
偷心伊普西隆1 天前
Pandas DataFrame 指南
python·数据分析·pandas
Yokon_D1 天前
Pycharm终端pip install的包都在C:\Users\\AppData\Roaming\Python\解决办法
python·pycharm·pip
爱补鱼的猫猫1 天前
pytorch可视化工具(训练评估:Tensorboard、swanlab)
人工智能·pytorch·python
川石课堂软件测试1 天前
Oracle 数据库使用事务确保数据的安全
数据库·python·功能测试·docker·oracle·单元测试·prometheus