☰
ArcGIS按属性选择完全指南:从SQL表达式到数据筛选实战
2026/10/2 9:31:31 网站建设 项目流程

干GIS这行,跟数据打交道是每天的必修课。不管是做国土的、做规划的、做水利的还是搞测绘的,打开ArcMap或者ArcGIS Pro,面对一张动辄几万几十万个图斑的要素类,想摁着属性表一行一行找数据,那基本属于自虐。这时候“按属性选择”这个功能就是最趁手的家伙事儿。

说白了,按属性选择就是帮你从海量数据里精准捞目标的一把筛子。它的核心操作是用一条类似数据库SQL的表达式,告诉软件“我要什么”,软件按照你给的规则,把符合条件的图斑或记录一次全给你选出来。相比用手动点选、用属性表翻页筛选,它的效率是数量级上的提升,而且整个过程可重复、可记录、可批量修改。

这篇文章我不打算写软件界面说明书那种口水话,就从实际干活的角度出发,把按属性选择的原理、表达式写法、实操场景和踩坑经验一次性说透。无论你是刚接触ArcGIS的小白,还是被各种疑难杂症折磨的老手,希望这篇东西能直接变成你的工作手册,下次遇到筛选数据的活儿,不用再挠头。

1. 按属性选择到底解决什么问题

1.1 从一次实际工作说起

先交代一个最常见的场景,这功能我几乎天天用。之前做过一次国土变更调查的数据整理,甲方给了一个涉及全镇约12万个图斑的shp文件,要求把所有地类编码为“0101”的水田图斑单独提出来核对面积。12万个图斑,就算手速再快,在属性表里滚动条拉到怀疑人生,点选也得点到地老天荒。这时候调出“按属性选择”对话框,输入一行表达式,点击确定,6749个符合条件的图斑瞬间高亮,这就是这个功能存在的意义。

当然,按属性选择解决的不仅是“选出来”这一步。它通常只是一个工作流的前奏。选完之后,你可以右键图层“导出数据”生成一个新的shp或gdb要素类,也可以只对选中的要素做面积统计、做缓冲区分析,或者启动编辑会话后对选中要素批量修改字段属性。可以说,它是很多复杂GIS操作的数据预处理起点。

1.2 按属性选择与按位置选择的本质区别

很多刚接触GIS数据分析的朋友容易把两个概念混淆:按属性选择和按位置选择。看起来都是“选择”,但两者的运行逻辑完全不在一个维度上。

按属性选择,关注的是图层属性表里的字段值。比如“地类名称”字段等于“水田”,“面积”字段大于1000,这跟空间位置没有半毛钱关系。它就像一个过滤器,只管属性行是否满足你写的SQL条件。

按位置选择,关注的是空间几何关系。比如选出与某条河流图层相交的所有地块,或者选出完全落在某个乡镇边界内的点状设施。这个操作不看属性表内容,只看图形有没有重叠、相交、包含等拓扑关系。

实际项目中两者经常搭配使用,比如先用按位置选择圈定某条道路两侧100米内的所有图斑,再用按属性选择从中挑出地类为“建设用地”的部分。理解这层区别,能帮你在以后的工作里选对工具,少走弯路。

1.3 这功能在什么场景下最能提效

按属性选择的用武之地远远不止“按名称随便选选”。这些年我用下来,有三类场景是它的绝对主场:

第一类是数据清洗。比如收到的原始数据里有大量空值、异常值,需要批量剔除或者标记。用“字段 IS NULL”这种表达式可以把空记录一键筛出来,然后做删除或者补充处理。

第二类是专题制图与统计。做现状图或者专题图的时候,往往只需要对特定类别分类显示,或者针对某个类别的图斑做面积汇总。按属性选择后统计面积,比用“汇总统计数据”工具对着全表跑要灵活得多,你可以随时调整筛选条件反复试算。

第三类是批量更新。启动编辑器后,只选中某个行政村的所有图斑,然后打开字段计算器统一修改“权属单位”字段,避免误改其他村的数据。这里“选中集”三个字就是安全边界。

2. 表达式是核心,先把SQL语法这块啃下来

2.1 最基本的等值查询

按属性选择对话框的核心区域是那个表达式输入框,它接收的是类似SQL的表达式,双斜杠后面是字段,等号后面是值。比如刚才提到的水田筛选,表达式写成:

"DLMC" = '水田'

这里有几个规矩必须遵守:

字段名要用英文双引号括起来。如果字段名是纯英文且不带空格,部分版本不加引号也能过,但只要是中文字段名、或者字段名里带了空格、括号这种特殊字符,不加引号必报错。我的习惯是无论什么字段都加双引号,防止翻车。

字符型数据的值要用英文单引号括起来,数字型不需要。这是新手最容易犯的错,写成“DLMC = 水田”系统会直接告诉你类型不匹配。另外注意一定用英文输入法的单引号,中文引号在表达式里是非法字符,排查起来非常隐蔽。

数值型的等值或不等值查询就更简单了:

"AREA" = 1000 "AREA" >= 5000 AND "AREA" <= 10000

这里我要多说一句,表达式的逻辑核心是“字段—运算符—值”三元组。值的类型必须和字段类型对应,否则就会出现“为什么我选不到结果”这种乌龙。比如“面积”字段是浮点型的,你写“面积 = '1000'”,等于拿字符串去比数字,结果必然是零。

2.2 模糊匹配与LIKE通配符

很多时候我们并不知道字段的准确值,或者只需要满足部分条件。这时候就要用到LIKE关键字加通配符了。

  • %代表任意多个任意字符。
  • _代表单个任意字符。

举个例子,有一列“土地用途”字段,里面存的可能是“工业用地-一类”、“工业用地-二类”、“商业用地”、“物流仓储用地”这些,现在想选出所有“工业用地”开头的记录,表达式可以写:

"YTLY" LIKE '工业用地%'

% 放在值的前面还是后面,匹配逻辑完全不同。写'工业用地%'只能匹配以“工业用地”开头的值,而'%工业用地%'则能匹配到任意位置包含“工业用地”四个字的记录。比如“一类工业用地”和“工业用地(一类)”都能被选出来。搞懂这个区别,复杂数据条件下你能少写一半的表达式。

还有一种情况是要选出所有以某个编码结尾的记录,例如大批量数据按代码分类,写"CODE" LIKE '%05'就能把所有最后两位是05的代码挑出来,非常实用的一条小技巧。

2.3 范围查询:大于小于与BETWEEN

数值字段的范围筛选在GIS分析里太常见了。比如要选出面积在1亩到5亩之间的破碎图斑,表达式可以写成:

"AREA_M2" >= 666.67 AND "AREA_M2" <= 3333.35

也可以简洁一点用BETWEEN:

"AREA_M2" BETWEEN 666.67 AND 3333.35

这里有个易错点是范围的边界理解。BETWEEN是闭区间,即包含两端值。如果你只想要大于1亩小于5亩、但不要刚好等于这两个数的图斑,就得老老实实用大于号和小于号组合。

另外,范围查询也可能用在日期字段上。比如查出2020年1月1日至2020年12月31日之间变更的所有图斑:

"BGRQ" >= DATE '2020-01-01' AND "BGRQ" <= DATE '2020-12-31'

ArcGIS里的日期字段默认情况下在表达式里用DATE 'YYYY-MM-DD'这种写法,注意DATE关键字必须大写。很多朋友习惯写成文本格式再比较,结果发现匹配不到,多半就是格式不对。

2.4 复合条件:AND、OR、NOT的优先级

当筛选条件不止一个时,就要用逻辑运算符连接。AND是并且,OR是或者,NOT是否定。它们的优先级顺序,跟数学里的加减乘除类似:NOT最高,其次是AND,最后是OR。

优先级这个概念看着简单,在实际组合条件时经常让人翻车。看这个例子:

"DLMC" = '水田' OR "DLMC" = '旱地' AND "MJ" > 1000

这条表达式的本意可能是“选出水田或旱地中面积大于1000的图斑”,但计算机实际执行的是先算AND,也就是等同于:

"DLMC" = '水田' OR ("DLMC" = '旱地' AND "MJ" > 1000)

结果是所有水田都被选中,旱地里只有面积大于1000的被选中。BMI面积小于1000的水田也被选进来了,这明显不是你要的结果。

正确的写法是加括号:

("DLMC" = '水田' OR "DLMC" = '旱地') AND "MJ" > 1000

括号能强制改变运算顺序,这个习惯一定要养成。只要表达式里混合了AND和OR,别管你认为自己逻辑多清楚,先加括号再说。做数据的人都知道,看似没问题的表达式,出起问题来最致命。

2.5 处理空值与NULL的坑

ArcGIS属性表里的空值是个大坑。它既不是0,也不是空字符串,它是一个特殊的存在:NULL。任何用等于号去匹配NULL值的操作都是无效的。

判断一个字段是否为空,必须用IS NULL或IS NOT NULL:

"ZLDW" IS NULL

这条表达式会选出所有权属单位字段为空的图斑,非常实用。比如从别的软件转过来的数据,经常出现部分字段空着的情况,做入库前的质量检查就用得上。相反,想筛选出有值的记录,就用IS NOT NULL。

特别注意:数字字段为NULL和数字字段为0是两回事。NULL表示没有值,0表示有值且值为零。有些数据在导入过程中会把缺失值补成0,这时候用 IS NULL 选不出来,就需要用"字段" = 0来筛选。判断到底是哪种情况,可以随便选出来几个图斑看看属性表,经验会告诉你怎么选。

3. 实操现场:几个高频场景一步步带你走

3.1 调出按属性选择对话框的三种方式

在ArcMap和ArcGIS Pro里进入按属性选择功能的入口不太一样,但基本逻辑一致。ArcMap里,右键图层打开属性表,左上角有个“按属性选择”的按钮;或者直接从菜单栏“选择”下拉菜单里点“按属性选择”。ArcGIS Pro则是在属性表左上角或者“地图”选项卡的“选择”组里找到。另外一种方式是在内容列表里右键图层,选择“打开属性表”,然后点击右上角的“按属性选择”。

这里顺便唠叨一句,ArcMap和Pro的表达式输入框有一个不太显眼但很有用的功能:双击左侧字段列表可以直接把字段加到表达式里;单击“获取唯一值”按钮,可以看到该字段所有不重复的值,再双击某个值就能把它加入表达式。第一次上手的人很容易忽略这个功能,导致一个个手敲值,既慢又容易错。通过这种方式,你可以准确知道某个字段里到底存了什么格式的值,所见即所得,比自己瞎猜强多了。

3.2 场景一:按地类名称选出目标图斑

拿第三次全国国土调查的数据举例。图层右键打开属性表,调出“按属性选择”对话框。

左侧字段列表里双击“DLMC”(地类名称),此时表达式区出现"DLMC"。点一下“获取唯一值”,下方列表会把所有地类名称都显示出来。双击“水田”或者点一下再点“添加”,表达式就变成:

"DLMC" = '水田'

点“应用”或者“确定”,回到地图界面,所有水田图斑都变成了高亮选中状态。这个时候你可以:

  • 右键图层,选择“数据”→“导出数据”,把选中要素存成单独的数据。
  • 在属性表里右键字段“TBMJ”,选择“统计”,查看总面积、数量、平均面积。
  • 启动编辑会话,单独对这些图斑做字段修改或几何操作。

这里我说一个独家习惯:每次用按属性选择导出数据,我都在“导出数据”对话框里把保存类型选为file geodatabase要素类而不是shapefile。原因之一是字段名长度限制不一样,要素类支持更长字段名,另一个重要原因是中文路径兼容性更好。如果你经常被shp的字段截断问题折磨,不妨试试这个办法。

3.3 场景二:用组合条件筛选出破碎图斑

实际工作中单一条件的筛选远远不够。比如要做耕地破碎度分析,要选出面积小于2000平方米且地类为“旱地”的图斑,表达式这样写:

"DLMC" = '旱地' AND "SHAPE_Area" < 2000

这里有个需要注意的点。ArcMap和Pro的动态字段,直接在表达式里用"SHAPE_Area"或者"Shape_Area"时,要看属性表里是不是真有这个字段。很多标准数据里会自动维护一个面积字段,但如果你拿到的数据是从CAD转过来的,可能就没有这个字段。遇到这种情况,先切换到“常规”选项卡,或者在属性表中右键字段列表,选择“计算几何”,先给所有图斑算一个面积字段出来。没有面积字段,面积筛选无从谈起,巧妇难为无米之炊。

有些时候还需要排除某些类型。比如想选出所有非水浇地的耕地,可以写:

"DLMC" <> '水浇地' AND "DLMC" IN ('水田', '旱地', '水浇地')

等等,这里逻辑上有点绕。我要跳出来解释一下:前面已经选了不等于水浇地,后面又出现在列表里,肯定会冲突。正确写法应该是:

"DLMC" = '水田' OR "DLMC" = '旱地'

或者用IN,更简洁:

"DLMC" IN ('水田', '旱地')

IN关键字在处理“多个离散值取其一”的场景非常好用。如果条件里有十几个地类编码,用OR写会累死,用IN加上逗号分隔的列表,一行搞定。

3.4 场景三:处理日期字段与空值

再来看一个实际项目里高频出现的问题:根据审批日期筛选记录。某地块管理数据库里有“审批日期”字段,想选出所有2020年及以后审批的项目,表达式写:

"SPRQ" >= DATE '2020-01-01'

日期先以DATE关键字开头,再跟一个英文单引号包起来的“年-月-日”字符串。注意ArcGIS自带的属性表日期显示格式在不同的软件设置、数据库类型下可能不一样,但表达式里的格式基本保持'YYYY-MM-DD'最稳。如果你在PostgreSQL里用的源数据,日期写法可能略有不同,这时可以到帮助文档里查一下具体版本说明,但实际工作中我发现大部分时候DATE 'YYYY-MM-DD'都能用。

另外,处理空值的场景也特别多。有一次我拿到一个植被覆盖度评估的矢量,里面“NDVI均值”字段有大量空值,用普通筛选选不出来。那时候用:

"NDVI" IS NOT NULL

选出了所有有效数据,导出后参与后续栅格计算。如果反过来要检查哪些图斑没算出来,就用IS NULL。这个操作简单但经常被忘记,尤其在做数据质量检查时,是空白字段排查的利器。

3.5 场景四:配合字段计算器做批量更新

按属性选择最有威力的玩法之一,是跟字段计算器组合完成批量修改。之前给一个开发区做产业分类整理,原始数据里“产业类型”字段存在很多历史遗留的不规范写法,比如“制造 业”“制造业 ”“制造业/加工”等。

我先用表达式选出完全等于“制造业”的记录:

"CYLB" = '制造业'

再做一次模糊筛选:

"CYLB" LIKE '%制造业%'

然后切换到属性表左下角的“显示所选记录”,右键“产业类型”字段,打开字段计算器,输入统一的标准值“C-制造业”。这样就能把两批图斑的产业类型全部规范化,而不会误改其他类型的数据。

这里强调一下:编辑会话里字段计算器的作用范围,默认是“当前选择集”。如果你没有选择任何要素,它会提示是否要对全部记录执行计算,此时务必想清楚再点“是”。很多人就是在这里手滑把全表数据覆盖了,造成不可逆的错误。养成“先看左下角选中记录数量,再执行计算”的习惯,能杜绝90%的误操作。

4. 容易踩的坑和值得长期用的技巧

4.1 字段名加不加引号,全角半角是硬伤

先说一个最常见的翻车现场。中文字段名或字段里带空格的,必须在表达式里加双引号,否则系统直接报错,这已经说过了。但还有一类问题是全角符号。有些人从网页或Word里复制表达式,引号、括号甚至逗号变成了中文全角状态,粘贴到ArcGIS对话框里,界面根本看不出来区别,但一执行就是“表达式无效”。

解决思路很简单:一律在这两种界面里手写表达式,或者复制后检查引号是否为英文状态。有一种牛逼的检查方法,是把表达式粘贴到记事本里,用英文和中文输入法各敲一个引号对比一下,你就能立刻发现全角半角的视觉差异。这个坑几乎每个ArcGIS老手都踩过,只是不好意思说。

另外,表达式里用的括号也必须是英文括号,有时候用中文字段名时手一快整个表达式都中文了,系统并不认识中文括号。遇到“表达式无效”第一反应永远是检查符号,而不是怀疑功能坏了。

4.2 为什么选出来的数量不对:多部件要素与隐藏问题

有时候你明明觉得表达式写得天衣无缝,但选出来的数量就是和预期对不上。这种时候,八成是数据自身隐藏的问题,最常见的是多部件要素。

举个实例:做地类统计时,用"DLMC" = '果园'选出来600个图斑,但旁边“面积汇总”工具统计出来的图层总面积与导出后重新计算的面积对不上。排查后发现,有一部分图斑是多部件要素,一个记录对应多个分离的几何图形,属性表里是一行,地图上却是好几个互不相连的区域。

多部件要素本身不是错误,但如果你导出的数据后续要参与拓扑检查或面积平差,可能会带来不必要的麻烦。处理方法是使用“多部件至单部件”工具进行拆分,或者在做分析前先检查几何问题。这个工具在ArcToolbox里的“数据管理工具”→“要素”→“多部件至单部件”,运行完再重新统计,数量就正常了。

还有一种隐藏问题是重复几何或自相交。这类问题很难通过肉眼发现,但会让后续的相交、裁剪等分析产生不可预料的结果。建议在处理重要数据集前,先用“检查几何”工具跑一遍,把所有几何问题暴露出来,再继续后面的按属性选择和相关分析。

4.3 性能问题:图层几十万条数据,选择卡顿怎么办

前面的都是功能层面的操作,现在聊聊性能。做大数据量处理的时候,按属性选择有时会等很久才出结果,甚至无响应。这个过程是否流畅,很大程度上取决于的是你是否给目标字段建了属性索引。

属性索引的概念可以简单理解为一本书的目录。没有目录时查内容要一页页翻,建了目录之后直接翻到对应章节。ArcGIS允许对字段创建属性索引,右键图层属性,在“索引”选项卡里点击“添加”,选择要建索引的字段,确定后系统会生成索引文件。对经常用作筛选条件的字段(比如地类编码、行政区代码)加上索引之后,选择速度能提升数倍到数十倍,效果立竿见影。

这里补充一个细节:shp文件的索引后缀是.atx,地理数据库要素类也能建属性索引。如果你发现某次按属性选择非常慢,除了检查索引,还要想一下是不是表达式写得太复杂,比如多个LIKE嵌套或者对文本字段使用带前导通配符的LIKE。LIKE '%XX%'这种写法通常会强制全表扫描,即使有索引也可能用不上,数据量大的时候就会卡。

另外一个建议是在做大规模分析前先做数据预处理,把用不到的字段删掉,只保留与业务相关的字段再开始筛选和统计。字段越少,索引越小,遍历速度越快。这个道理跟收拾屋子一样,东西少了好找。

4.4 按属性选择与定义查询的配合

按属性选择的结果是临时性的,一旦你执行了其他操作,选择集可能就消失了。如果希望某个图层在地图上始终只显示符合条件的要素,一种更稳定的方案是“定义查询”,也就是图层属性里的Definition Query。

在ArcMap中,右键图层→属性→“定义查询”选项卡,在正文框里输入与按属性选择同样的表达式,比如:

"DLMC" IN ('水田', '水浇地')

点击确定后,这个图层就永远只显示这两种地类,其他图斑直接从地图上消失,范围不再出现。这个功能在做专题图、大范围数据浏览时极其好用,也是ArcGIS Pro中切换数据视图的常用手段。

要注意的一点是,定义查询不影响原始数据的完整性,它只是“视图级别”的过滤,关闭定义查询后所有数据都会回来。所以在做数据导出前,要区分清楚自己到底是想要一个独立的数据集,还是仅仅想看图层的一部分。前者用按属性选择后导出,后者用定义查询,两者各有其用。

4.5 SQL Server或PostgreSQL数据库数据的特殊处理

很多企业的GIS数据已经迁到了企业级地理数据库里,比如PostgreSQL、SQL Server或Oracle。这种情况下按属性选择对话框里虽然界面一模一样,但表达式里能用的SQL语法会受底层数据库类型影响,有些写法会不完全兼容。

比如在文件地理数据库里能正常执行的某些函数,在PostgreSQL里可能写法不同;SQL Server里日期字段的写法也可能是'2020-01-01'而不是DATE '2020-01-01'。遇到这类问题,先绕开表达式硬写,试着用对话框图形化的查询构建器点点点,能避免因方言差异带来的语法问题。

另外,企业级数据库的数据量通常更大,强烈建议在数据库层面为常用筛选字段建索引。ArcGIS侧建的属性索引有时候只对文件地理数据库有效,直接连数据库时还是要看数据库本身的索引策略。这种情况就需要DBA介入,在表上创建必要的索引,否则一个简单筛选可能要跑几分钟。

4.6 快速构造表达式的一些实用小习惯

最后分享几个我积攒的表达式构造习惯,至少能帮你省下三分之一的操作时间。

第一,一定要熟悉“获取唯一值”按钮。别靠记忆或者肉眼去猜字段值,点一下看真实值,再双击填入表达式,既准确又省事。对于十几个离散值的筛选,这个操作效率极高。

第二,善于用“切换到SQL模式”或“显示SQL”。在ArcGIS Pro中,按属性选择对话框可以切换到经典SQL模式,直接自由编辑完整表达式。ArcMap也有类似功能。熟悉SQL的人用这种模式写起来行云流水,比点点点的构建器快得多。

第三,复杂表达式建议先复制到记事本里整理好,再粘贴回对话框。这样出了问题好对比,也方便在多个图层之间复用相同条件。尤其是一次性要处理多个数据源的同类筛选,先准备好一个通用模板能大幅提高效率。

第四,注意保存和复用表达式。ArcGIS Pro里能把自定义表达式保存成文件或字符串,后续直接加载。ArcMap虽然没这个功能,但把表达式存成文本文件,用时复制粘贴也是一样的效果。千万别每次重新写,既浪费时间又容易漏写条件。

第五,写完表达式后的条件联合选择方式也很重要。对话框顶部的选择方式下拉框有“新选择”“添加到当前选择集”“从当前选择集中移除”“从当前选择集中选择子集”四个选项。这看似不起眼,实际上配合多步骤筛选非常强大。例如先按行政区选出某个镇,再切到“从当前选择集中选择子集”,加上地类条件,两步操作完成双条件筛选,比一条复杂表达式更直观、更容易排错。

写在最后的一点个人体会

按属性选择这个功能,表面看起来不过是一个筛选对话框,但把它的逻辑吃透之后,你处理数据的方式会完全不一样。我现在拿到一批新数据,第一反应就是先点开属性表,看字段结构,想清楚“我会用什么条件去筛它”。所有后续的制图、统计、分析工作,都建立在“能不能快速准确地拿出目标子集”这个前提之上。

这些年踩过无数坑,大部分问题其实都是小细节:一个引号、一个空值、一个多部件要素。每次排查到最后都有点哭笑不得。但恰恰是这些看起来不起眼的细节,决定了工作流是顺滑还是糟心。建议你把这篇文章收藏起来,遇到相关操作时对照着看一眼,能少走很多弯路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询