GIS按属性选择怎么选多个?SQL条件如何设?
很多同学在做制图、统计或数据清洗时都会遇到一个问题:GIS按属性选择怎么选多个?SQL条件如何设? 例如想一次选出多个乡镇、多个用地类型、多个道路等级,结果 SQL 条件写错后,要么选不出来,要么把不该选的数据也选进来了。本文用通用 GIS 思路讲清楚“按属性选择多个值”的写法,并结合 QGIS、ArcGIS Pro 和常见字段类型说明怎么检查结果。

引言:GIS按属性选择多个值的典型场景
GIS按属性选择通常用于从图层中筛选符合条件的要素。这里的“要素”可以是点、线、面,例如学校点、道路中心线、行政区面。
常见需求包括:
- 从行政区图层中选出多个区县。
- 从土地利用图层中选出耕地、林地、草地。
- 从道路图层中选出高速、国道、省道。
- 从人口统计图层中选出人口大于某个阈值的街道。
- 从监测点图层中选出多个站点编号。
这些需求看起来简单,但真正出错的地方通常不是工具按钮,而是 SQL 条件。尤其是字段类型、引号、AND 与 OR 的关系、括号优先级,经常会导致选择结果异常。
背景:为什么按属性选择多个条件容易出错
按属性选择本质上是在属性表中执行一个查询表达式。GIS 软件会根据你写的 SQL 条件,逐行判断每个要素是否满足要求,满足则被选中。
出错最常见的原因有四类:
- 字段类型不清楚:文本字段和数字字段的 SQL 写法不同。
- 多个值关系写错:同一字段多个值应该用 OR 或 IN,而不是 AND。
- 字段名和字段值混淆:字段名是列名,字段值是单元格里的内容。
- 括号缺失:多个条件混合时,逻辑优先级可能与预期不一致。
例如,要选择“区县名”为“海淀区”或“朝阳区”的要素,正确逻辑是同一个字段等于多个可能值中的任意一个。如果写成“区县名等于海淀区并且区县名等于朝阳区”,几乎不可能选到结果,因为同一个要素的同一个字段不能同时等于两个不同名称。
原理:SQL条件如何设才符合GIS选择逻辑
在 GIS 按属性选择中,最常用的 SQL 条件包括等于、不等于、大于、小于、AND、OR、IN、LIKE 等。理解这些条件的逻辑,比背软件界面更重要。
1. 选择单个文本值
如果字段是文本类型,字段值通常需要加单引号。
"name" = '海淀区'
其中 "name" 是字段名,'海淀区' 是字段值。不同软件对字段名引号的显示略有差异,有的使用双引号,有的使用方括号,但字段值为文本时通常要用单引号。
2. 选择单个数字值
如果字段是数字类型,字段值一般不加单引号。
"level" = 1
如果把数字字段写成 '1',有些软件会自动转换,有些数据源可能报错或选择异常。因此最好先确认字段类型。
3. 同一字段选择多个值:优先用 IN
GIS按属性选择多个值时,最推荐的写法是 IN。它清晰、简洁,也不容易写错。
"name" IN ('海淀区', '朝阳区', '丰台区')
上面这句表示:字段 name 的值只要是海淀区、朝阳区、丰台区中的任意一个,就会被选中。
4. 同一字段选择多个值:也可以用 OR
如果软件或数据源不支持 IN,也可以使用 OR。
"name" = '海淀区' OR "name" = '朝阳区' OR "name" = '丰台区'
这和 IN 的含义基本相同,但当值很多时,可读性会变差,也更容易漏写字段名。
5. 多个字段组合筛选:用 AND
如果要同时满足多个字段条件,使用 AND。
"type" = '居住用地' AND "area" > 10000
这表示只选择用地类型为居住用地,并且面积大于 10000 的要素。
6. 混合多个值和多个字段:必须加括号
当 OR 和 AND 同时出现时,建议主动加括号,避免逻辑误判。
("type" IN ('居住用地', '商业用地')) AND "area" > 10000
这表示先在居住用地、商业用地中筛选,再从中选择面积大于 10000 的要素。
步骤:GIS按属性选择怎么选多个
下面按通用流程说明。无论你使用 QGIS、ArcGIS Pro,还是其他支持属性查询的 GIS 软件,基本思路都类似。
步骤1:打开属性表并确认字段
- 在图层列表中找到目标图层。
- 打开属性表。
- 确认要筛选的字段名称,例如
name、type、code、level。 - 查看字段值是否存在空格、错别字、大小写差异。
不要只凭记忆写字段值。建议从属性表中复制一个真实值,避免因为全角半角、空格或简繁体差异导致选不出来。
步骤2:判断字段类型
字段类型决定 SQL 条件如何设。一般可按下面规则判断:
| 字段类型 | 示例字段值 | SQL写法 |
|---|---|---|
| 文本 | 海淀区、A001、一级道路 | '海淀区'、'A001' |
| 整数 | 1、2、100 | 1、2、100 |
| 小数 | 3.5、12.8 | 3.5、12.8 |
| 日期 | 2024-01-01 | 根据软件和数据库格式设置 |
如果站点编号看起来像数字,但字段类型是文本,例如 '001'、'002',仍然要按文本字段处理。
步骤3:同一字段选多个文本值
例如要从行政区图层中选择多个区县:
"county" IN ('海淀区', '朝阳区', '丰台区')
如果使用 OR,则写成:
"county" = '海淀区' OR "county" = '朝阳区' OR "county" = '丰台区'
推荐优先使用 IN,尤其是值较多时更清晰。
步骤4:同一字段选多个数字值
例如要选择道路等级为 1、2、3 的要素:
"road_level" IN (1, 2, 3)
数字字段不需要给值加单引号。若字段实际是文本类型,则应写成:
"road_level" IN ('1', '2', '3')
步骤5:按多个属性组合选择
例如要选择“类型为学校或医院,并且面积大于 5000”的地块:
"type" IN ('学校', '医院') AND "area" > 5000
如果条件更复杂,建议加括号:
("type" IN ('学校', '医院')) AND ("area" > 5000)
步骤6:按模糊文本选择
如果字段值中包含某个关键词,可以用 LIKE。例如选择名称中包含“学校”的要素:
"name" LIKE '%学校%'
这里的 % 表示任意字符。这个条件适合名称不完全一致的情况,例如“第一实验学校”“中心学校”“某某学校”。
步骤7:执行选择并验证结果
执行按属性选择后,不要马上导出或分析,先检查结果:
- 查看被选中要素数量是否符合预期。
- 在地图窗口缩放到选中要素,观察空间位置是否合理。
- 打开属性表,只显示选中记录,检查字段值是否正确。
- 随机抽查几条记录,确认没有误选或漏选。
如果选中数量为 0,优先检查字段名、字段值、引号和字段类型。
常见坑:SQL条件写错时如何排查
坑1:同一字段多个值误用 AND
错误写法:
"county" = '海淀区' AND "county" = '朝阳区'
这表示同一个字段同时等于两个不同值,通常不会选中任何要素。
正确写法:
"county" IN ('海淀区', '朝阳区')
坑2:文本值没有加单引号
错误写法:
"type" = 居住用地
正确写法:
"type" = '居住用地'
文本字段值必须作为字符串处理,否则软件可能把它识别成字段名或表达式。
坑3:数字编码其实是文本字段
很多行政区划代码、地块编号、站点编号虽然看起来像数字,但本质上是文本。特别是带前导零的编码,例如 001、110101。
如果字段类型是文本,应写成:
"code" IN ('001', '002', '003')
如果写成 IN (1, 2, 3),可能无法匹配。
坑4:字段值里有隐藏空格
有些数据从 Excel、CSV 或外部系统导入后,字段值前后会带空格。例如看起来是“海淀区”,实际可能是“海淀区 ”。
排查方法:
- 从属性表中复制字段值到查询条件。
- 使用唯一值列表选择,减少手动输入。
- 必要时先清洗字段值,再执行选择。
坑5:OR 和 AND 混用不加括号
错误风险写法:
"type" = '学校' OR "type" = '医院' AND "area" > 5000
这类条件容易产生与预期不一致的结果。更稳妥的写法是:
("type" IN ('学校', '医院')) AND "area" > 5000
坑6:中文字段名或特殊字符字段名导致报错
有些数据字段名是中文,或者包含空格、横线、括号等特殊字符。不同 GIS 软件和数据源对字段名的引用方式不同,可能导致 SQL 报错。
建议做法:
- 优先使用软件的字段双击插入功能,不要手写字段名。
- 尽量将字段名规范化为英文、数字、下划线组合。
- 导入数据库前检查字段命名规则。
方法比较:QGIS、ArcGIS Pro与数据库SQL的写法差异
不同 GIS 工具的界面不同,但按属性选择多个值的核心逻辑一致。差异主要体现在字段名引用、表达式语法和数据源支持上。
| 工具或场景 | 适合写法 | 注意点 |
|---|---|---|
| QGIS按属性选择 | "type" IN ('学校', '医院') |
字段名通常用双引号,建议使用表达式构建器插入字段和值。 |
| ArcGIS Pro按属性选择 | type IN ('学校', '医院') |
字段分隔符会随数据源变化,使用工具界面生成条件更稳妥。 |
| PostGIS或空间数据库 | type IN ('学校', '医院') |
需要注意表名、字段名大小写、索引和字符编码。 |
| Shapefile图层 | "type" IN ('学校', '医院') |
字段名长度可能受限制,中文编码也可能影响显示。 |
| GeoPackage图层 | "type" IN ('学校', '医院') |
字段和中文支持通常比 Shapefile 更稳定。 |
如果只是做桌面 GIS 选择,优先使用软件自带的按属性选择工具。如果需要批量处理、多图层重复筛选,建议考虑模型构建器、ArcPy、PyQGIS 或数据库 SQL。
IN 与 OR 怎么选
| 写法 | 优点 | 适用场景 |
|---|---|---|
IN |
简洁、易读、适合多个值 | 同一字段匹配多个固定值 |
OR |
逻辑直观、兼容性较好 | 条件较少或需要兼容特定工具 |
AND |
用于叠加限制条件 | 多个字段必须同时满足 |
LIKE |
适合模糊匹配 | 字段值不完全一致但包含关键词 |
检查清单:执行按属性选择前后要确认什么
如果你不确定 SQL 条件如何设,可以按下面清单逐项检查。
- 是否选对了图层?
- 字段名是否来自属性表,而不是凭记忆输入?
- 字段类型是文本、数字,还是日期?
- 文本字段值是否加了单引号?
- 数字字段值是否误加了引号?
- 同一字段多个值是否使用了
IN或OR? - 是否把同一字段多个不同值错误写成
AND? AND和OR混合时是否加了括号?- 字段值中是否存在空格、错别字、大小写差异?
- 执行后是否检查了选中数量和地图位置?
一个实用习惯是:先用最简单条件测试能否选中,再逐步增加条件。不要一开始就写很长的 SQL。
FAQ:GIS按属性选择多个条件常见问题
1. GIS按属性选择怎么一次选多个名称?
如果多个名称都在同一个字段中,推荐使用 IN。例如:
"name" IN ('海淀区', '朝阳区', '丰台区')
这比连续写多个 OR 更简洁,也更适合多个值筛选。
2. SQL条件如何设才能选择多个分类?
如果分类字段是文本,写法如下:
"class" IN ('耕地', '林地', '草地')
如果分类字段是数字编码,写法如下:
"class_code" IN (1, 2, 3)
关键是先确认字段类型。
3. 按属性选择多个值时 IN 和 OR 有什么区别?
IN 是同一字段匹配多个固定值的简写形式,适合多个值。OR 更通用,但写起来更长。例如:
"type" IN ('学校', '医院')
等价于:
"type" = '学校' OR "type" = '医院'
4. 为什么我按属性选择后结果为0?
常见原因包括字段名写错、字段值写错、文本值未加单引号、数字编码字段其实是文本、字段值有隐藏空格。建议先复制属性表中的真实字段值,再写一个最简单的等值条件测试。
5. 同一个字段多个值可以用 AND 吗?
一般不可以。比如一个区县字段不可能同时等于“海淀区”和“朝阳区”。同一字段多个可选值应使用 IN 或 OR。
6. 如何选择“多个类型并且面积大于某个值”?
可以把多个类型条件放在括号中,再用 AND 叠加面积条件:
("type" IN ('居住用地', '商业用地')) AND "area" > 10000
这样可以避免 AND 和 OR 的优先级影响选择结果。
7. QGIS和ArcGIS Pro的SQL写法完全一样吗?
不完全一样。核心逻辑一致,但字段名引用方式会受软件和数据源影响。QGIS 表达式中常见字段名写法是双引号,例如 "name";ArcGIS Pro 会根据 Shapefile、File Geodatabase、数据库等数据源自动处理字段分隔符。实际操作时建议用工具界面插入字段名和值。
结论:先理清逻辑,再写SQL条件
GIS按属性选择多个值并不复杂,关键是先判断需求属于“同一字段多个值”,还是“多个字段同时限制”。同一字段多个值优先使用 IN;多个字段组合筛选使用 AND;存在多组可选条件时用括号明确逻辑。
实际工作中,不要只关注 SQL 能不能运行,还要检查选择结果是否合理。只要掌握字段类型、引号规则、IN、OR、AND 和括号优先级,绝大多数 GIS按属性选择多个条件的问题都能快速定位并解决。