基于属性表不同字段的不同记录值空间插值

2020-10-13 14:18发布

需求:

基于属性表不同字段(例如:砷、镉、铜、铅、汞、镍)和属性表中分层字段中的不同分层(第1层、第2层.........、第6层)的要素记录进行空间插值。

例如:在空间插值之前,将字段基于分层字段细分为6个单独的砷图层,即第1层的砷字段对应的要素数据、第2层的砷字段对应的要素数据、第3层的砷字段对应的要素数据、第4层的砷字段对应的要素数据、第5层的砷字段对应的要素数据、第6层的砷字段对应的要素数据;其它字段(镉、铜、铅、汞、镍)均遵循此数据选择方式,当然了这些过程都是在代码中完成的。

代码(pycharm中编译):

# -*-coding:utf-8-*-
import arcpy
from arcpy import env
 
# Set workspace
env.coincidentPoints = "MAX"
env.workspace = "D:/test/data.mdb"
 
 
# 定义污染指标
pollutionParameter = ['砷', '镉', '铜','铅', '汞', '镍']
 
# 遍历污染指标
for indexwrzb in pollutionParameter:
        count = 1
        print("污染指标: "+indexwrzb)
        # 遍历每个污染指标分层类型,例如:第1层、第2层、第3层、第4层、第5层、第6层
        for layerId in range(6):
            in_features = "土壤污染数据全区"
            out_feature_class = "土壤污染%s数据全区第%s层" %(indexwrzb, (layerId + 1))
 
            currentWrzb = '[%s]' % indexwrzb
            where_clause = '%s>0 and [分层]="第%s层" ' % (currentWrzb, (layerId + 1))
            # Execute Select
            arcpy.Select_analysis(in_features, out_feature_class, where_clause)
 
            inPointFeatures = out_feature_class
            #判断图层要素记录的条数,如果少于3条则提示不能进行空间差值操作;
            #如果多余或者等于3条,那么可以进行空间插值操作
            featureRecord = arcpy.GetCount_management(inPointFeatures)
            featureRecordCount = int(featureRecord.getOutput(0))
            print (str(indexwrzb)+"的图层"+str(count)+"的要素记录条数为: "+str(featureRecordCount))
            if(featureRecordCount>2):
                    #将当前遍历出的污染指标赋值给zField,用此作为空间插值的Z值
                    zField = indexwrzb
                    outLayer = "outLPI"+str(indexwrzb)+str(count)
                    outRaster = "D:/test/" + str(indexwrzb) + "数据第" + str(layerId+1) + "层.tif"
                    cellSize = 3
                    power = 2
 
                    # Set variables for search neighborhood
                    majSemiaxis = 250
                    minSemiaxis = 250
                    angle = 0
                    maxNeighbors = 15
                    minNeighbors = 10
                    sectorType = "ONE_SECTOR"
                    searchNeighbourhood = arcpy.SearchNeighborhoodStandard(majSemiaxis, minSemiaxis,
                                                                           angle, maxNeighbors,
                                                                           minNeighbors, sectorType)
 
                    # Check out the ArcGIS Geostatistical Analyst extension license
                    arcpy.CheckOutExtension("GeoStats")
 
                    # Execute IDW
                    arcpy.IDW_ga(inPointFeatures, zField, outLayer, outRaster, cellSize,power, searchNeighbourhood,"")
                    count = count + 1
            else:
                    print (str(indexwrzb)+"图层"+str(count)+"的要素记录少于3个,不能进行空间差值......")
                    continue
 
print ("ok.......")

注意事项:

(1)# -*-coding:utf-8-*-    如果脚本中有中文字符,则需要在脚本第一行加上utf-8的编码

(2)env.coincidentPoints = "MAX",多个点重合在一起,用其中值最大的点来进行插值。

(3)len(pollutionParameter)   获取字段wrzb的长度,此示例中wrzb的长度是6

(4)range(6)   输出记录[0,1,2,3,4,5],从0开始到6,参考链接:http://www.runoob.com/python/python-func-range.html 

(5)where_clause = '[砷]>0 and [分层]="第%s层" ' % (indexwrzb + 1)    条件语句,获取字段下属性值大于0且分层字段属性值为第%s层的要素记录,其中%s是一个变量值。

(6)在代码中判断图层要素记录的条数,如果少于3条则提示不能进行空间差值操作; 如果多余或者等于3条,那么可以进行空间插值操作。

(7)获取要素记录的数量,用下述代码实现:

featureRecord = arcpy.GetCount_management(inPointFeatures)featureRecordCount = int(featureRecord.getOutput(0))

(8)arcpy.CheckOutExtension("GeoStats")是用于检查地统计分析扩展的许可,如果是在独立的python编译器中需要检查扩展许可,如果在arcgis自带的python window中则不要检查扩展许可。

日志输出:

污染指标: 砷
砷的图层1的要素记录条数为: 455
砷的图层2的要素记录条数为: 683
砷的图层3的要素记录条数为: 272
砷的图层4的要素记录条数为: 16
砷的图层5的要素记录条数为: 6
砷的图层6的要素记录条数为: 1
砷图层6的要素记录少于3个,不能进行空间差值......
污染指标: 镉
镉的图层1的要素记录条数为: 455
镉的图层2的要素记录条数为: 683
镉的图层3的要素记录条数为: 273
镉的图层4的要素记录条数为: 16
镉的图层5的要素记录条数为: 6
镉的图层6的要素记录条数为: 1
镉图层6的要素记录少于3个,不能进行空间差值......
污染指标: 铜
铜的图层1的要素记录条数为: 455
铜的图层2的要素记录条数为: 683
铜的图层3的要素记录条数为: 273
铜的图层4的要素记录条数为: 16
铜的图层5的要素记录条数为: 6
铜的图层6的要素记录条数为: 1
铜图层6的要素记录少于3个,不能进行空间差值......
污染指标: 铅
铅的图层1的要素记录条数为: 455
铅的图层2的要素记录条数为: 683
铅的图层3的要素记录条数为: 273
铅的图层4的要素记录条数为: 16
铅的图层5的要素记录条数为: 6
铅的图层6的要素记录条数为: 1
铅图层6的要素记录少于3个,不能进行空间差值......
污染指标: 汞
汞的图层1的要素记录条数为: 455
汞的图层2的要素记录条数为: 682
汞的图层3的要素记录条数为: 273
汞的图层4的要素记录条数为: 16
汞的图层5的要素记录条数为: 6
汞的图层6的要素记录条数为: 1
汞图层6的要素记录少于3个,不能进行空间差值......
污染指标: 镍
镍的图层1的要素记录条数为: 455
镍的图层2的要素记录条数为: 683
镍的图层3的要素记录条数为: 273
镍的图层4的要素记录条数为: 16
镍的图层5的要素记录条数为: 6
镍的图层6的要素记录条数为: 1
镍图层6的要素记录少于3个,不能进行空间差值......
ok.......

参考资料:

http://www.runoob.com/python/python-func-range.html    range函数的用法

https://blog.csdn.net/u010608964/article/details/87428910     利用arcpy遍历shp文件并获取要素记录数



作者:gislaozhang

链接:https://blog.csdn.net/gislaozhang/article/details/89420024

来源:CSDN
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。