python矢量数据筛选

9 篇文章 1 订阅
9 篇文章 1 订阅

 属性过滤    【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 运算符 更改字段的类型,这里给一个官方的例子:

 支持转换的类型如下:

5DISTINCT 关键字

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的封装

Python网络编程

python高级用法

django项目案例精讲

人工智能面试题解答

Python文件处理

 云计算 大数据和人工智能

快速学习爬虫基础

【下方分享一些python网盘资料包,大家感兴趣的可以看一下】:

Python全网最热资料包【华清远见发放资料包】http://makerschool.mikecrm.com/6cvAGKm

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值