基于Python脚本的ArcMap字段计算器分类赋值

由于出差等等原因,又没能很好的坚持记录博客,今天回来了,继续记录所学吧。

ArcMap中提供了“字段计算器工具”,实际上就是对Sql语句进行了可视化封装,形成了一个具有计算器外观的Sql语句编辑器窗口。利用字段计算器工具,我们可以直接在AacMap中针对图层的属性表进行数据的增删改查等操作,从而避免了操作图形的同时切换到Oracle、sqlserver、access等存储介质中操作属性表的麻烦。(以前批量处理数据时,采用的就是讲数据导进mdb中,然后利用Access打开写sql语句进行操作的方法,相比于字段计算器来说,麻烦的多)

字段计算器工具很方便,但是编辑起来交互不友好,而且python语法对于缩进要求很严格,这个编辑器也没有智能缩进和代码提示的功能,完全要求编辑者在类似纯记事本的状态下进行编辑,一定要十分谨慎认真才能执行出想要的结果。下面我们用具体事例来讲解操作过程。

如下图所示,


我们有一个图层,是关于一些两栖类和爬行类动物的数据,我们打开属性表,可以看到包含主键(OBJECTID),动物名称(NAME),科名称(FAMILY_NAME),目名称(ORDER_NAME),数量等级(NUMBER_CLASS),生境(ENVIRONMENT)等字段,其中生境这列字段的值是空的,需要填写,而这列值得内容和科名称这一列有相关性关系;一般来说,同一科的动物,其生境相同,比如:“游蛇科”的生境都是“草树丛”,“石龙子科”的生境都是“石壁、草丛”;这样我们就可以根据不同的“科名称”来对“生境”这一字段进行分类赋值。

1、选择字段,打开字段计算器:

首先打开图层的属性表,右击鼠标选中“生境(ENVIRONMENT)”字段,选择“字段计算器”选项并单击打开

<think>嗯,用户想在ArcGIS中根据原有字段对新字段进行重分类。首先,我需要回忆一下ArcGIS中处理字段和重分类的方法。记得可以通过字段计算器赋值,或者使用Python脚本进行更复杂的操作。用户提到创建新字段并基于原字段分类,可能需要分步骤进行:先创建字段,然后用计算器赋值。 首先,创建字段的方法。引用[1]里提到了用C#代码创建字段,但用户可能需要的是在ArcGIS桌面环境中操作,比如ArcMap或者Pro。通常在ArcGIS中添加字段可以通过属性表里的添加字段功能,或者使用工具“添加字段”。然后,重分类需要根据原字段的值来设置新字段的值,这涉及到条件判断,比如在字段计算器中使用Python的if-else语句。然后,引用[2]中的例子是用Python脚本字段计算器中根据地类编码赋值地类名称。用户的情况类似,需要根据原字段的值对新字段进行分类。比如,如果原字段是数值型,可能需要将某些范围的值映射到新类别。例如,将数值0-100分为“低”,100-200为“中”等。接下来,用户可能需要详细的步骤:第一步,创建新字段,设置正确的字段类型;第二步,使用字段计算器编写逻辑表达式,可能用代码块或者简单的Python脚本。还要注意字段是否存在,避免重复添加,这点在引用[1]的代码中有检查字段是否存在的步骤,这在实践中很重要,防止报错。另外,是否需要考虑性能问题?如果数据量大,使用Python脚本可能更高效。或者使用ArcPy脚本自动化处理,这对批量操作有帮助。用户可能需要多种方法,比如使用工具箱工具和编写脚本两种方式,满足不同需求。还要注意字段类型的匹配,比如原字段是文本还是数字,新字段的类型要合适。例如,重分类后的结果可能是文本类型,所以新字段应该设为文本,长度足够。或者如果是数值类别,可能需要短整型。可能用户会遇到的问题包括:字段计算器的语法错误,条件判断的逻辑错误,或者字段未正确创建。需要提醒用户检查字段名称是否正确,是否有空格或特殊符号,以及字段计算器的代码块是否正确使用了Python或VB语法。 最后,生成相关问题的时候,要考虑用户可能的后续需求,比如如何处理更复杂的分类,或者如何批量处理多个字段,或者如何结合其他工具如ArcPy进行自动化。</think>### ArcGIS创建新字段并基于原字段分类的步骤 #### 一、创建新字段 1. **打开属性表**:右键点击图层 → 打开属性表 2. **添加字段**: - 点击左上角`表选项` → `添加字段` - 设置字段名称(如`NewClass`)、类型(根据分类结果选择文本/整型)、长度等参数 - *注意:字段名称需遵循数据库命名规范(无空格、特殊符号)[^1]* #### 二、使用字段计算器分类 **方法1:简单条件赋值(适合少量分类)** ```python # 在"预逻辑脚本代码"框中输入: def classify(old_value): if old_value <= 100: return "低" elif 100 < old_value <= 200: return "中" else: return "高" # 下方表达式栏输入: classify(!原字段名!) ``` **方法2:复杂多条件映射(适合大量分类)** ```python # 使用代码块模式: def reclass(code): mapping = { 1: "森林", 2: "水域", 3: "耕地", 4: "建设用地" } # 扩展此字典添加所有映射关系 return mapping.get(code, "未分类") # 表达式: reclass(!地类编码字段!) ``` *注:此方法要求原字段值为整型且已建立完整映射表[^2]* #### 三、进阶方法:使用ArcPy脚本 ```python import arcpy feature_class = "图层路径" # 创建新字段 arcpy.AddField_management(feature_class, "NewClass", "TEXT", field_length=20) # 批量更新字段 with arcpy.da.UpdateCursor(feature_class, ["原字段", "NewClass"]) as cursor: for row in cursor: if row[0] < 0.2: row[1] = "一类" elif 0.2 <= row[0] < 0.6: row[1] = "二类" else: row[1] = "三类" cursor.updateRow(row) ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值