
1. 从一场“属性筛选翻车”说起先说个我自己的例子。前两年做土地利用变化分析手里是一份覆盖三个县的国土调查数据属性表里字段一大堆地类代码、权属单位、图斑面积、坡度级别、是否基本农田……当时要做的第一步很简单把“坡度级别为3级以上的耕地”单独拎出来做统计。我当时的操作是什么打开属性表点“按属性选择”在对话框里敲了一串又臭又长的表达式DLMC LIKE %水田% OR DLMC LIKE %旱地% OR DLMC LIKE %水浇地%然后跟上一个AND再接坡度字段的判断。写完之后满怀信心地点击“应用”结果弹出来一个提示选择记录数 0。我当时的第一反应是“数据是不是有问题”查了半天才发现问题出在我自己对字段值理解错了——那个“坡度级别”字段存的是罗马数字不是阿拉伯数字。也就是说我需要找的是PDJB III而不是PDJB 3。这个坑本身不深但它代表了一个很普遍的现象ArcGIS 的按属性选择99% 的人都会用但真正用明白的人不多。大多数人停留在“点开对话框、双击字段、单击值、点应用”的肌肉记忆层面一旦遇到多条件组合、模糊匹配、空值处理、字符编码问题就很容易卡壳。这篇文章我不打算写给完全没碰过 ArcGIS 的小白也不打算写成一本操作手册。我想写的是按属性选择这个工具在真实业务场景里到底该怎么用、有哪些容易踩的坑、怎么把一条 SQL 表达式写得既高效又不容易出错。顺便把我这些年里在项目里攒下的经验尽量干货化地倒出来。如果你正在做数据预处理、制图筛图、统计分析或者你是刚从 ArcMap 转向 ArcGIS Pro 的用户这篇文章应该能帮你省下不少时间。2. 按属性选择的底层逻辑它本质上是 SQL不是“点一点”很多人不知道ArcGIS 的按属性选择对话框其实是一个高度图形化的 SQL 查询构造器。你看到的每一次双击字段、每一次选择唯一值背后都是在拼一条结构化查询语句。理解这一点比记住任何快捷键都重要。2.1 表达式的基本骨架字段、运算符、值一条最简单的按属性选择表达式长这样字段名 值这里面有几个容易被忽略的点。第一字段名必须用英文双引号括起来。这是 ArcGIS 内部查询引擎的硬性要求。如果你直接手输字段名而不加双引号表达式往往直接报错或查不到结果。在 ArcMap 和 ArcGIS Pro 的对话框里双击字段名会自动带上双引号所以很多老用户根本意识不到这个细节。第二文本类型的值必须用英文单引号括起来数字类型不需要。但是这里有一个项目里经常出现的坑很多字段表面上看起来是数字比如“地类编码”、“行政区代码”实际上在数据入库的时候被定义成了文本类型。如果你在表达式里写XZQDM 610102它会报错或者返回 0 条记录你必须写成XZQDM 610102。怎么快速判断字段是文本还是数字打开属性表右键字段名查看“属性”或者直接看字段类型即可。也可以用 Python 脚本快速列出所有字段的类型这在字段很多的复杂数据里尤其好用。第三表达式里的运算符不仅仅是等号和大于小于。除了常见的、、、、、还有下面这几个高频使用的LIKE模糊匹配。常配合%匹配任意多个字符和_匹配单个字符使用。IN匹配一个集合里的任何值。比一串OR更简洁。IS NULL/IS NOT NULL处理空值。AND/OR/NOT逻辑组合。2.2 两种常见的操作方式直接写 SQL 和图形化构造在 ArcMap 的按属性选择对话框中底部一般有一个“加载表达式”的按钮旁边就是表达式输入框。老手通常会直接在里面写 SQL小手指一动比鼠标点来点去快得多。不过我更推荐的是最右侧的“唯一值”面板先选中某个字段然后面板里会列出该字段的所有实际取值。注意是实际取值不是字段定义里的合法值。这一招在查“脏数据”时特别好用——比如你想知道某个字段里到底有哪些乱七八糟的值点开唯一值面板一目了然。对于 ArcGIS Pro 用户按属性选择的界面设计略有变化但核心逻辑一致。Pro 的表达式输入框功能更强支持在表达式右上角选择“SQL”或“属性”模式。属性模式下你甚至可以用 Python 表达式、Arcade 表达式还能调用字段间的复杂计算。这个后面我会单独展开。2.3 理解“选择环境”选择集是临时的它不等于“删数据”这里必须强调一个新手最容易误解的点按属性选择之后数据只是被“选中”了并没有被删除、裁剪或导出。它是建立了一个临时的选择集。在 ArcMap 里你会看到图层上的要素高亮显示在 ArcGIS Pro 里默认是青蓝色的高亮。你可以在属性表里点击左上角的筛选按钮只显示选中的记录也可以右键图层选择“数据”-“导出数据”把选中要素另存为一个新图层。但如果你不做任何后续操作直接关闭工程那这个选择集就丢了下次打开还要重新选。所以如果这个筛选结果是你反复要用的最好第一时间导出成新图层或者在图层属性里设置一个“定义查询”让图层只显示符合条件的要素。关于定义查询我想说一句它跟按属性选择是两兄弟但应用场景不同。按属性选择侧重于“临时交互式分析”定义查询则侧重于“图层内容的持久化过滤”。比如你做专题制图一张图层只想显示某个县域范围内的要素但又要保留完整数据那就用定义查询而不是一遍遍按属性选择。2.4 选择方法的下拉框里藏着一个容易忽略的选项对话框顶部有一个“方法”下拉框默认是“创建新选择内容”。它的下面还有添加到当前选择内容从当前选择内容中移除从当前选择内容中选择子集按属性选择这是它能实现“交集”和“差集”的关键举个实际场景你要选出“坡度 3 级以上”的图斑然后在这个结果里再筛出“地类为耕地”的图斑。你可以两步操作第一步PDJB III用“创建新选择内容”第二步在“方法”里选择“从当前选择内容中选择子集”表达式写DLMC LIKE %耕地%。这样两次选择的交集就自动生成了不需要写复杂的一长串嵌套条件可读性也更强。3. 高频业务场景的 SQL 写法从简单到进阶理论说完了接下来直接上干货。我把这些年在项目里经常用到的表达式做了归类每一条都配了真实场景和说明。你可以直接复制到 ArcMap 或 ArcGIS Pro 的按属性选择对话框里使用。3.1 基础等值匹配与多值匹配场景一选出某个行政区划代码下的所有图斑。XZQDM 610102场景二选出多个行政区划代码下的图斑。这里就要用IN比一长串OR干净太多XZQDM IN (610102, 610103, 610104)场景三选出除了某个地类之外的所有要素DLBM 0501注意和!在 ArcGIS 里都可以用来表示“不等于”但为了兼容性我更推荐写。3.2 模糊匹配LIKE 的三种活用LIKE是处理文本类字段的大杀器它支持%和_两个通配符。%代表零个或多个任意字符_代表单个任意字符。场景一选出所有“水田”相关的地类例如水田、水浇地、水田中只要包含“水田”两个字。DLMC LIKE %水田%场景二选出所有以“林”字开头的地类名称。DLMC LIKE 林%场景三选出所有名称长度为 4 个字的记录。DLMC LIKE ____这里四个下划线代表四个任意字符。实际应用中这种写法常用于检查字段值是否格式统一。还有一点要提醒早期的 ArcGIS 在一些数据格式如 coverage、个人地理数据库中LIKE对中文支持不太好偶尔会出现查不到结果的情况。如果你用的是 File Geodatabase 或 Shp基本没这个问题但如果你还在用老旧的个人地理数据库MDB遇到中文字段模糊匹配失效时可以考虑先转换成 File GDB 再查询。3.3 空值判断IS NULL 和 IS NOT NULL这是项目里最容易被忽略的环节。很多字段里存在空值但你直接写字段 往往查不出来。正确写法是REMARK IS NULL或者反过来找出所有有备注的记录REMARK IS NOT NULL这里有个很关键的经验ArcGIS 里字段的空值有时是真正的 NULL有时是空字符串 有时是一个空格。三种情况肉眼看起来差不多但对查询结果影响巨大。遇到这种情况我一般会先加载 Python 脚本把字段值遍历一遍检查空值的具体形态。如果是空字符串和空格可以用字段计算器统一处理成真正的 NULL这样后续的按属性选择就清爽多了。3.4 数值区间多条件组合场景选出坡度级别大于等于 3 级且图斑面积大于 1000 平方米的图斑。PDJB III AND Shape_Area 1000注意这里Shape_Area是浮点型字段直接跟数字比较不需要加引号。而PDJB如果是文本型的罗马数字就必须加单引号。如果要在多个条件里做“或”的逻辑PDJB I OR PDJB II OR Shape_Area 100这条表达式用OR连接了三个条件表示“只要满足其中任意一个就选中”。3.5 日期字段的查询坑最多的地方日期字段的按属性选择可以说是所有字段类型里最容易出问题的。不同的数据格式、不同的系统语言环境日期格式五花八门2024-01-15、2024/01/15、2024年1月15日、15/01/2024……如果你不先确定字段里实际存的格式写出来的表达式全是白搭。最常见的写法是CREATE_DATE DATE 2024-01-01但有时候你直接在对话框里手输DATE 2024-01-01它会报语法错误。这时候可以试试用TIMESTAMP关键字CREATE_DATE TIMESTAMP 2024-01-01 00:00:00还有另外一个思路使用EXTRACT函数提取日期字段的年份和月份再比较数字EXTRACT(YEAR FROM CREATE_DATE) 2024这种方式对格式的兼容性更好而且在进行“按年度统计”时非常顺手。如果你用的是 ArcGIS Pro还可以使用 Arcade 表达式日期处理上会顺手很多。比如这样的一段 Arcadevar d $feature[CREATE_DATE]; return Year(d) 2024;关于按属性选择对话框里能不能用 Arcade这里要区分两个入口在“按属性选择”的普通 SQL 模式下不能直接用 Arcade但在图层的“定义查询”属性中选择表达式类型时Pro 允许切换成 Arcade。这是 Pro 相比 ArcMap 的一个显著优势。4. 字符编码中文数据查询不出来的头号元凶这一节我要单独拎出来写因为我在项目里见过太多次“表达式看起来完全正确但就是选不出来”的情况最后排查一圈问题全出在字符编码上。4.1 Shapefile 的编码顽疾如果你处理的是 Shapefile 格式的数据它的属性表编码是由一个.cpg文件决定的。常见的编码有 UTF-8、GBK、GB2312 等。如果你的字段值是中文而.cpg文件丢失或损坏那么在按属性选择里你看到的“唯一值”列表里的中文全是乱码或者根本显示不全。此时你写DLMC 水田大概率选不中任何要素。怎么解决最可靠的办法是拿到 Shapefile 数据时第一时间检查.cpg文件是否存在并确认其声明的编码符合数据实际编码。如果发现不匹配用文本编辑器打开.cpg把编码改成正确的或者直接在 ArcGIS Pro 里用“地理处理”-“修复地理数据”工具处理。4.2 从外部数据库导入的数据要警惕字符集转换从 PostgreSQL、Oracle 等数据库导入 ArcGIS 的中文数据经常会出现字符集转换问题。比如源库是 UTF-8导入后在某些老版本 ArcGIS 里显示正常但查询时却要求你用 GBK 编码的中文去匹配。这种情况光靠改表达式解决不了必须在数据导入链路里统一好字符集。一个比较保险的实操习惯所有涉及中文筛选的字段在项目启动阶段就约定好统一采用 UTF-8 编码存储对所有 Shapefile检查并补全.cpg文件。不要等到按属性选择查不到数据时才回头补课。4.3 唯一值面板里的“隐形空格”还有一个小坑唯一值面板里有些值看起来一模一样但实际选了之后就是匹配不上。原因是数据在入库时头部或尾部带了空格而这些空格在 GUI 里几乎看不出来。遇到这种情况我建议用字段计算器或者 Python 脚本先对字段做strip()处理把首尾空格清掉再重新做按属性选择。具体 Python 代码很简单import arcpy with arcpy.da.UpdateCursor(your_layer, [DLMC]) as cursor: for row in cursor: if row[0]: row[0] row[0].strip() cursor.updateRow(row)清理一次能省去后面无数次的查询烦恼。5. 实战演练从“选出数据”到“生成专题结果”的完整链路前面讲了这么多原理和写法这一节我带着大家走一遍完整流程。场景设定为手头有一份某县第三次全国国土调查的图斑数据File GDB你需要完成以下任务选出所有“耕地”地类中面积大于等于 5 亩的图斑在这部分图斑中再筛出“坡度级别为 2 级以上”的部分把最终结果导出为新图层并生成一张简单的面积统计表。5.1 第一步观察数据确定字段拿到数据后先别急着写表达式。我的习惯是按照这个顺序做一遍数据摸底打开属性表浏览字段名称和字段类型关闭图层编辑状态在“唯一值”面板里逐个字段检查实际取值找出地类字段可能是DLBM或DLMC也可能是DLMC接代码后跟名称的长文本找出面积字段常见的有Shape_Area、MJ、TBMJ并确认单位是平方米还是亩找出坡度级别字段确认取值是数字还是文本是阿拉伯数字还是罗马数字检查是否存在空值和空白值。假设我们发现面积字段是Shape_Area单位是平方米坡度级别字段是PDJB存的是文本型的罗马数字取值为 I、II、III、IV、V。5.2 第二步构造第一轮表达式5 亩等于 3333.33 平方米。第一轮筛选表达式如下DLMC LIKE %耕地% AND Shape_Area 3333.33注意这里用LIKE %耕地%而不是DLMC 耕地是因为地类名称往往不是单纯的“耕地”两个字而是“水田”、“旱地”、“水浇地”等。除非你确定字段值就是“耕地”否则模糊匹配更稳健。点击“应用”后观察状态栏显示的“已选择 N 个要素”。在这里我有个习惯每轮筛选完成后先打开属性表用排序功能检查一下选中的要素是否符合预期不要急着进入下一步。5.3 第三步在当前选择集上做二次筛选保持第一轮的选择集不变在按属性选择对话框里把“方法”切换为“从当前选择内容中选择子集”然后输入PDJB IN (II, III, IV, V)或者更直观PDJB I点击“应用”后选择集就自动更新为两次条件的交集。这一步是很多人容易漏掉的很多人会重新用“创建新选择内容”去写一遍完整条件把所有条件用 AND 串起来。那样当然也可以但一旦条件变多写错一个符号就得全部重来。分步选择每一步都可以单独验证排错成本低很多。5.4 第四步导出结果确认选择集无误后右键图层 - 数据 - 导出数据选择“所选要素”设置好输出路径和名称点击确定。导出的新图层会自动添加到地图中。强烈建议在导出前给输出图层命名时加一个日期或版本后缀避免后面反复覆盖导致数据追责不清。5.5 第五步统计汇总最后一步新导出的图层右键 - 打开属性表 - 右键字段名 - 汇总。选择统计字段为Shape_Area统计类型选择“总和”和“平均值”分组字段选择地类名称即可生成一张简单的面积汇总表。在实际项目中这个完整链路往往会配合模型构建器ModelBuilder或者 ArcPy 脚本做成一个自动化工具特别适合“每次来新数据就要跑一遍同样筛选”的重复性业务。比如第三次全国国土调查的数据按季度更新每次更新的流程一模一样用手工点选去筛选工作效率太低。我把这套操作录成了 ArcPy 脚本每次只要改一下输入路径几十秒跑完。6. ArcGIS Pro vs ArcMap两个时代的选择逻辑差异如果你还在用 ArcMap同时公司或单位已经让你逐步转向 ArcGIS Pro那么这一节你最好看完。表面上看两者的按属性选择功能长得差不多但实际使用体验差异非常大。6.1 表达式语言从 SQL 到 SQL Python ArcadeArcMap 的按属性选择基本上就是一套通用的 SQL 语法什么数据源用什么 SQL 方言很多细节用户管不了。ArcGIS Pro 则引入了表达式类型的概念。你在“按属性选择”或“定义查询”的窗口里可以看到一个下拉框允许选择SQL 表达式Python 表达式Arcade 表达式其中 Arcade 对日期、文本、几何计算的支持非常友好尤其适合处理跨平台、跨数据源的一致性逻辑。比如我们要判断一个点是否落在某个多边形内在 SQL 里实现非常痛苦但在 Arcade 里可以这样var polygon FeatureSetByName($datastore, boundary, [SHAPE], true); var point $feature; return Intersects(point, polygon);这种能力在 Pro 里可以用于定义查询实现动态过滤显示非常方便。6.2 对话框交互唯一值面板的性能差异ArcMap 打开属性表点击字段后唯一值面板刷新数据的速度比较慢特别是在大图层上经常卡顿几秒钟。ArcGIS Pro 在这方面有了明显优化但对超大字段上百万条记录依然不建议频繁刷新唯一值面板改用 SQL 手写更顺手。另外Pro 支持把常用的表达式保存下来。具体操作是在按属性选择对话框里写好自己的 SQL 后点击右上角的“保存”按钮下次直接从“已保存”列表里调用即可。这个功能在 ArcMap 里没有对于反复使用的查询条件能省不少事。6.3 选择结果的可视化反馈ArcMap 中选中要素高亮是黄色ArcGIS Pro 中默认是青蓝色。此外Pro 里可以在“内容”窗格中右键图层 - 选择 - 按属性选择也能通过“按位置选择”“按图形选择”等菜单进入其他选择方式。6.4 一个升级建议别只盯着按属性选择既然说到了 Pro我要特别提一句ArcGIS Pro 的“筛选”功能和“图表”功能能帮你把按属性选择的效率再提一个台阶。比如你想快速查看某个字段的分布情况右键字段 - 创建图表用柱状图扫一眼再决定按属性选择的筛选条件往往比在唯一值面板里翻找更高效。这一点在数据质量检查和业务分析中非常实用。7. 性能优化与大数据量筛选的注意事项按属性选择的性能问题在几十万条记录以内的数据上基本不用考虑但一旦上了百万级、千万级你就必须认真对待。我处理过最大的单图层图斑数据在 800 万条左右写一条不好的查询跑几分钟出不来都很正常。7.1 索引按属性选择性能的第一命门对经常参与查询的字段建立属性索引是提升按属性选择性能最有效的手段。在 File Geodatabase 中右键字段 - 添加属性索引在 ArcGIS Pro 中也可以在地理处理工具“添加属性索引”里批量处理。注意不是所有字段都需要索引。一般只对以下字段建索引经常用于筛选的字段如行政区代码、地类代码经常用于连接图层的字段如唯一标识 ID经常用于排序的字段可选。索引本身有存储开销和更新开销字段建多了反而会在写入时拖慢速度。一个图层里建 3~5 个索引属于正常范围超过 10 个就有点浪费了。7.2 避免在查询条件里对字段做函数运算这是一条通用的数据库优化原则同样适用于 ArcGIS 的按属性选择。如果你在 WHERE 条件里对字段套了函数比如UPPER(DLMC) 水田即使DLMC上建了索引查询引擎也无法使用索引只能全表扫描性能直线下降。更常见的一个错误写法是EXTRACT(YEAR FROM CREATE_DATE) 2024这条表达式虽然能得出正确结果但性能远不如CREATE_DATE DATE 2024-01-01 AND CREATE_DATE DATE 2025-01-01所以能直接比较字段原始值就不要包函数这是老 GIS 人都会提醒你的一条原则。7.3 一次查询过多唯一值的时候IN 列表别太长IN在处理少量值比如 10 个以内时非常好用。但如果你的条件值是动态生成的可能有几十个甚至上百个值那么拼一条超长的 IN 列表会让 SQL 解析变慢而且在 ArcMap 的对话框里编辑也非常痛苦。这时候更好的做法是先按某个基础条件选出一个大范围的选择集使用“按位置选择”和“按属性选择”组合缩小范围或者直接把条件值导入一个表格用图层连接Join或关联Relate来做筛选。7.4 分区和裁剪大数据量下的一种工程思维如果你手头的图层是全国范围的而你每次只做某个省的分析那么在设计数据工程方案时就应该考虑按区域把数据切割成多个子图层或者使用 ArcGIS Pro 的“按位置选择”先缩小空间范围再在子集上做按属性选择。这看起来像是在绕远路但实际经验告诉我把大数据切小是所有分析效率提升的根基。按属性选择优化得再好也架不住全图扫描几千万个要素。8. 常见报错与排查思路从现象到根因最后这一节我把按属性选择过程中最常遇到的几个报错或“不报错但结果不对”的情况集中列一下方便你对照排错。现象可能原因排查与解决方案表达式输入后提示“无法解析此表达式”字段名缺少双引号值缺少单引号使用了当前数据源不支持的函数逐段简化表达式从最简单的字段 值开始试检查字段类型能解析但选不出任何要素字符编码问题字段值为空/空格值列表范围不匹配打开唯一值面板检查目标字段的实际取值范围用LIKE代替做模糊匹配清理首尾空格中文条件选不到记录Shapefile 的.cpg文件缺失或编码错误数据导入时的字符集转换问题检查并修复.cpg将数据复制到 File GDB 后重试日期字段条件查询结果不对日期字段实际存储格式与表达式格式不一致用 Python 脚本打印字段的原始值尝试EXTRACT(YEAR FROM ...)取年份匹配查询超大数据量时卡死没有索引全表扫描表达式里对字段套了函数为查询字段建索引简化表达式先按空间范围缩小选择集字段名带空格或特殊字符表达式解析失败在 ArcGIS 中会看到字段名被方括号或双引号包裹确保不遗漏双引号8.1 一个真实的排查案例有一次同事反馈说按属性选择查“某一类用地”选出来只有几百个图斑但据他估算至少应该有上万块。我过去一看表达式是YONGDI IN (商业, 工业, 住宅)看起来没毛病。但打开唯一值面板后发现实际字段值里存的是“商业用地”、“工业用地”、“住宅用地”而不是简写。修改表达式为YONGDI IN (商业用地, 工业用地, 住宅用地)问题立刻解决。就这么一个简单的字段取值差异浪费了同事大半天时间。这个案例其实特别能说明按属性选择选不出数据的时候第一步永远是去查字段的实际取值而不是反复改语法。8.2 关于“按属性选择”和“定义查询”配合使用的建议最后补充一个实用经验如果你做专题制图时反复用同一个筛选条件比如“只显示坡度 3 级以上的耕地”我建议你直接在图层属性的“定义查询”里填上表达式这样就不用每次打开按属性选择去点了。定义查询与按属性选择相比有两大好处图层始终只显示符合条件的要素制图时不会误操作到范围外的数据对地图服务发布如 ArcGIS Server、Portal很友好可以直接把过滤条件体现在服务端。当然定义查询也不是万能的。如果你需要做多次交集并集操作定义查询写起来会比较绕。判断标准很简单临时分析用按属性选择长期复用用定义查询。9. 结语从“会用”到“用明白”就差这几步按属性选择看起来是个毫不起眼的小功能但它在数据清洗、专题制图、统计分析里出现的频率之高远超很多人的想象。我自己带过不少新人发现他们往往在最开始被五花八门的菜单和工具吸引忽略了这个基础中的基础结果到了写毕业论文或做项目汇报的时候却在一个简单筛选上卡住。如果你能花一两个小时把本文里提到的这些场景全部过一遍我相信你在处理大多数 GIS 数据查询需求时都能做到“一把梭”而不是边查边试、边试边错。最后再分享一个小习惯我每次做按属性选择都会先把表达式复制粘贴到记事本里存档。这样同一个筛选条件下次用到时直接调出来改一改不用重新回忆和试错。项目长期积累下来这个文件夹慢慢就变成了一个“表达式库”工作效率翻倍。希望这篇关于 ArcGIS 按属性选择的实战经验总结能帮你少踩几个坑、少加几个班。如果你也遇到过一些“玄学”筛选问题欢迎在评论区聊聊说不定能帮到更多同行。