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阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容