首页 GIS基础理论 ArcGIS栅格计算器CON函数、条件赋值和000539错误

ArcGIS栅格计算器CON函数、条件赋值和000539错误

作者: GIS研习社 更新时间:2026-05-20 15:41:40 分类:GIS基础理论

在适宜性评价、洪水淹没提取、坡度分级、遥感指数阈值提取和 NoData 修复中,ArcGIS栅格计算器经常被用来做“满足条件赋一个值,不满足条件赋另一个值”的栅格处理。真正让初学者卡住的地方,通常不是工具入口,而是 Con 表达式怎么写、条件赋值怎么控制 NoData,以及为什么一运行就出现 000539 错误。本文围绕 Con 函数、条件赋值和 000539 排错,给出一套可以直接照着检查的写法和排查流程。

问题背景:ArcGIS栅格计算器为什么经常写错 Con

ArcGIS栅格计算器本质上是在工具对话框里写 Map Algebra 表达式。它看起来像一个普通计算器,但表达式会按 Python 语法和 ArcGIS 的栅格运算规则解析。字段名大小写、括号、引号、逗号、栅格图层名和 NoData 处理方式,只要有一个环节不符合规则,就可能运行失败。

最常见的业务场景是:从 DEM 中提取高程大于 1000 米的区域,把坡度小于 15 度的像元赋值为 1,把不满足条件的像元赋值为 0,或者把 NDVI 大于某个阈值的像元作为植被区域。这些任务都属于条件赋值,通常会用到 Con 函数。

很多同学在网上复制表达式后直接运行,结果出现 000539 错误。这个错误不一定说明栅格数据坏了,更常见的是表达式没有被 Python 或 Map Algebra 正确解析,例如函数大小写写错、括号没闭合、把 SQL 条件和 Python 条件混在一起,或者图层名中有空格却没有正确引用。

ArcGIS栅格计算器与ArcGIS栅格计算器CON函数条件赋值排错流程示意图
Con 表达式的关键是先明确条件栅格,再分别设置条件为真和条件为假时的输出值。

核心原理:ArcGIS栅格计算器CON函数怎么判断每个像元

ArcGIS栅格计算器CON函数可以理解为栅格版本的 if/else。工具会逐像元判断条件是否成立:条件为真时,输出 true 参数中的值;条件为假时,输出 false 参数中的值;如果 false 参数省略,不满足条件的像元通常会变成 NoData。

常用写法有两类。第一类是把比较表达式直接放在第一个参数中,这在 Raster Calculator 中最直观:

Con("slope" < 15, 1, 0)

这条表达式的含义是:坡度小于 15 的像元输出 1,其余像元输出 0。它适合生成建设适宜区、风险区、掩膜区、二值分类图等结果。

第二类是使用输入栅格加 where_clause 条件,形式更接近工具参数:

Con("elevation", 1, 0, "VALUE >= 1000")

这条表达式的含义是:在 elevation 栅格中,Value 大于等于 1000 的像元输出 1,其余像元输出 0。这里的 "VALUE >= 1000" 是 SQL 风格的条件字符串,不要和前一种 Python 比较表达式混写。

判断 Con 表达式是否合理,先读成一句中文:如果哪个栅格满足什么条件,就输出什么;否则输出什么。读不顺的表达式,通常也跑不稳。

ArcGIS栅格计算器条件赋值的常用写法

ArcGIS栅格计算器条件赋值最常见的是二值化、阈值分级、范围提取、NoData 修复和多条件叠加。下面这些写法可以作为模板,但使用前要把栅格图层名改成你自己的图层名。

1. 按单一阈值赋值

把坡度小于 15 度的像元设为 1,其他像元设为 0:

Con("slope" < 15, 1, 0)

这种写法适合做二值掩膜。输出 1 可以表示满足条件的区域,输出 0 表示不满足条件的区域。后续如果要转面、统计面积或叠加分析,0 和 NoData 的含义要提前区分清楚。

2. 只保留满足条件的像元

如果只想保留高程大于等于 1000 的区域,不满足条件的地方不参与后续分析,可以省略 false 参数:

Con("elevation" >= 1000, "elevation")

这样满足条件的像元保留原高程值,不满足条件的像元变为 NoData。这个写法常用于提取高程带、指数高值区、距离范围内的有效像元。

3. 对 NoData 进行替换

如果要把 NoData 区域补成 0,并保留原有有效值,可以这样写:

Con(IsNull("landuse"), 0, "landuse")

这里的 IsNull("landuse") 会生成一个条件栅格,NoData 像元为真,非 NoData 像元为假。这个表达式是 Con 函数的高频用法,也最容易因为函数大小写写错而触发 000539。

4. 同时满足多个条件

提取坡度小于 15 且高程小于 800 的建设适宜区,可以用括号明确每个条件:

Con(("slope" < 15) & ("elevation" < 800), 1, 0)

在栅格计算中,多个条件建议分别加括号。并且通常使用 & 表示并且,使用 | 表示或者。不要直接把 Python 的 andor 套进栅格条件,很多情况下会导致表达式无法按像元计算。

5. 嵌套 Con 做多级分类

把坡度分为 3 个等级,可以写成嵌套 Con:

Con("slope" < 5, 1, Con("slope" < 15, 2, 3))

这表示坡度小于 5 输出 1;否则继续判断是否小于 15,满足则输出 2;剩余像元输出 3。嵌套 Con 可读性会随着等级增多快速下降。超过三四个等级时,优先考虑 Reclassify 工具,避免表达式过长。

ArcGIS栅格计算器失败000539怎么理解

ArcGIS栅格计算器失败000539通常表示表达式在 Python 层面没有成功执行。它可能是语法错误,也可能是运行表达式时抛出的异常。对 Raster Calculator 来说,常见触发原因集中在函数名大小写、括号、引号、运算符、图层名引用和数据类型上。

例如 con("slope" < 15, 1, 0) 写成小写函数名,可能因为 Python 区分大小写而失败;Con("slope" < 15, 1, 0 少了右括号,会直接造成语法错误;Con("slope" < 15 and "elevation" < 800, 1, 0) 把普通 Python 逻辑运算符用于栅格逐像元判断,也容易出问题。

排查 000539 时,不要只看最后的错误号。应打开 Geoprocessing 消息,查看 000539 前后的 Python traceback 或具体提示。里面如果出现 SyntaxError,多半是表达式语法;如果出现 TypeError、NameError 或工具执行异常,就要进一步检查图层名、函数名、输入类型和路径。

标准处理步骤:从一个可运行表达式开始

处理 ArcGIS栅格计算器问题时,最稳的方式不是一次写很复杂的表达式,而是从最小可运行表达式逐步增加条件。

  1. 确认扩展和工具可用。Raster Calculator 位于 Spatial Analyst 工具箱中,运行前确认相关许可或扩展可用,并能正常打开工具。
  2. 确认输入图层在当前地图或工作空间中可见。如果图层名包含空格、中文、括号或特殊符号,建议在工具面板中双击图层插入表达式,不要手打。
  3. 先运行简单表达式。例如先运行 "slope" * 1Con("slope" < 15, 1, 0),确认单个输入可以正常参与计算。
  4. 再增加第二个条件。多条件表达式要给每个比较条件加括号,例如 ("slope" < 15) & ("elevation" < 800)
  5. 明确 false 输出。如果后续要统计面积或转面,通常用 0 表示不满足条件;如果后续只处理满足条件区域,可以让不满足条件变为 NoData。
  6. 设置输出位置。优先输出到本地 File Geodatabase 或简短英文路径,排除路径过长、无权限、同步盘和名称冲突带来的干扰。
  7. 检查环境设置。确认 Extent、Mask、Cell Size、Snap Raster 是否符合当前任务。排错时可以先清空非必要环境设置。
  8. 保存成功表达式。当表达式跑通后,把表达式、输入数据、输出路径和环境参数记录下来,方便批处理或复现。

常见坑点:Con 表达式看起来对但运行失败

  • 函数大小写错误。Raster Calculator 使用 Python 语法,函数名大小写敏感。应写 ConIsNull,不要写成 conisnull
  • 括号没有成对出现。嵌套 Con 很容易少一个右括号。排错时先把表达式拆成短句,不要一次写多层嵌套。
  • 图层名引用不规范。图层名有空格或特殊字符时,手动输入容易出错。建议用工具界面插入栅格图层,必要时把图层重命名为简单英文名。
  • 混用 SQL 条件和 Python 条件。Con("elevation", 1, 0, "VALUE > 1000")Con("elevation" > 1000, 1, 0) 是两种写法,不要把 "VALUE > 1000" 塞进第一种比较表达式的位置。
  • 多条件没有加括号。推荐写成 Con(("slope" < 15) & ("ndvi" > 0.3), 1, 0),避免解析顺序造成错误。
  • 把 NoData 当成 false。NoData 不等于普通的 false。需要替换 NoData 时,用 IsNull 明确判断。
  • 输出路径有问题。路径太长、目录无权限、输出名重复、云同步目录冲突,都可能让表达式看似正确但工具失败。
  • 数据类型不符合后续目标。Con 可以输出浮点或整数,但如果后续要做栅格转面,应让输出成为明确的整数分类值。

工具和方法比较:Con、Set Null、Reclassify 该怎么选

Con 函数不是所有条件处理的唯一答案。不同任务可以选择更清晰的工具,表达式越短,错误越少。

方法 适合场景 注意点
Con 按条件输出 true 值和 false 值,适合二值化、条件替换和简单分级 表达式要符合 Python 和 Map Algebra 语法,复杂嵌套要控制层数
Set Null 把不需要的像元设为 NoData,只保留满足条件的区域 适合掩膜提取,不适合需要保留 0 值参与统计的场景
Reclassify 按多个范围做等级重分类,例如坡度等级、风险等级、适宜性等级 等级较多时比嵌套 Con 更清晰,也更方便检查阈值
Extract By Mask 按研究区边界、行政区或矢量范围裁剪栅格 解决空间范围提取问题,不替代条件表达式中的属性阈值判断
ArcPy Map Algebra 批量处理多个栅格、多个阈值或多个行政区 脚本前先在 Raster Calculator 中验证单个表达式,减少批量失败成本

实践检查清单:运行前先看这 10 项

正式运行 ArcGIS栅格计算器前,可以用下面清单快速检查表达式是否可靠。

  • 是否已经确认输入栅格能正常显示,并且不是空图层。
  • Raster Calculator 中插入的图层名是否和图层列表一致。
  • Con、IsNull 等函数名大小写是否正确。
  • 所有左括号和右括号是否成对出现。
  • 多条件表达式是否给每个条件单独加括号。
  • 是否明确区分 0、1 和 NoData 的业务含义。
  • 输出栅格是否需要整数类型,尤其是后续要转面或做类别统计时。
  • Extent、Mask、Cell Size、Snap Raster 是否会改变输出范围和像元对齐。
  • 输出路径是否简短、可写、没有重名冲突。
  • 如果出现 000539 错误,是否已经查看完整 Geoprocessing 消息,而不是只看错误号。

FAQ:Con 函数、条件赋值和 000539

ArcGIS栅格计算器CON函数最常用的格式是什么?

最常用格式是 Con(条件, 条件为真时的值, 条件为假时的值),例如 Con("slope" < 15, 1, 0)。如果不希望保留不满足条件的像元,可以省略 false 参数,让它们输出为 NoData。掌握这个格式后,大多数条件判断场景都能写出来。

ArcGIS栅格计算器条件赋值中,0 和 NoData 有什么区别?

0 是一个有效像元值,可以参与统计、重分类和转面;NoData 表示没有有效数据,很多分析会跳过它。做这类条件赋值时,如果不满足条件的区域仍需要统计面积,通常赋 0;如果不满足条件的区域不应参与后续分析,可以让它变为 NoData。

ArcGIS栅格计算器失败000539一定是 Con 函数错了吗?

不一定。000539 表示表达式在 Python 执行层面失败,可能来自 Con,也可能来自 IsNull、Int、Float、括号、引号、图层名、路径或数据类型。正确做法是查看完整错误消息,先运行最小表达式,再逐步加回复杂条件。

多条件判断应该用 and/or 还是 &/|?

在栅格逐像元条件中,建议使用 & 表示并且,使用 | 表示或者,并给每个条件加括号,例如 Con(("slope" < 15) & ("ndvi" > 0.3), 1, 0)。直接使用 andor 往往不是你想要的栅格逐像元逻辑。

为什么 Con 表达式省略 false 参数后,很多区域不见了?

因为不满足条件的像元会输出为 NoData,而不是 0。显示上看像是区域消失了,实际是这些像元不再作为有效值参与后续分析。如果你需要一张 0/1 二值图,应写成 Con("slope" < 15, 1, 0)

000539 错误怎么最快定位?

先把复杂表达式缩成一个最简单的 Con,例如 Con("slope" < 15, 1, 0)。如果这个能运行,再逐步加第二个条件、NoData 判断和嵌套分类。每加一步运行一次。这样可以快速判断 000539 是来自基础输入、某个函数,还是来自复杂表达式的某一段。

总结

ArcGIS栅格计算器处理条件判断时,最核心的是读懂 Con 的三个位置:条件、真值、假值。Con 函数适合做二值化、条件替换、NoData 修复和简单分级;条件赋值时必须明确 0 和 NoData 的区别;遇到 000539 错误,要从 Python 语法、函数大小写、括号、图层名、运算符和输出路径逐项排查。把表达式从简单到复杂逐步验证,比一次复制长表达式更可靠。

相关文章