国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

arcpy中中文路徑的處理方案

2019-11-08 01:57:31
字體:
來源:轉載
供稿:網友

(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中,關于這一猜測的正確性驗證,將在我的第二篇博客中繼續探尋。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宿迁市| 高要市| 黄石市| 滨海县| 平昌县| 彰化县| 长丰县| 敖汉旗| 广南县| 吴堡县| 花莲县| 太仆寺旗| 句容市| 潼南县| 黔西县| 东源县| 连云港市| 荆州市| 阿瓦提县| 东宁县| 遵义县| 长宁区| 和平县| 安图县| 泗水县| 洱源县| 精河县| 保德县| 子长县| 呼玛县| 连城县| 虎林市| 宜兰市| 冀州市| 晋州市| 鄂温| 白朗县| 台南市| 五原县| 扎鲁特旗| 平和县|