ArcGIS筛选工具:19段SQL示例代码,所有需求一网打尽

一、使用方法

筛选工具(Select_analysis)主要用于从输入要素类或输入要素图层中提取要素(通常使用选择或结构化查询语言 (SQL) 表达式),并将其存储于输出要素类中。

以三调图斑为例,图斑中有一个【DLMC】字段,该字段值包括(河流水面、农村道路、公路用地、城镇村道路……),如果我们想提取出农村道路并生成单独的要素类,就可以使用【筛选】工具。

筛选工具的路径:【分析工具】—【提取分析】—【筛选】。

以ArcMap为例,打开工具,界面如下:

如果是ArcGIS Pro,工具名称变成了【选择】,界面如下:

Pro里的SQL变成了可操作式的用法,对于新手来说更友好了。当然也可以切换成SQL语句写法:

 

个人觉得,在Pro里,尽可能采用可操作式的用法,方便,容易上手。

但是如果想深入理解SQL筛选的原理,或者你用的是ArcMap,那么SQL语句就必须好好学学。

因为SQL并不只是用在【筛选】工具中,其它的包括图层的定义查询、地图或属性表中的按属性选择、以及一些系统工具的参数设置里,都会用到SQL筛选。

下面就举些SQL筛选语句的具体例子。


二、用法示例

1、等于

例如筛选【DLMC】值为【农村道路】的图斑:

DLMC = '农村道路'

2、不等于

例如筛选【DLMC】值不等于【农村道路】的图斑:

DLMC <> '农村道路'

3、获取开头是特定文字的图斑 LIKE

例如筛选【DLMC】值中开头文字是【其他】的图斑:

DLMC LIKE '其他%'

这里的【%】指代了任意字符或无字符。

语句的意思是前面的字符是【其他】,接下来的可以是任意字符。 

4、获取开头不是特定文字的图斑 LIKE

例如筛选【DLMC】值中开头文字不是【其他】的图斑:

DLMC NOT LIKE '其他%'

这是例3的反义,就是在LIKE前面加个NOT,这种用法很常见,后面很多用法都可以加这个反义用法,可以自已试一试。 

5、获取结尾是特定文字的图斑 LIKE

例如筛选【DLMC】值中结尾文字是【林地】的图斑:

DLMC LIKE '%林地'

这里的【%】同样指代任意字符或无字符。

语句的意思是前面可以是任意字符,但最后两个字符必须是【林地】。 

如果想获取结尾文字不是【林地】的图斑:

DLMC NOT LIKE '%林地'

6、包括多个值 IN

例如筛选【DLMC】值是【沟渠】或【公路用地】的图斑:

DLMC IN ('公路用地', '沟渠')

这里的IN就是集合的意思,后面括号里可以无限添加值 。

它有一个等效的写法,就是【DLMC】等于【公路用地】或【DLMC】等于【沟渠】:

DLMC = '公路用地' Or DLMC = '沟渠'

当然第1种写法更简洁也更优雅,建议都用第1种。 

7、包含文本 LIKE

例如筛选【DLMC】值中包含字符【水】的图斑:

DLMC LIKE '%水%'

这里的【%】同样指代任意字符或无字符。

语句的意思是前面可以是任意字符,中间有一个【%】,后面可以是任意字符。

如果想获取不包含字符【水】的图斑:

DLMC NOT LIKE '%水%'

8、包含文本且格式固定 LIKE

例如筛选【DLMC】值中最后两个字符是【用地】且前面是2个字符的图斑:

DLMC LIKE '__用地'

注意上面那根横线是两个【_】符号。

这个【_】符号指代的是任意一个字符。

如果要筛选前面只有1个字符的图斑:

DLMC LIKE '_用地'

更复杂一点的,如果要筛选中间是【用地】,前面一个字符,后面也是一个字符:

DLMC LIKE '_用地_'

总之,只要明白了【_】符号指代的意思,你也可以根据实际情况随意组合。

9、字符串函数 SUBSTRING等

例如筛选【DLMC】中从第二2位起取2个字符的结果为【村道】的图斑:

SUBSTRING(DLMC FROM 2 FOR 2) = '村道'

这个方法等效于:

DLMC LIKE '_村道%'

字符串函数不止SUBSTRING,其它的以后慢慢再研究。

10、字符串联合 ||

【||】符号所达到的目的是将两个字符串字段的值进行联合,比如说在某一行,【DLBM】的值为【0101】,【DLMC】的值为【水田】,则【DLBM || DLMC】的值则为【0101水田】。

例如筛选【DLBM】和【DLMC】组合值中包含【2竹】的图斑:

(DLBM || DLMC) LIKE '%2竹%'

不过要用在什么地方,说实话我也没想到,反正先记着。

11、获取为空的图斑 NULL

例如筛选【DLMC】值为空的图斑:

DLMC IS NULL

不为空的情况:

DLMC IS NOT NULL

12、数字筛选,大于、小于、大等于、小等于、不等于

例如筛选【Shape_Area】值大于1000的图斑:

Shape_Area > 1000

类似的,【Shape_Area】值小于、大等于、小等于、不等1000: 

Shape_Area < 1000
Shape_Area >= 1000
Shape_Area <= 1000
Shape_Area <> 1000

13、数字筛选,区间BETWEEN

例如筛选【Shape_Area】值400至430的图斑:

Shape_Area BETWEEN 400 AND 430

这个方法等效于:

Shape_Area >= 400 AND Shape_Area <= 430

14、AND组合

例如筛选【DLMC】值中包含字符【水】,并且【Shape_Area】值大于1000的图斑:

DLMC LIKE '%水%' And Shape_Area > 1000

针对这种存在多个逻辑语句时,建议把单个逻辑用括号包起来,方便阅读和理解:

(DLMC LIKE '%水%') And (Shape_Area > 1000)

15、OR组合

例如筛选【DLMC】值中包含字符【水】,或者【Shape_Area】值大于1000的图斑:

(DLMC LIKE '%水%') OR (Shape_Area > 1000)

OR的前后两个逻辑语句,只要满足其中一个,就会被筛选出来。

16、更复杂的混合逻辑

例如筛选【DLMC】为【水田】,或【DLMC】为【旱地】且【GDDB】大等于11的图斑:

DLMC = '水田' Or (DLMC = '旱地' And GDDB > 11)

17、多个字段间的比对筛选

例如筛选【JQDLMC】和【GHDLMC】值不同的图斑:

JQDLMC <> GHDLMC

18、多个字段间的数学计算

例如筛选出【建筑面积】除以【用地面积】的值(即容积率)大于2的图斑:

建筑面积 / 用地面积 > 2

19、获取数字大于平均值的图斑

需要注意这种【SELECT * FROM * 】的用法只有gdb数据才有效,shp要素不行。

例如筛选【Shape_Area】大于平均数的图斑:

查询【Shape_Area】的平均数为14317.8

筛选语句如下:

Shape_Area > (SELECT AVG(Shape_Area) FROM 现状用地)

筛选结果,都大于14317.8,没有问题: