解析ArcGis的字段计算器(一)——数值型数据计算,从“面积计算”开始

本文介绍了如何在ArcGIS的字段计算器中进行数值型数据计算,特别是针对面积计算。文章强调了VBScript与Python的区别,并提供了正确使用字段的格式。作者分享了面积计算的两种方法:计算几何和Python语句,并讨论了面积单位转换、舍入和取整的技巧,包括四舍五入的实现和随机数生成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先来点儿背景知识铺垫:

ArcMap的字段计算器提供了两种脚本语言的支持用以计算,两种脚本语言是VBScript与Python。

多数人选择使用前者,因为它的基本函数和Excel的函数貌似一样。注意我这里用了一个“貌似”,虽然Excel函数与VB函数有着千丝万缕的关系,但它毕竟不是VB函数(ArcMap里用VBScript),把Excel函数照搬进ArcMap的计算器,许多是不可以运行的。使用VBScript函数正确的打开方式应该是查询VBScript帮助。至于VB、VBA、VBScript啥关系,不讲。

在ArcMap的字段计算器里,VBScript语句中字段(Field)应该用“[field_Name]”的样式输入,Python语句中字段应该用“!field_Name!”的样式输入。(提醒“新来的”,①不要把这玩意儿“”抄过去,②所有符号应为英文的)。

Tip:数值型与字符串型拼接的常见错误

不论在VBScript还是Python,"面积:"+1.2 这样的写法都是错误的。

+适用于字符串类型的连接,在VB中,字符串与数值连接可以使用 & ;而在Python中, "面积:"+str(1.2) 这样一个转换是必要的。

 


作者:yzhyingcool
ArcGis交流群:

<think>我们被要求使用字段计算器(Field Calculator)在ArcGIS中完成两个操作: 1. 将字段数值加1 2. 添加前缀 假设我们有字段名为“FieldName”,我们想要生成的新字符串是:前缀 + (字段数值+1)的字符串形式。 例如,如果原字段值为10,前缀为“P-”,那么结果应该是“P-11”。 我们可以使用Python代码块来实现。在字段计算器中,选择Python解析器,然后编写个函数。 注意:字段计算器中的表达式是针对每个记录单独计算的。 步骤: 1. 打开属性表,右键点击要计算字段(或者新建字段),选择“字段计算器”。 2. 选择“Python”作为解析器。 3. 在“代码块”中定义个函数,该函数接收原始值,并返回处理后的字符串。 4. 在下面的表达式框中调用这个函数。 但是,如果原始字段是文本类型,我们需要先将其转换为整数,然后加1,再转换为字符串,最后加上前缀。 如果原始字段是数值类型(如整型、浮点型),则可以直接加1。 然而,问题中要求添加前缀,所以最终结果定是字符串。因此,我们可能需要将结果字段设置为文本类型。 如果是在原有字段计算,那么原有字段必须是文本类型,否则无法存储字符串。如果是新建字段,则字段类型应为文本。 假设我们有个文本字段存储原始数值(如"10"),或者我们有个数值字段(如10),我们都可以处理。 为了通用性,我们可以这样设计: - 如果字段是字符串,先转换为数值,然后加1,再转换为字符串,加上前缀。 - 如果字段是数值,直接加1,然后转换为字符串,加上前缀。 但是,在字段计算器中,我们通常知道字段的类型,所以可以根据实际情况调整。 这里,我们假设原始字段是数值类型(比如整型),那么我们可以这样写: 代码块: ```python def add_prefix(original_value, prefix): # 将原始值加1,然后转换为字符串,再添加前缀 return prefix + str(original_value + 1) ``` 然后在表达式框中: ``` add_prefix(!FieldName!, "P-") ``` 注意:这里的前缀“P-”可以根据需要修改,也可以写死为某个字符串。 但是,如果原始字段是文本类型,存储的是数字字符串,那么我们需要先转换: ```python def add_prefix(original_value, prefix): # 尝试将字符串转换为整数,然后加1,再转换为字符串,最后加前缀 try: num = int(original_value) return prefix + str(num + 1) except: # 如果转换失败,可以返回原始值或者错误标记 return "Error" ``` 但是,根据问题描述,我们可能知道字段是数值类型,所以可以简化。 然而,为了安全起见,我们可以使用个函数同时处理数值和字符串(如果字符串可以转换为数值的话)。 但是,在ArcGIS中,字段计算器中的Python环境是受限的,我们尽量简单处理。 根据引用[4]中提供的例子,他们使用了自定义函数,并且通过条件判断来赋值,我们可以参考。 因此,我们采用以下步骤: 1. 在代码块中定义函数,该函数接收原始值和前缀字符串。 2. 在函数内部,将原始值转换为整数(如果原始值是字符串,则先转换;如果已经是整数,也可以直接使用)。 3. 加1,然后转换为字符串,加上前缀。 但是注意:如果原始字段是浮点数,那么使用int()会丢失小数部分。所以,如果字段是浮点型,我们应该使用float(),然后根据需求决定是否取整。 但是问题要求是“数值”,并且是加1,通常整数加1是整数,浮点数加1可能还是浮点数。但问题没有明确,所以我们假设是整数。 如果实际是浮点型,而用户希望整数,那么可以取整。否则,保留小数。 但是,问题描述是“数值加1”,没有说明是整数还是浮点数。为了通用,我们可以这样: 如果原始值是整数,则加1后转换为整数再转字符串(避免小数部分出现.0);如果是浮点数,则保留小数。 但是,在字段计算器中,我们无法直接判断数值是整数还是浮点数,因为字段计算器传递进来的数值,如果是整数字段就是整数,浮点数字段就是浮点数。 因此,我们可以这样处理: 如果字段是整型,那么加1后还是整数,直接转换为整数再转字符串(这样就不会有小数部分)。 如果字段是浮点型,那么加1后还是浮点数,然后转换为字符串(可能带小数部分)。 但是,用户可能希望统为整数?或者统保留原样?问题没有明确。 考虑到问题要求是“加1”,通常对于整数和浮点数都是直接加1。所以,我们不加区分,直接加1,然后转换为字符串。 因此,函数可以写为: ```python def add_prefix(value, prefix): # 因为传入的value可能是整数或浮点数,但都支持加1 # 加1后转换为字符串 return prefix + str(value + 1) ``` 但是,如果原始值是NULL怎么办?在ArcGIS中,NULL值传入Python会变成None,这样计算会出错。所以我们需要处理NULL值。 处理NULL值:如果值为None,我们可以返回个特定的字符串,比如前缀加上"NULL"或者空字符串,或者保持NULL(但字符串字段不能为NULL,所以我们可以返回空字符串或者特定标记)。 根据实际情况,我们可以这样: ```python def add_prefix(value, prefix): if value is None: # 返回空字符串或者指定的字符串,例如"NULL" return prefix + "NULL" # 或者 return "" else: return prefix + str(value + 1) ``` 但是,如果原始字段是字符串类型,并且存储的是数字,那么我们需要先转换为数字,然后加1,再转换为字符串。但是,如果原始字段是字符串类型,那么传入的value就是字符串,所以我们需要转换。但是,如果原始字段是字符串类型,那么我们在字段计算器中,选择这个字段时,它传入的是字符串,即使字符串内容是数字。 所以,为了同时支持数值字段和字符串字段(字符串字段中存储的是数字),我们可以这样: 我们尝试将传入的值转换为浮点数(这样整数和浮点数都可以处理),然后加1,再转换为字符串。但是这样会丢失整数的小数部分?比如整数5会变成6.0,然后字符串变成"6.0",但我们可能只想要"6"。 所以,我们可以判断转换后的数字是不是整数(即加1后还是整数),如果是整数,我们就用整数形式,否则保留浮点数。 但是这样比较复杂。而且,如果原始字符串是整数,我们转换为浮点数后,加1,再判断是否为整数:如果原始整数是5,则加1后是6.0,判断6.0是否为整数?我们可以用`is_integer()`方法,但注意,这个方法只对浮点数对象有效。 所以,我们可以这样: ```python def add_prefix(value, prefix): if value is None: return prefix + "NULL" try: # 尝试转换为浮点数 num = float(value) num += 1 # 判断加1后的数是否为整数 if num.is_integer(): # 转换为整数再转字符串,去掉小数部分 return prefix + str(int(num)) else: return prefix + str(num) except: # 如果转换失败,说明value不是数字字符串,那么我们可以返回错误,或者原值加1(但原值不是数字,所以无法加1) # 这里我们返回原值加上前缀,并且后面加上个1(因为要求加1,但无法计算,所以直接拼接1?) # 或者按照要求,我们可能希望保留原值并加1?但这样不符合逻辑。所以,我们返回个错误信息,或者原字符串拼接1? # 问题没有明确,我们这里选择返回前缀+原字符串+“1”(因为要求是加1,但无法转换为数字,所以将1当作字符串拼接) # 但是,这样不符合“数值加1”的要求。所以,另种做法是返回个错误标记。 # 根据实际需求,我们这里返回前缀+原字符串+“1”作为示例,但用户可以根据需要修改。 return prefix + value + "1" ``` 但是,这样处理可能并不符合所有情况。因此,我们需要根据实际字段类型来决定使用哪种方法。 鉴于问题描述中,用户希望将字段数值加1,所以通常该字段应该是数值类型(整型或浮点型)。如果是字符串类型,那么它存储的应该是数字字符串。因此,我们可以简化处理:假设字段是数值类型或者可以转换为数值的字符串。 为了简单,我们假设字段是数值类型(整型或浮点型),那么我们可以忽略字符串转换的情况。这样,函数可以简化为: ```python def add_prefix(value, prefix): if value is None: return "" # 或者返回prefix+"NULL" return prefix + str(value + 1) ``` 因为数值类型直接支持加1。 但是,在ArcGIS中,如果字段是数值类型,但某些记录为空(NULL),那么传入的value就是None,所以需要处理None。 因此,我们采用这个简化版本。 步骤: 1. 确保要计算字段是文本类型(因为结果包含前缀,是字符串)。如果原字段不是文本类型,我们可以在个新字段(文本类型)中存储结果。 2. 在字段计算器中,选择Python解析器。 3. 在“代码块”中输入: ```python def add_prefix(value, prefix): if value is None: return "" # 或者根据需求返回个默认值,比如prefix+"0" 或者 "" return prefix + str(value+1) ``` 4. 在表达式框中输入: ``` add_prefix(!原字段!, "前缀字符串") ``` 例如,前缀为"A-",则输入: ``` add_prefix(!FieldName!, "A-") ``` 注意:如果原字段是整型,那么加1后转换为字符串,例如10变成"11";如果是浮点型,10.5变成"11.5"。 如果用户希望整数结果不显示小数部分,我们可以修改函数,判断是否为整数(在数值上),然后决定是否转换为整数再转字符串。但是,由于数值类型在字段计算器中传递的是Python的float类型(对于浮点字段)或int类型(对于整型字段)?实际上,在ArcGIS字段计算器中,整数字段会作为整数对象传入,浮点字段会作为浮点数对象传入。 因此,我们可以使用类型判断: ```python def add_prefix(value, prefix): if value is None: return "" # 判断value是否是整数类型(注意:整数类型包括int,但浮点数即使整数部分也不是int类型) if isinstance(value, int): return prefix + str(value+1) elif isinstance(value, float): # 如果是浮点数,我们加1后,判断是否为整数 new_value = value + 1 if new_value.is_integer(): return prefix + str(int(new_value)) else: return prefix + str(new_value) else: # 如果是其他类型,尝试转换为浮点数再处理 try: num = float(value) new_value = num + 1 if new_value.is_integer(): return prefix + str(int(new_value)) else: return prefix + str(new_value) except: return prefix + value + "1" # 或者处理错误 ``` 这个函数更通用,但更复杂。如果字段类型明确,我们可以简化。 考虑到效率,如果字段是整型,我们使用第个简单函数即可。所以,我们根据字段类型选择。 但是,问题没有明确字段类型,所以我们提供通用版本。 然而,在大多数情况下,如果字段是数值类型(整型或浮点型),我们可以使用以下函数(处理NULL和数值): ```python def add_prefix(value, prefix): if value is None: return "" # 或者返回个默认值 # 直接加1,然后转换为字符串 return prefix + str(value+1) ``` 因为整数和浮点数都支持加1操作,并且转换为字符串后,浮点数会带小数部分(如11.0),整数则没有小数部分(如11)。但是注意,在Python中,整数加1后还是整数,转换为字符串就是不带小数点的;浮点数加1后还是浮点数,转换为字符串会带小数点(即使整数部分,如11.0)。 所以,如果原始字段是浮点型,那么结果可能是"11.0",而用户可能只想要"11"。因此,我们可以判断下加1后的数值是不是整数(数学意义上的整数),如果是,则用整数形式表示。 修改如下: ```python def add_prefix(value, prefix): if value is None: return "" new_value = value + 1 # 判断new_value是否为整数(注意:整数类型直接判断,浮点数用is_integer) if isinstance(new_value, int): return prefix + str(new_value) elif isinstance(new_value, float) and new_value.is_integer(): return prefix + str(int(new_value)) else: return prefix + str(new_value) ``` 这个函数可以处理整数和浮点数,并且当结果是整数时,去掉小数部分。 但是,如果value是字符串类型,这个函数会出错。所以,我们假设字段是数值类型。 因此,我们推荐用户:如果原始字段是字符串类型,但存储的是数字,那么先转换为数值字段再进行计算,或者使用更通用的函数(如上文处理字符串转换的复杂函数)。 但是,为了回答简洁,我们假设用户字段是数值类型,使用上述函数即可。 操作步骤总结: 1. 打开属性表,右键单击要计算字段(确保是文本类型,或者新建个文本字段)。 2. 打开字段计算器。 3. 选择“Python”解析器。 4. 在“代码块”中输入以下代码(以处理数值类型为例,并优化显示): ```python def add_prefix(value, prefix): if value is None: return "" # 或者自定义默认值 result = value + 1 # 优化显示:如果是整数,则用整数形式;如果是浮点数且为整数,也用整数形式;否则用浮点数 if isinstance(result, float) and result.is_integer(): return prefix + str(int(result)) elif isinstance(result, int): return prefix + str(result) else: return prefix + str(result) ``` 5. 在表达式框中输入:`add_prefix(!原字段名!, "前缀字符串")`,例如:`add_prefix(!NumberField!, "P-")` 注意:如果原始字段是整型,那么`value+1`的结果是整型;如果是浮点型,则是浮点型。 这样,当原始值为10(整型)时,结果为"P-11";当原始值为10.0(浮点型)时,因为10.0+1=11.0,且11.0是整数,所以转换为"P-11";当原始值为10.5时,结果为"P-11.5"。 如果用户希望所有结果都显示为整数(即四舍五入或者取整),那么需要修改。但问题没有要求,所以按原数值处理。 另外,如果原始字段是文本类型,我们也可以使用这个函数吗?不能,因为文本类型不能加1。所以,如果原始字段是文本类型,我们需要先转换为数值类型,或者使用另个函数。 因此,我们提供两个方案: 方案:先确保字段是数值类型,然后使用上述函数。 方案二:使用个更通用的函数,可以同时处理文本和数值。 通用函数(可以处理数值、字符串形式的数字、以及非数字字符串): ```python def add_prefix(value, prefix): if value is None: return "" # 尝试转换为数值(整数或浮点数) try: # 如果value是字符串,使用float转换;如果是数值类型,直接使用 if isinstance(value, str): # 去掉字符串两端的空格 value = value.strip() # 尝试转换为浮点数 num = float(value) else: num = value # 数值类型直接使用 result = num + 1 # 判断结果是否为整数 if isinstance(result, float) and result.is_integer(): return prefix + str(int(result)) elif isinstance(result, int): return prefix + str(result) else: return prefix + str(result) except: # 转换失败,说明不是数字,那么直接拼接字符串和1(作为字符串) return prefix + str(value) + "1" ``` 这个函数可以处理: - 数值类型(整数、浮点数) - 字符串(可以转换为数值的字符串,如"10", "10.5") - 非数字字符串(如"ABC"),则返回"ABC1" 在表达式框中调用:`add_prefix(!原字段!, "P-")` 示例: - 原字段值为10(整型) -> "P-11" - 原字段值为"10"(字符串) -> "P-11" - 原字段值为10.5(浮点型) -> "P-11.5" - 原字段值为"10.5"(字符串) -> "P-11.5" - 原字段值为"ABC"(字符串) -> "P-ABC1" 注意:对于非数字字符串,我们直接拼接字符串和"1",这符合“加1”的操作吗?可能用户希望非数字字符串不做处理,或者返回错误。根据需求调整。 如果用户希望非数字字符串返回空或者错误标记,可以修改except部分。 例如: ```python except: return "Error" # 或者返回空字符串,或者原字符串 ``` 根据用户需求选择。 最后,我们按照用户要求,给出个完整的示例。 假设用户要将字段“ID”的值加1并添加前缀“P-”,且“ID”字段是整型,那么我们可以这样: 1. 新建个文本字段(比如“NewID”)。 2. 在字段计算器中,选择“NewID”字段解析器选择“Python”。 3. 在代码块中输入: ```python def add_prefix(value, prefix): if value is None: return "" result = value + 1 if isinstance(result, float) and result.is_integer(): return prefix + str(int(result)) elif isinstance(result, int): return prefix + str(result) else: return prefix + str(result) ``` 4. 在表达式框中输入:`add_prefix(!ID!, "P-")` 如果“ID”字段是字符串类型,但存储的是数字,我们可以使用通用函数。 因此,我们根据实际情况选择函数。 由于问题没有明确字段类型,我们提供通用函数作为最终答案。 所以,最终回答: 在ArcGIS中,您可以使用字段计算器(Field Calculator)的Python解析器,通过以下步骤实现: 1. 确保目标字段是文本类型(用于存储结果)。如果原字段不是文本类型,您可以新建个文本字段。 2. 打开字段计算器(右键点击目标字段,选择“字段计算器”)。 3. 选择“Python”作为解析器。 4. 在“代码块”区域输入以下函数: ```python def add_prefix(value, prefix): if value is None: return "" # 处理NULL值,返回空字符串 try: # 尝试转换为数值(如果value是字符串,则转换;如果是数值,则直接使用) if isinstance(value, str): num = float(value.strip()) else: num = value result = num + 1 # 判断结果是否为整数(数学意义上的整数) if isinstance(result, float) and result.is_integer(): return prefix + str(int(result)) elif isinstance(result, int): return prefix + str(result) else: return prefix + str(result) except: # 如果转换失败(非数字字符串),则直接在原字符串后添加"1"(注意:这里根据需求,也可以返回错误信息或空字符串) return prefix + str(value) + "1" ``` 5. 在表达式区域输入:`add_prefix(!原字段名!, "您的前缀")`,将“原字段名”替换为您的字段名称,“您的前缀”替换为您想要添加的前缀字符串(例如,输入`add_prefix(!ID!, "P-")`)。 6. 点击“确定”执行计算。 注意:上述函数处理了数值、数字字符串和非数字字符串的情况。对于非数字字符串,函数会在原字符串后直接添加"1"(例如,原值为"ABC",则结果变为"P-ABC1")。如果这不是您期望的,您可以修改except部分的代码(例如,返回错误信息:`return "Error"`)。 引用说明:字段计算器的使用方法可以参考引用[1][2][3][4]中的经验分享。 生成相关问题: 1. 如何在ArcGIS字段计算器中处理NULL值? 2. 如何将字符串字段转换为数值字段? 3. 在字段计算器中,如何同时更新多个字段? 4. 如何避免字段计算中的错误?</think>### 在 ArcGIS 中使用字段计算器为数值加1并添加前缀 在 ArcGIS 中,可以通过字段计算器(Field Calculator)的 Python 解析器实现为数值字段加1并添加前缀的操作。以下是详细步骤: #### 操作步骤: 1. **打开属性表**:右键点击图层 → 打开属性表 2. **准备字段**: - 确保目标字段是**文本类型**(用于存储带前缀的结果) - 若原字段是数值类型,建议新建文本字段存储结果 3. **打开字段计算器**: - 右键点击目标字段字段计算器 - 选择 **Python** 解析器 - 勾选 **显示代码块** 4. **输入代码**: ```python def add_prefix(orig_value, prefix): try: # 数值加1后添加前缀 return prefix + str(int(orig_value) + 1) except: # 异常处理(如NULL值) return prefix + "NULL" ``` 5. **在表达式框输入**: ``` add_prefix(!原字段名!, "您的前缀") ``` 示例:`add_prefix(!ID!, "P-")` (将 ID 字段值加1后添加 "P-" 前缀) #### 参数说明: - `!原字段名!`:需要处理的数值字段(如 `!ID!`) - `"您的前缀"`:自定义前缀(如 `"P-"`) - **处理逻辑**: - 将原字段值转换为整数 - 执行加1操作 - 添加前缀后返回字符串 #### 注意事项: 1. **字段类型**:目标字段必须是**文本类型** 2. **NULL值处理**:代码中已包含异常处理,NULL 值将返回 `前缀+NULL` 3. **前缀格式**:前缀需用英文双引号包裹(如 `"A-"`) 4. **数值范围**:确保原字段值在整数范围内(-2147483648 至 2147483647) > 提示:若需处理浮点数,可将 `int()` 改为 `float()`,但需注意小数位精度问题[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值