属性过滤 【Python学习交流群:772882553】
OGR 属性过滤,是利用 layer.SetAttributeFilter(filter_string) 函数进行要素筛选的。其参数 filter_string 即过滤条件,而这里依据运算符类型将过滤条件分为了 4 类:比较运算符(Comparison Operators)、逻辑运算符(Logical Operators)、成员运算符(Membership Operators)以及模糊匹配(涉及通配符)。
一、比较运算符
为了将变量名添加至过滤字符串中,我们可以利用字符串对象的 format() 方法来格式化字符串:
二、逻辑运算符
上述 AND 运算符组成的过滤条件更推荐使用 BETWEEN AND 语句:
三、成员运算符
同样地,我们可以用 format() 方法来格式化过滤条件:如下所示,多个字符串组成一个列表,但由于需要传入一个元组,因此需要进行类型转换:
四、模糊匹配
模糊匹配主要使用 LIKE 语句并配合通配符:首先模糊匹配不区分大小写,另外,_(即下划线)可以匹配任意单个字符,而 % 可以匹配任意数量的字符(0 至无数个),[char_list] 匹配字符列表中的任何单一字符,[^char_list](或 [!char_list])匹配不在字符列表中的任何单一字符。
接下来我们利用属性过滤来改写曾在 矢量数据的写入 一文的开篇的个案例,具体代码实现如下:这里利用属性过滤,并通过 CopyLayer() 函数将过滤后的图层复制到新的图层文件中,这样改写是不是简单多了。
经验总结:
1. 上述案例中,我若将过滤条件写为 'FEATURECLA = "Admin-0 capital"',即外层单引号内层双引号,则会报错,因此,像这种引号内包含引号的语句,最好外层用双引号,内层的字符串用单引号。
2. 我们在对某个图层对象进行属性过滤操作后,后续若还需要用到该图层,则需要清除属性过滤条件,只需给属性过滤方法传递一个 None 值即可,如 lyr.SetAttributeFilter(None)。利用这一点,我们将上述案例的属性过滤封装一下:
空间过滤
空间过滤即利用空间范围来筛选要素,可以用来选择位于另一个要素内部或矩形边界框内部的要素。还有一个必要条件:用于空间过滤的要素或坐标,必须与被筛选的图层具有相同的空间参考系统。
一、位于另一个要素内部
语法:被过滤图层.SetSpatialFilter(过滤要素的几何对象)。
举例:我们拿一个面图层(代码中的 filter_lyr)中的一个要素去过滤另外一个点图层(即 be_filtered_lyr),显然,这个面要素的范围小于点图层的范围。
上述第二行代码中,之所以利用 Clone() 函数,是为了防止过滤要素被删除后,与其相关的几何对象不再可用,这时,我们可以克隆一个几何对象。
同样地,和属性过滤一样,我们在对图层对象进行空间过滤后,若后续用到该图层,则需要清除空间过滤条件,即给空间过滤方法传入一个 None 值即可。
二、位于边界框内部
首先,可以利用过滤图层的 lyr.GetExtent() 方法来获取它的四至范围,它会返回一个形如 (min_x,max_x,min_y,max_y) 的元组,然后利用上述四至范围对被过滤图层进行矩形框空间过滤,代码如下:
注意:
1. 这里要注意 SetSpatialFilterRect(min_x, min_y, max_x, max_y) 的参数的顺序,不能将 GetExtent() 方法获取的空间范围直接带入上述过滤方法。
2. 使用 SetSpatialFilterRect() 函数无法清除空间过滤。
SQL 语句过滤
倘若我们要对图层进行更复杂的筛选,则可以借助 SQL(Structured Query Language,结构查询语言)语句来进行过滤。
执行 sql 查询需借助 ds.ExecuteSQL(sql 语句, [spatialFilter], [dialect) 函数(带 [] 为可选参数):
注意:对于出错的语句或筛选后没有结果集的语句,SQL 查询的结果为空。
spatialFilter:是针对结果做空间过滤,可以为空。
dialect:参数类型为字符串,用于说明 sql 语句用的是何种标准,可以为空,若为空则默认是 OGR 标准。
返回值:包含查询结果的 OGRLayer。
我们借助 SQL 查询语句继续改写第一小节属性过滤中的例子,代码实现如下:sql 语句要用 3 对引号包裹,若 WHERE 子句中存在字段串,则使用与外层不同类型的引号,这里建议外层双引号,内层单引号。
上述代码中,使用 *(星号)来表示选取所有字段,这里也可以指定需要的字段,接下来我们将总结一下 SQL 语句的相关语法。
一、SELECT 语句
SELECT 语句用于从表中选取数据,其后跟表中的字段名(列名称),多个名称之间用 ,(逗号)相连。
1. 选择所有字段
可以使用 *(星号)来代表所有字段:当然不包括下面的特定字段。
2. 选择内置的特殊字段
OGR SQL 标准中的内置的特殊字段见下表:
这里针对上表中的字段列举几个官网上的例子:
3. 使用字段别名
若字段名比较长,我们可以使用 AS 关键字 来重命名一个简洁一点的名字:
4. 更改字段类型
OGR SQL 支持使用 CAST 运算符 更改字段的类型,这里给一个官方的例子:
支持转换的类型如下:
5. DISTINCT 关键字
DISTINCT关键字 用于返回字段中唯一不同的属性值,即去重。
6. 汇总运算符(summarization operators)
还可以借助函数来处理返回的字段的属性值,如:COUNT(实例计数)、AVG(数值平均)、SUM(数值和)、MIN(数值最小值) 和 MAX(数值最大值)。
DISTINCT 关键字也可以和 COUNT() 结合使用:
7. 函数
这里举俩例子:个人觉得应该用不上
,最起码用的不多。
二、WHERE 子句
WHERE 子句:有条件地从表中选取数据,语法如下:
我们设置条件会用到属性查询中的运算符,具体可以参考第一小节的属性过滤中的讲解,这里列举几个官网上的例子:
三、ORDER BY 语句
ORDER BY 语句:根据指定的字段(列)进行排序,默认为升序排列,若要降序则加上 DESC 关键字(升序为关键字为 ASC)。
四、LIMIT 子句与 OFFSET 子句
LIMIT 子句:用于限制返回的记录数;而 OFFSET 子句:表示偏移值,用于跳过的记录数,例子如下:
五、表连接
OGR SQL 标准支持有限形式的一对一连接,原理:根据次表与查询的主表之间的共享键,以查找次表中的记录。
这里举个例子来说明:我们拿“ne_50m_populated_places”(居住地,别名为 pp)的数据和“ne_50m_admin_0_countries”(国家,别名为c)数据通过基于(ON)“adm0_a3”相同的字段来连接(LEFT JOIN),然后输出主表(居住地)的城市名称(city,为别名,后同)和城市人口(city_pop),及次表中的国家名称(country)和国家人口(country_pop),并限定(WHERE)仅选取首都城市(adm0cap = 1)。
注:LEFT JOIN: 从左表(主表)返回所有的行,即使在右表(次表)中没有匹配的行。
最后做一下总结,SELECT 语句语法如下:
另外,更多关于 OGR SQL 的内容请参考文末第 3 篇参考资料,若觉得中文翻译得不够准确,可以结合文末第 2 篇英文原版参考资料,关于通用的 SQL 语法请参考文末最后一篇参考资料。
好了,以上就是本文的所有内容,希望对大家有所帮助!鉴于本人水平有限,若有错误还请评论提醒我哦。
【Python学习交流群:772882553】
【下方分享一些学习资料,大家感兴趣的话可以看一下】:
【下方分享一些python网盘资料包,大家感兴趣的可以看一下】:
Python全网最热资料包【华清远见发放资料包】http://makerschool.mikecrm.com/6cvAGKm