
來源頭條作者:瘋狂學習GIS??本文介紹基于Python語言,結合已知研究區域中所覆蓋的全部遙感影像的分幅條帶號,從大量的遙感影像文件中篩選落在這一研究區域中的遙感影像文件的方法。??首先,先來明確一下本文所需實現的需求。現已知一個研究區域(四川省),且已知覆蓋這一研究區域所需的全部遙感影像的分幅條帶號(這里就以Sentinel-2數據所采用的分幅規則為例來介紹),如下圖所示。??其中,矢量圖層上的標簽(Label)就是所需的遙感影像的分幅條帶號;且這一矢量要素的屬性表中,有具體每一個分幅條帶號的具體字段(如上圖紅色方框所示的那一列)。??同時,我們還下載好了大量的遙感影像——這些遙感影像數量眾多,既有位于這一研究區域內的遙感影像,同時還有位于研究區域外的。其中,這里所有的遙感影像都保存在一個大文件夾下,而這一大文件夾下還有多個子文件夾,具體遙感影像就存在于子文件夾中;如下圖所示。??其中,紅色框內的文件夾即為前述“大文件夾”,紫色框內的每一個文件夾即為前述“子文件夾”。此外,每一個子文件夾的命名也是和遙感影像的分幅條帶號對應的,比如43LCC這一個子文件夾就是保存了UTM編號為43的網格內的全部遙感影像。這里關于Sentinel-2遙感影像分幅條帶號的介紹,如果大家有需要,可以參考Sentinel-2哨兵2號MGRS分幅介紹與矢量文件下載這篇文章。??同時,在每一個遙感影像文件的文件名中,都有分幅條帶號這一字段;例如,打開43LCC這一子文件夾,如下圖所示。??我們希望實現的,就是基于上圖所示的研究區域內遙感影像的分幅條帶號信息,在大量的遙感影像中篩選出這些分幅對應的遙感影像文件,并將其通過復制的方式放入到一個新的結果文件夾中。??了解了具體需求,我們就可以開始代碼的撰寫。首先,本文所需的完整代碼如下所示。# -*- coding: utf-8 -*-
"""
Created on Fri Feb 3 18:33:11 2023
@author: fkxxgis
"""
import os
import xlrd
import shutil
xls_file = r"E:\02_Project\Sentinel.xls"
tif_path = r"G:\S2_CSI_LCC_product\LCC_10days_2020"
result_path = r"G:\Select"
book = xlrd.open_workbook(xls_file)
sh = book.sheet_by_index(0)
row_num = sh.nrows
for row in range(1, row_num):
mgrs = sh.cell(row,6).value
utm = mgrs[0:2]
for root, dirs, files in os.walk(tif_path):
for name in dirs:
if name[0:2] == utm:
for root_1, dirs_1, files_1 in os.walk(os.path.join(root, name)):
for name_1 in files_1:
if name_1.find(mgrs) != -1:
if not os.path.exists(os.path.join(result_path, mgrs)):
os.makedirs(os.path.join(result_path, mgrs))
print("Make " + mgrs + " path.")
shutil.copy(os.path.join(root, name, name_1), os.path.join(result_path, mgrs, name_1))??其中,我們需要導入os、xlrd與shutil等3個Python庫,分別實現系統文件遍歷、Excel數據讀取與研究區域內遙感影像數據的復制。其中,關于xlrd庫的配置,如果大家是用的Anaconda環境,可以參考Anaconda配置Python中的xlrd庫這篇文章。此外,我們首先需要將本文開頭提及的表示遙感影像數據分幅條帶號的矢量文件的屬性表導出(通過“System Toolboxes”→“Conversion Tools.tbx”→“Excel”→“Table To Excel”選項,如下圖所示),保存為.xls格式的表格文件,從而方便我們后期代碼對數據的讀取。??在代碼中,xls_file表示我們將屬性表導出后得到的.xls格式的表格文件,tif_path表示存放所有遙感影像的大文件夾,result_path則表示找到我們所需的結果遙感影像文件后,希望將其復制到的路徑。??隨后,我們通過xlrd.open_workbook()函數打開.xls格式的表格文件,讀取其中的數據并獲取其行數row_num;接下來,我們即可對這一表格文件的單元格數據加以遍歷,也就是代碼中的第1個for循環——我們從第2行開始(因為第1行是表頭),讀取每一行第7列的數據(也就是存放有遙感影像分幅條帶號的那一列),從而依次獲取所需的遙感影像條帶號。??接下來,由于遙感影像的分幅條帶號的前兩位,以及前述子文件夾名稱的前兩位,都是表示UTM編號的兩位數字,因此我們通過utm = mgrs[0:2]這句代碼,截取當前遙感影像分幅條帶號的前兩位,并通過os.walk()函數進行遍歷,通過一個if判斷語句找到大文件夾下對應的子文件夾;隨后,在這一子文件夾中同樣通過os.walk()函數,進行遙感影像文件的遍歷——也就是代碼中第2個、第3個、第4個for循環所做的事情。??接下來,針對遍歷得到的子文件夾中每一個遙感影像文件,我們通過.find()函數找到所有滿足這一分幅條帶號的遙感影像文件,也就是代碼中第5個for循環與第2個if判斷語句的工作。找到符合當前分幅條帶號的遙感影像文件后,我們即可開始將其復制到目標文件夾中。??這里還有一個需求,因為我們這里保存的是多時相遙感影像數據(即每一個分幅條帶號對應著多個不同時相的遙感影像文件),因此我們希望在目標文件夾中,同樣用各個分幅條帶號作為名稱,創建多個子文件夾;然后將當前分幅條帶號對應的全部遙感影像數據放入這一文件夾中。基于此,我們通過os.path.exists()函數判斷是否存在指定的子文件夾,如果不存在的話就新建這一文件夾;隨后,通過shutil.copy()函數復制這些遙感影像文件。??運行上述代碼,最終我們得到的結果如下圖所示;其中,每一個子文件夾都表示一個分幅條帶號,子文件夾內即為這一分幅條帶號所對應的全部時相的遙感影像文件。??至此,大功告成。歡迎關注:瘋狂學習GIS
暫時沒有評論,來搶沙發吧~