学习后的第一个arcpy实用工具出炉--三调统计口径下的地类图斑面积统计

本文介绍了作者在学习arcpy后,为解决乡镇级三调地类面积统计需求,开发了一个适用于国家三调统计口径的工具。该工具支持多种统计方式,考虑了城镇村用地范围,提供了灵活的地类选择和多种计量单位,实现了批量统计和信息提示,最终生成统计Excel文件。主程序采用py和pyt文件分离的方式编写,便于调试和维护。
摘要由CSDN通过智能技术生成

1、问题驱动:
       日常工作时常需要统计某县乡镇级三调各地类面积统计汇总,而国家下发的统计报表只到县市区级。乡镇级三调各地类面积只能自己手工统计。
       调查监测三调地类面积统计往往需基于国家三调统计口径来统计,这是一个较复杂的规则,目前很多程序未能完全适用这一面积统计规则,地类面积统计要考虑城镇村用地范围(调查数据库中的“CZCDYD”层)而不是简单的对乡镇范围(调查数据库"XZQ"层)内进行地类统计。
        基于上述原因,在学习arcpy两个月后,着手开发完成“三调地类面积统计(按行政区划)”工具。
2、工具功能描述:
       Arcmap 10.2.2, 编程IDE环境 pycham 2023.3.3
      为了便于调试,该工具核心程序放在*.py文件,工具的定义,参数获取在*.pyt文件中,通过from Statistics_By_Xzq import StatisticsForXZQ来调用*.py文件中的函数。

    def execute(self, parameters, messages):
        #该工具的源代码。
        WkspaceS=parameters[0].values   # parameters[0]:统计汇总的对象数据库文件集
        Unit = parameters[1].valueAsText   # parameters[1]:统计汇总单位
        exlfolder = parameters[2].valueAsText      # parameters[2]:统计汇总生产的文件存放文件夹路径
        statistics_type = parameters[3].valueAsText  # parameters[3]:统计汇总方式 如三调统计口径(城镇村不打开)
        statistics_Names = []
        for SatName in parameters[4].values:     # parameters[4]:统计汇总的一级地类清单
            statistics_Names.append(SatName[1:])
            # arcpy.AddMessage(SatName[1:])
        for wkspace in WkspaceS:
            from Statistics_By_Xzq import StatisticsForXZQ
            StatisticsForXZQ(wkspace, Unit, exlfolder, statistics_type, statistics_Names)
        return

        几个心得共享:
        一是通过该工具的开发基本掌握了arcmap自定义工具基于程序的开发,特别是根据统计方式的改变,在统计地类列表的联动变化,使用了.hasBeenValidated属性,而不是网上资料里提到
的.altered  属性来联动(导致联动混乱,试试就知道了)。

    def updateParameters(self, parameters):
        # 在执行内部验证之前,请修改参数的值和属性。只要参数已更改,就会调用此方法。
        stat_type=parameters[3]
        stat_Names=parameters[4]
        if parameters[3].hasBeenValidated==False:
            if stat_type.value==u'按年末库三调土地利用现状分类统计(不按三调统计口径,13大类)':
                stat_Names.values=['A湿地','B耕地','C园地','D林地','E草地','F商业服务业用地','G工矿用地','H住宅用地',
                                   'I公共管理与公共服务用地','J特殊用地','K交通运输用地','L水利及水利设施用地','M其他']
            elif  stat_type.value ==u'按国标GT/T21010-2017土地利用现状分类统计(不按三调统计口径,12大类)':
                stat_Names.values= ['A耕地','B园地','C林地','D草地','E商服用地','F工矿用地','G住宅用地',
                                    'H公共管理与公共服务用地','I特殊用地','J交通运输用地','K水利及水利设施用地','L其他']
            elif stat_type.value == u'按三调统计口径,仅统计城镇村内部(13大类)':
                stat_Names.values = ['A湿地','B耕地','C园地','D林地','E草地','F商业服务业用地','G工矿用地','H住宅用地',
                                     'I公共管理与公共服务用地','J特殊用地','K交通运输用地','L水利及水利设施用地','M其他']
            elif  stat_type.value ==u'按三调统计口径(城镇村不打开)' or stat_type.value ==u'按三调统计口径(城镇村打开)':
                stat_Names.values = ['A湿地','B耕地','C园地','D林地','E草地','F城镇村工矿用地','G交通运输用地','H水工建筑','I水利及水利设施用地','J其他']
        return

           二是程序中文编码问题。较好的解决方式,在py程序文件第一行声明utf-8 编码,程序中重新加载sys,并再次设置sys.setdefaultencoding('utf8'),能够较好地解决。

         

# -*- coding:utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf8')
   较好的解决方式在*.pyt文件中第一行声明必须为# -*- coding:GBK -*- 的GBK 编码,因为arcmap内不识别utf8编码,只能用GBK编码,但pyt文件和py文件两者中可以用不同编码来运行。另外,一个教训,在pyt文件中尽量不用转字符串 str函数,在开发过程中就因为在pyt文件中不经意间把一个参数用str()转了下,导致程序报编码错误,调试了一天才发现,问题在str()转换后编码不一定就是GBK编码。

UnicodeEncodeError: 'ascii' codec can't encode characters in position 14-16: ordinal not in range(128)

            三是字段计算器的操作,特别是椭球面积!shape.geodesicArea!重新计算速度较慢,一个字段计算器语句中无法对两个字段同时操作。期间 用字段计算器函数编程提高运行速度,实测后发现没有明显提升,最终放弃。后续升级会考虑编程统计图斑面的椭球面积,抛弃字段计算器,看看能不能提升速度。

expression = "getClass(!DLBM!,!TBDLMJ!,!shape.geodesicArea!)"
codeblock = """
def getClass(bm,tbmj,shp_mj):
    if bm in ['0303','0304','0306','0402','1105','1106','1108','0101','0102','0103','0201','0202','0203','0204',
    '0301','0302','0305','0307','0401','0403','0404','1101','1102','1103
Python三调地类面积统计是指使用Python编程语言对三调地类进行面积统计分析的过程。三调是指国家基础地理信息数据库中的三调数据,它主要包括土地利用现状、土地覆被变化等内容。 在进行面积统计之前,首先需要获取三调地类数据。可以使用Python中的地理信息系统(GIS)库,例如ArcPy、Geopandas等,来读取三调数据的矢量文件。然后,可以使用Python统计分析库,如Pandas和NumPy,对地类数据进行相应的预处理和统计计算面积统计可以包括以下步骤: 1. 数据预处理:根据需要,对三调地类数据进行清洗和筛选,去除无效数据或不相关的属性字段。 2. 地类分类统计:根据地类代码或属性字段,对三调地类进行分类统计计算每个地类的面积。 3. 面积计算:根据地类分类的结果,利用空间分析功能,计算每个地类的面积。可以利用地理信息系统库中的面积计算函数,如ArcPy中的"CalculateAreas_stats"函数。 4. 结果展示:根据需求,可以将面积统计结果以表格、图表或地图等形式进行展示。可以使用Python的可视化库,如Matplotlib和Seaborn,将统计结果可视化。 通过使用Python编程语言,我们可以自动化处理和分析大量三调地类数据,减少了人工操作的繁琐,提高了统计分析的效率和准确性。同时,Python提供了丰富的地理信息处理和分析的库和工具,使得面积统计分析变得更加方便和灵活。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值