本次我们学习的是关于如何利用arcpy实现,给定一个字段名,和一些给定关于该字段名一些具体值。然后统计关于该字段名中不是在给定具体值中其他列值。具体来说就是,我们现在有一个字段名GBCODE,然后里面有很多值,你比如说61030,61031,61032、61033,61034等等,而现在呢,我们需要统计除了61030,61031,61032其他值的数目。那么如和实现呢,首先我们需要验证一些输入的字段名是否在我们给定的shapefile文件中,然后统计给定的shapefile所有列名称,然后使用遍历所有的数据行,然后统计出所有的不是在给定的值,即可。
#coding=utf-8
import os
import arcpy
import sys
def getFieldNames(fc):
fieldList = []
for f in arcpy.ListFields(fc):
fieldList.append(str(f.name))
return fieldList
def getCount( fc):
r = arcpy.GetCount_management(fc)
return int(r.getOutput(0))
def validateField(fc, colName, valueList):
print("\n验证要素类 %s..." % os.path.basename(fc))
rowCount = getCount(fc)
print("需要验证 %s 个字段值 根据字段 %s..." % (rowCount, colName))
fields=getFieldNames(fc)
if not colName in getFieldNames(fc):
print("列名 %s 没有找到!" % colName)
return ("列没有找到", None, None)
rowCount = getCount(fc)
processedCount = 0
badRows = 0
badRowList = []
badValueList = []
badValueIndex = {}
OIDField = arcpy.Describe(fc).OIDFieldName
with arcpy.da.SearchCursor(fc, [colName, OIDField]) as c:
for row in c:
processedCount += 1
badVal = row[0]
badRowOID = row[1]
if not badVal in valueList:
badRows += 1
badRowList.append(badRowOID)
badValueList.append(badVal)
if badVal in list(badValueIndex.keys()):
badValueIndex[badVal].append(badRowOID)
else:
badValueIndex[badVal] = [badRowOID]
sys.stdout.write('\r')
print("OK rows: %s. Bad rows: %s. (%s%s)" % (
processedCount - badRows, badRows, round(((processedCount / rowCount) * 100), 1), '%'),)
print("\n完成字段值的验证 %s. %s 个列值是没有在给定数据里" % (colName, badRows))
if badRows > 0:
print("警告: %s 个非法列值关于 %s.字段值" % (badRows, colName))
return (badRowList, badValueList, badValueIndex)
else:
return (None, None, None)
data="D:\\Data\\中国国界和省界的SHP格式数据\\省界\\bou2_4l.shp";
validateField(data,'GBCODE',[61030,61031,61032]);
最后的统计结果如下图所示。
更多内容,请关注公众号