一、使用方法
筛选工具(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
13、数字筛选,区间BETWEEN
例如筛选【Shape_Area】值400至430的图斑:
Shape_Area BETWEEN 400 AND 430
这个方法等效于:
Shape_Area >= 400 AND Shape_Area
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,没有问题: