zonal static as table重复区域无法统计的问题。

两个项目用到arcgis的zonal static as table功能,发现如果矢量有重叠的话,会导致其像元值只会被统计一次。对于此种情况,就采用遍历矢量要素,生成内存图层,然后对每一个矢量进行区域统计,得到结果再汇总。

在前人摸索的基础上,原教程是通过arcpy.list来汇总结果,但是发现会特别慢,因此本文通过py的dbfread模块来统计栅格值。

import arcpy,arcgisscripting,os
from arcpy.sa import *
from arcpy import env
# Local variables:
env.workspace=r"D:\cs.gdb" 

#矢量图层
CY50 = "CY50"

#栅格图层
rk="rk"

#得到cursor

inRows = arcpy.SearchCursor(CY50)
inRows.reset()
inRow = inRows.next()

#开始遍历,根据其OBJECTID来依次遍历(gdb中的数据不存在FID字段,任一唯一字段即可)

count=0
while inRow:

count+=1
    print "{0} is being processed".format(inRow.OBJECTID)

  #内存图层的名称
    lyr = "Zone {0}".format(inRow.OBJECTID)

#创建内存图层,详情见toolbox中的创建内存图层帮助
    arcpy.MakeFeatureLayer_management(  CY50, lyr, '"OBJECTID" = {0}'.format(inRow.OBJECTID))

#生成结果表的路径
    tempTable = "{0}/DBF_{1}.dbf".format(dbfPath, inRow.OBJECTID)
    try :

#对该内存图层进行区域统
        ZonalStatisticsAsTable(lyr, "OBJECTID", raster, tempTable, "DATA")
    except BaseException as  e :
        print ("")
    inRow = inRows.next()
    
from dbfread import DBF

#然后读取dbf汇总#切换到dbf生成的表格,将结果读到字典中

#读取dbf的函数,参数1为区域统计dbf生成的路径,第二个为矢量的个数

def readDBF(dbfpath,count):
    os.chdir(dbfpath)
    my_dic=dict()
    for i in range(count+1) :
        s= "DBF_" + str(i) + ".dbf"
        print("查找路径为"+dbfpath+"的表"+s)
        if (os.path.exists(s)):
            table = DBF(s, load=True)
            try:
                my_dic[str(i)]=table.records[0]['SUM']
            except BaseException as e:
                my_dic[str(i)]=0
        else :
            my_dic[str(i)]=str(0)
    return my_dic
    my_dicRK=readDBF(dbfpath,count)

#将结果字典写入到目标图层中

for s in my_dicRK.keys():
        print(s+":"+str(my_dicRK[s]))
    #将字典的值,依次写入到结果图层中
    os.chdir(dbpath)
    with arcpy.da.UpdateCursor(CY50,["rk_v","OBJECTID","rkbd_v","jz_v"]) as cursor2:
        for inRow2 in cursor2:
                try:
                    inRow2[0]=my_dicRK[str(inRow2[1])]
                    inRow2[2]=my_dicRKBD[str(inRow2[1])]
                    inRow2[3]=my_dicJZ[str(inRow2[1])]
                    cursor2.updateRow(inRow2)
                except BaseException as e:
                    print(e)

猜你喜欢

转载自blog.csdn.net/A873054267/article/details/83387142
今日推荐