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

相关推荐
思则变1 小时前
[Pytest] [Part 2]增加 log功能
开发语言·python·pytest
漫谈网络2 小时前
WebSocket 在前后端的完整使用流程
javascript·python·websocket
try2find3 小时前
安装llama-cpp-python踩坑记
开发语言·python·llama
博观而约取4 小时前
Django ORM 1. 创建模型(Model)
数据库·python·django
精灵vector6 小时前
构建专家级SQL Agent交互
python·aigc·ai编程
Zonda要好好学习6 小时前
Python入门Day2
开发语言·python
Vertira6 小时前
pdf 合并 python实现(已解决)
前端·python·pdf
太凉6 小时前
Python之 sorted() 函数的基本语法
python
项目題供诗6 小时前
黑马python(二十四)
开发语言·python
晓13137 小时前
OpenCV篇——项目(二)OCR文档扫描
人工智能·python·opencv·pycharm·ocr