【Python】使用Python调用Fragstats批量进行万级及以上数据的景观指数运算
目錄
- 1 簡介
- 2 拆分和合并腳本文件
- 3 根據(jù)腳本集批量計算景觀指數(shù)
- 4 懶得學python或者沒有python環(huán)境的解決方案
1 簡介
兩個月前師姐替別人問我一個問題,
當時僅僅只是會使用界面化的fragstats,再加上搜遍全網(wǎng)也沒搜到使用python進行批量景觀指數(shù)計算的方法,因此沒能很好地回答師姐朋友的問題,但是還是通過檢索推薦了一些材料(材料1,材料2),感興趣的同學們可以參考一下。
后來在做一個課題時,我自己也要使用大規(guī)模的fragstats運算,才花點時間好好靜下心來研究這個題目所提到的內容。
這應該是全網(wǎng)第一個使用python調用fragstats批量進行萬級及以上數(shù)據(jù)的景觀指數(shù)運算的代碼教程,并且在博文的末尾還提供了0代碼的傻瓜解決方案(可以直接跳轉到本文第4節(jié))(但是我建議大家看完全文再尋求傻瓜方案,或者至少熟悉界面化的fragstats操作)。
開始說正題——
重點——本文針對的場景是:已經(jīng)通過arcgis或其他方法制作了漁網(wǎng)(fishnet)并且把一個tif根據(jù)漁網(wǎng)格網(wǎng)分裂成成千上萬個帶編號的小方格tif集,本文的目標在于接下來計算這些帶編號的小方格tif集的各種景觀指數(shù)。在這里,本文假設同學們已經(jīng)會使用界面化的fragstats,并且會制作批量景觀計算的fbt腳本文件(也就是import batch需要導入的文件)。
本文思路在于:
1,為了解決fragstats這個軟件原生性的問題,即單個過大腳本容易報錯,所以要切割拆分腳本,將其分割成多個批量任務進行景觀指數(shù)計算;
2,可以通過python調用cmd再調用fragstats的frg.exe文件計算景觀指數(shù)(關于cmd調用fragstats可以看這篇博文),從而實現(xiàn)自動完成多個批量任務(注意,這里是批量完成批量腳本任務,即批量的批量)。
因此,本文包括以下兩部分:
1,拆分批量運算的腳本文件(默認為fbt文件,但本文中為了方便使用csv格式的腳本);
2,根據(jù)腳本文件集批量計算景觀指數(shù)。
2 拆分和合并腳本文件
在這里已經(jīng)假設了各位同學知道腳本文件的構成并且知道如何制作批量運算腳本文件,所以不多贅述。如果有不清楚的可以參考這篇博文。
我的其中一個腳本文件長下面這個樣子,我為了方便存成csv格式的,當然你要存txt或者默認的fbt都行,只需要稍微修改一下我后面要提到的代碼。
然后我使用代碼將它分裂成30個(只展示其中一部分)。
然后。。然后就沒了。。
但是關鍵的來了,下面是代碼,要用到的依賴包很少,只有兩個基礎包+一個pandas(pandas也很基礎,沒有裝的自己反思一下然后光速安裝)。
代碼是傻瓜式代碼,因為使用了input語句,所以一上去運行就行了(但是理解起來也不難)。
運行完分為兩種模式,模式1是合并,是為了將一些稀碎的腳本或最終計算完成的結果合并為一個csv準備的;模式2是拆分,就是本小節(jié)的主要任務。因為直接使用了input,所以代碼也可以直接使用命令行調用。
拆分的操作如下(其實只要按指引填上相關的路徑和信息即可):
需要注意的是,拆分后的文件除了增加文件的索引(就是1到30)還增加了文件內條目的個數(shù),這對于我們控制fragstats的運算是有幫助的,因為如果一個腳本里太多條目了容易崩掉(懂得都懂)。。。并且這個崩不崩掉和電腦的性能關系不是太大,在這里的批量運算中建議拆分后單個腳本的條目個數(shù)<300(親測最穩(wěn)定快速)。
至于合并就不展示了,就是倒過來操作,運行一下選模式1根據(jù)指引輸入?yún)?shù)就可。
再補充一點,這個代碼目前只能識別csv文件,會無視掉同一個目錄下的其他格式文件,有其他需求的可以自己改改,改完可以識別.class文件。
3 根據(jù)腳本集批量計算景觀指數(shù)
在開始通過python調用fragstats計算景觀指數(shù)前,為了確保代碼能夠使用,需要把fragstats安裝目錄添加到環(huán)境變量中,如下圖。
變量值填你自己的路徑奧,別照搬我的。不懂得配置環(huán)境變量的同學可以另行百度。
你如果跟我皮,不添加也行,可以直接使用frg.exe的絕對路徑運行fragstats,具體在這里不細說,有需要的同學可以參考這篇博文的方法修改代碼。
下面是代碼(添加環(huán)境變量后才能良好運行的代碼,沒添加的自己改改),一樣,使用了input,直接運行然后輸入?yún)?shù)即可。
import os from glob import glob import pandas as pddef frg_cmd(model, scripts_dir, output_dir): # 模型路徑,腳本所在目錄,輸出目錄csv_scripts = glob(os.path.join(scripts_dir, "*.csv")) # 抓取目錄下全部csv文件for csv_script in csv_scripts:output_file = os.path.join(output_dir, os.path.split(csv_script)[1])output_file = os.path.splitext(output_file)[0]print("=====================================================")print(f"model: {model}")print(f"script: {csv_script}")print(f"output: {output_file}")print("\n")frg_flag = 0while frg_flag == 0:os.system(f"frg -m {model} -b {csv_script} -o {output_file}") # 命令行執(zhí)行read_csv_script = pd.read_csv(csv_script) # 讀取腳本文件read_output_file = pd.read_csv(output_file+".class") # 讀取輸出文件read_csv_script = pd.DataFrame(read_csv_script)read_output_file = pd.DataFrame(read_output_file)if len(read_csv_script) == len(read_output_file): # 如果條目數(shù)匹配frg_flag = 1print("data match!")else:print("data do not match! Restart!")print("\n")print(f"{output_file} is completed!")print("=====================================================")model = input("請輸入模型路徑:") scripts_dir = input("請輸入腳本目錄:") output_dir = input("請輸入輸出目錄:") frg_cmd(model, scripts_dir, output_dir)模型路徑,就是你在界面化中勾選的一些要計算的景觀指數(shù)然后保存的.fca文件。
腳本目錄,就是上面制作的csv腳本的目錄,在這個代碼默認只能識別csv格式的腳本。
輸出目錄,就是你要保存結果的目錄。
我輸入的信息如下,可以參考(根據(jù)實際情況設置,不要無腦照抄):
然后就是和在界面化fragstats終端中輸出的信息類似的,首先是加載,
然后是分析計算,
需要注意的是,我的代碼中加入了輸出結果的腳本中數(shù)量的比對,如果數(shù)量不一致就會自動重新計算,這樣可以避免出錯漏算一些條目(解決腳本中條目太多會中斷漏算的問題),所以還是建議大家把每個腳本的條目數(shù)弄少一點(建議<300)。
最后等終端顯示計算完成出現(xiàn)相關提示后就可以在你的輸出文件夾里看到.class的結果文件了。
我一般是把后綴直接改成.csv打開就行了。
上圖中我先跑出了三個(為了寫博客沒必要都跑出來結果),我的電腦跑一個200+條目(格子)的腳本的結果大概花不到1分鐘,簡單來說就是不慢。
我自己的一個研究二十多萬個條目(tif或格子)分成1000+個csv也才用不到一天時間,如果想要很快可以放在多臺電腦上,這東西不需要什么算力。
說回正題,把導出的結果.class文件改成.csv后綴直接打開如下。
好了,這就得到我們最終需要的結果了。
如果需要合并結果,用第2節(jié)的代碼切到合并格式然后輸入相關信息合并即可。
4 懶得學python或者沒有python環(huán)境的解決方案
我簡單把上面兩個代碼封裝了一下,方便不會python或沒有python環(huán)境的同學。
這兩個exe在一般windows電腦都可以運行,打開即可(但是仍然用要把fragstats添加到環(huán)境變量中)。
現(xiàn)在只要V我50吃頓肯德基,即可獲取下面兩個封裝后的傻瓜版exe。
重新說一邊奧,為了幫助到?jīng)]有python環(huán)境和不會python同學(會python的同學直接運行第2、3節(jié)的代碼,不用再問我啦),我把上面的代碼封裝成兩個小程序,直接打開即可實現(xiàn)類似上面的操作。但是下面兩個小程序是有償獲取的(知識付費,隨便打賞50元以上即可),需要的同學可以聯(lián)系我郵箱(chinshuuichi@qq.com)并且貼上打賞付款證明(碼在下面),我看到后就會在附件中貼上這兩個小程序給你。(記得在郵件里說明要哪篇博客的材料啊!之前一些博客也有提供類似有償服務,總是有同學不說明要啥,很耽誤時間。)
如果對你有幫助,還望支持一下~點擊此處施舍或掃下圖的碼。
-----------------------分割線(以下是乞討內容)-----------------------
總結
以上是生活随笔為你收集整理的【Python】使用Python调用Fragstats批量进行万级及以上数据的景观指数运算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux入门篇(1)
- 下一篇: LBP特征原理及代码实现