GIS按属性选择怎么选多个?SQL条件如何设?

GIS基础理论
Dr.GIS
wowwwai GIS研习社 · 工具流程与项目排障

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

GIS按属性选择多个值 SQL条件设置示意图
按属性选择多个对象时,核心是明确字段、字段类型、多个值之间的逻辑关系,以及选择结果是否符合预期。

引言: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. 混合多个值和多个字段:必须加括号

ORAND 同时出现时,建议主动加括号,避免逻辑误判。

("type" IN ('居住用地', '商业用地')) AND "area" > 10000

这表示先在居住用地、商业用地中筛选,再从中选择面积大于 10000 的要素。

步骤:GIS按属性选择怎么选多个

下面按通用流程说明。无论你使用 QGIS、ArcGIS Pro,还是其他支持属性查询的 GIS 软件,基本思路都类似。

步骤1:打开属性表并确认字段

  1. 在图层列表中找到目标图层。
  2. 打开属性表。
  3. 确认要筛选的字段名称,例如 nametypecodelevel
  4. 查看字段值是否存在空格、错别字、大小写差异。

不要只凭记忆写字段值。建议从属性表中复制一个真实值,避免因为全角半角、空格或简繁体差异导致选不出来。

步骤2:判断字段类型

字段类型决定 SQL 条件如何设。一般可按下面规则判断:

字段类型 示例字段值 SQL写法
文本 海淀区、A001、一级道路 '海淀区''A001'
整数 1、2、100 12100
小数 3.5、12.8 3.512.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:数字编码其实是文本字段

很多行政区划代码、地块编号、站点编号虽然看起来像数字,但本质上是文本。特别是带前导零的编码,例如 001110101

如果字段类型是文本,应写成:

"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 条件如何设,可以按下面清单逐项检查。

  • 是否选对了图层?
  • 字段名是否来自属性表,而不是凭记忆输入?
  • 字段类型是文本、数字,还是日期?
  • 文本字段值是否加了单引号?
  • 数字字段值是否误加了引号?
  • 同一字段多个值是否使用了 INOR
  • 是否把同一字段多个不同值错误写成 AND
  • ANDOR 混合时是否加了括号?
  • 字段值中是否存在空格、错别字、大小写差异?
  • 执行后是否检查了选中数量和地图位置?

一个实用习惯是:先用最简单条件测试能否选中,再逐步增加条件。不要一开始就写很长的 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 吗?

一般不可以。比如一个区县字段不可能同时等于“海淀区”和“朝阳区”。同一字段多个可选值应使用 INOR

6. 如何选择“多个类型并且面积大于某个值”?

可以把多个类型条件放在括号中,再用 AND 叠加面积条件:

("type" IN ('居住用地', '商业用地')) AND "area" > 10000

这样可以避免 ANDOR 的优先级影响选择结果。

7. QGIS和ArcGIS Pro的SQL写法完全一样吗?

不完全一样。核心逻辑一致,但字段名引用方式会受软件和数据源影响。QGIS 表达式中常见字段名写法是双引号,例如 "name";ArcGIS Pro 会根据 Shapefile、File Geodatabase、数据库等数据源自动处理字段分隔符。实际操作时建议用工具界面插入字段名和值。

结论:先理清逻辑,再写SQL条件

GIS按属性选择多个值并不复杂,关键是先判断需求属于“同一字段多个值”,还是“多个字段同时限制”。同一字段多个值优先使用 IN;多个字段组合筛选使用 AND;存在多组可选条件时用括号明确逻辑。

实际工作中,不要只关注 SQL 能不能运行,还要检查选择结果是否合理。只要掌握字段类型、引号规则、INORAND 和括号优先级,绝大多数 GIS按属性选择多个条件的问题都能快速定位并解决。