Python初遇見

去年花了3天時間,學習了Python 的語法,除當時寫了幾個小游戲之外,一直沒有用于實踐解決實際問題。解決實際問題是學習編程的最好方法。學習Python最初的目的是用python寫arcgis腳本,完成批處理。剛好,一個師妹最近要處理大批量的global30的數據,于是我試著用Python寫了個批處理。做一個記錄,記下寫代碼過程中遇到到問題和解決辦法,方便以后查閱。

程序目標

將800多個分副的Global30數據中的人工建設用地提取出來,轉成Shaplefile文件,再合成一個完整的shapefile文件。
用到的arcgis 模塊有 Feature Clip, Reclassify, PolygontoRaster, Feature Merge.

程序實現

要素遍歷

批處理程序第一步肯定是要獲取需要處理的所有文件,也就是文件遍歷。Arcpy站點包中,為Arcgis的Feature\Raster\Table等要素專門設置了函數,分別為arcpy.ListFeatureClasses()arcpy.ListRasters()、arcpy.ListTable()等。返回的是文件名的list集合。

功能實現

ArcGis 中對每一個ArcToolBox 中的工具基本都有對應的Python語句,可以從幫助中查詢。

FeatureClip

arcpy.Clip_management(precRaster, "#", outfile, shapeList[i], "0", "ClippingGeometry")

Reclassfiy

Reclassify(outfile, "Value", RemapRange([[0, 79, "NODATA"], [80, 80, 1], [81, 255, "NODATA"]]), "NODATA")
Reclassify 中提供兩種重分類的賦值方法,意思范圍RemapRange,另外是一對一賦值RemapValue.
Reclassify 如果沒有柵格屬性表,可能回報錯。因此在Reclassify 前要創建一個柵格屬性表。可用arcpy.BuildRasterAttributeTable_management(outfile, "Overwrite")創建。

PolygontoRaster

arcpy.RasterToPolygon_conversion(outReclass, outPolygons, "NO_SIMPLIFY", "Value")

Feature Merge

arcpy.Merge_management(featureList, "OutFiles.shp")

輔助函數

文件名解析

文件名解析也是批處理中重要的一個內容,可以方便地控制輸出文件。可用OS 模塊或者,用split分割輸入文件名。再用 + 連接新的字符串,形成輸出文件名。

調試

調試是寫程序的重要工作,“行百里者半九十”,調試就是那最后的占一半的10percent。
Python 中調試的語句是:

try:
    語句
except:
    錯誤處理

可以提示錯誤在哪兒,也可以進行下一步操作。

完整代碼

# -*- coding: utf-8 -*-
##Clip



import arcpy
from arcpy import env
from arcpy.sa import *

# arcpy.env.workspace = r"D:\JM\HelpOthers\global20\data"
arcpy.env.workspace = r"E:\goble"
rasterList = arcpy.ListRasters("*")
shapeList = arcpy.ListFeatureClasses("*")
# print rasterList, shapeList
n = len(rasterList)
m = len(shapeList)
print "共有" + str(n) + "副柵格"
error = open("E:\\goble\\error.txt", "w")
eundo = open("E:\\goble\\eundo.txt", "w")
enoarti = open("E:\\goble\\enoarti.txt", "w")
# outfile = "test_clip.tif"
if m == n:
    for i in range(0, n, 1):
        # 柵格裁剪 如果裁剪失敗,提示錯誤但不終止重新
        precRaster = rasterList[i]
        # print precRaster, shapeList[i]

        outfile = arcpy.env.workspace + "\\temp\\" + precRaster.split(".")[0] + "_clip.tif"
        try:
            print "clip Raster"
            arcpy.Clip_management(precRaster, "#", outfile, shapeList[i], "0", "ClippingGeometry")
        except:
            print precRaster, shapeList[i],"Clip Failed"
            print arcpy.GetMessages()
            error.write(precRaster+ " " +shapeList[i]+" Clip Failed")
            error.write(arcpy.GetMessages())
            outfile = precRaster
            pass
                

        # 重分類
        arcpy.CheckOutExtension("Spatial")

        try:
            print "Reclassify"
            outReclass = Reclassify(outfile, "Value", RemapRange([[0, 79, "NODATA"], [80, 80, 1], [81, 255, "NODATA"]]), "NODATA")
            outfile = arcpy.env.workspace + "\\temp\\" + precRaster.split(".")[0] + "_Reclass.tif"
            outReclass.save(outfile)
        except:
            print precRaster, shapeList[i],"Reclassify Failed"
            print arcpy.GetMessages()
            error.write(precRaster+" "+ shapeList[i]+" Reclassify Failed")
            error.write(arcpy.GetMessages())
            str1 =  precRaster+" "+ shapeList[i] + " undo"
            eundo.write(str1)
            continue
                
        print "判斷個數"
        # 獲取分類后的柵格獨立值個數,判斷是否有80這個值,有的話輸出shape,沒有則不輸出
        arcpy.BuildRasterAttributeTable_management(outfile, "Overwrite")
        # 獲取唯一值函數
        uniq = arcpy.GetRasterProperties_management(outfile, "UNIQUEVALUECOUNT")

        # 柵格轉矢量
        print "轉柵格"
        if str(uniq) != str(0):
            outPolygons = arcpy.env.workspace + "\\ShapeFile\\" + precRaster.split(".")[0] + ".shp"
            arcpy.RasterToPolygon_conversion(outReclass, outPolygons, "NO_SIMPLIFY", "Value")
            # else:
            #    print precRaster + "NO 80"
            #合并所有shapefiles
        else:
            print precRaster + "no 80"
            str2 = precRaster + " "
            enoarti.write(str2)
    arcpy.env.workspace = arcpy.env.workspace + "\\ShapeFile"
    featureList = arcpy.ListFeatureClasses("*")
    arcpy.Merge_management(featureList, "Global30all.shp")
    print "完成啦!"
    eundo.close()
    error.close()
    enoarti.close()
else:
    print "個數不一致"
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,701評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,691評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,974評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,694評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,026評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,193評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,719評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,442評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,668評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,846評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,255評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,592評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,394評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容