(2017/2/20:這是我寫的第一篇博客,沒有什么經驗,謹以此記錄最近學習python的點滴;希望能為以后留下一些時光的記憶。)
最近再學習《面向ArcGIS的python腳本編程》一書,學習到第六章第五節(P119):"對列表使用for循環"時,發現一段對柵格數據進行批處理的代碼非常有效,于是決定一試,原文代碼如下:
這段代碼可以實現將某個目錄下的tiff格式圖片一次性加載到ArcMap中,創建影像金字塔并打開,而我的電腦中:“C:/ArcGIS_test/測試用遙感影像”目錄上剛好有100張tif格式的遙感影像,因此,我再IDLE中敲入上述代碼塊,將“env.workspace = ” 后面的路徑換成我的路徑“C:/ArcGIS_test/測試用遙感影像/J47F013048.tif”,為了防止arcpy不能識別中文路徑,我還特意寫成了“ u"C:/ArcGIS_test/測試用遙感影像" ”以便讓編輯器能識別路徑字符串中的中文。可是代碼執行的結果卻如下圖:

代碼報了一個錯誤:“ ‘NoneType’ object is not iterable”,這句報錯是怎么回事呢?感覺應該和字符串中出現的中文字符有關,于是修改for的操作為:“PRint tiff.name”用以輸出列表中的tif圖片的名稱,結果仍報上述錯誤:

百度報錯內容,結果是:

于是想到肯定是列表中出現了空值None,而通過for語句將None不斷的賦值給每一個tiff,因此報錯,為了證明,執行代碼“print tifflist”,結果如下:
說明tifflist這個列表中并沒有值,也就是說arcpy.ListRasters("","TIF")這個函數并沒有獲取到工作空間目錄下的圖片內容,從而進一步斷定應該是工作空間目錄中出現中文字符的問題,于是,利用arcpy的Exists函數來判斷一下工作空間目錄下的tif圖片是否存在。(catalog目錄樹中,“C:/ArcGIS_test/測試用遙感影像”目錄下是客觀存在99張tif圖片的)

再將這張圖片J47F013048.tiff直接復制到C:/ArcGIS_test目錄下,并用Exists函數檢測有無,結果如下:

由此可以看出,catalog這兩個目錄下的同名圖片事實上都是客觀存在的,但是一旦路徑中出現中文,Exists函數就不能檢測到圖片的存在,說明Arcpy的確不能識別中文路徑,證明了自己猜想的正確性,于是,再次百度Arcpy不能識別中文路徑的解決方案,并在如下鏈接(http://www.xuebuyuan.com/412913.html)的文章中找到答案,下面轉述一下該文章內容:
{
《ArcGIS 中 Python 漢字使用說明》
這里只針對ArcGIS中ArcToolbox中調用Python時使用漢字的情況。
1.如果實用的標準參數傳入的方法,和字符串使用方法一樣,沒有什么特別之處。如:grouplayer_name = arcpy.GetParamenterAsText(0) #傳入變量帶漢字
判斷相等時直接使用如下格式:
lyr.name == grouplayer_name
這里都是變量之間的操作,沒有直接漢字的使用,ArcGIS默認使用unicode編碼。
2.在程序中直接使用漢字字符串,這時必須使用編碼轉換,如Grouplayer_name == "圖層組1".decode('gb3212')
這里的decode的作用是將其他編碼的字符串轉換成Unicode編碼,表示將gb2312編碼的字符串str1轉換成Unicode編碼。encode的作用是將Unicode編碼轉化成其他編碼的字符串,表示將Unicode編碼的字符串str2轉換成gb2312編碼。因此,轉碼的時候一定要先搞明白,字符串str是什么編碼,然后decode成unicode,然后再encode成其他編碼。
}
有該文章紅字部分說的,只要將工作空間路徑中出現的中文路徑字符串后利用“.decode("gb2312")”進行轉碼應該就行了,于是使用這個方法重寫上述代碼進行測試:

說明該方法果然奏效,能讓Exists函數正常識別出中文路徑下的tif影像;為此,用該轉碼方法重寫工作空間路徑,并打印柵格列表,進行測試:

柵格列表也能被檢測到,進一步說明轉碼方法有效,下面重新執行創建柵格影像金字塔的批處理操作,并檢測結果:

高興的太早了,又出現了上面這樣的報錯,百度一下,得到的解決方案差不多,在文件頭利用sys.setdefaultencoding("utf-8")來解決,兩個方法的百度來源如下:

再次重寫代碼,并在開始使用上述方法來嘗試:果然不再報錯:

終于解決了arcpy中使用中文路徑不被識別的問題,但是,打開的ArcMap文檔中并未像預想的那樣加載入所有99張影像,利用arc.GetMessages()函數獲取工具執行消息,也返回空內容,這說明arcpy.BuildPyramids_management()函數應該只是對柵格影像創建了金字塔,而不能將其加載到mxd中,關于這一猜測的正確性驗證,將在我的第二篇博客中繼續探尋。
新聞熱點
疑難解答