??本文介紹基于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
。
??明確了需求,我們就可以開始撰寫代碼。本文所用代碼如下。
# -*- 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 Nonetry:# 確保是整數,并轉換為字符串str_val = str(int(val))# 計算需要補充的0的數量padding_length = 6 - len(str_val)if padding_length > 0:# 在右側填充0formatted_val = str_val + '0' * padding_lengthelse:# 如果已經是或超過6位,則直接返回formatted_val = str_valreturn int(formatted_val)except ValueError:return Nonetif_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))continuereclass_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