版权声明:本文为博主原创文章,转载请注明原文出处!
作者:阿振
写作时间:2020-06-13 夜
在前面几篇博文中,我们分别介绍了矢量空间数据的属性数据的增(CREATE)删(DELETE)改(UPDATE)操作,这篇博文我们来聊聊属性数据的查询(Retrieve)操作。
我们还是使用之前的分省Shapefile数据,主要包含每个省的一些统计信息。下面以两个案例进行介绍:
下面简单说一下使用GDAL进行属性数据查询的两种思路:
Talk is cheap. Show me the code.
首先,我们来看看使用SQL进行查询的代码。
from osgeo import ogr
ogr.UseExceptions()
ds: ogr.DataSource = ogr.Open('../data/Provinces.shp')
# 注意Layer的名称不能包含中文
layer: ogr.Layer = ds.GetLayer()
# 选择出中学数量大于1万所的省份
query: str = f'SELECT NAME, HighSchool FROM {layer.GetName()} WHERE HighSchool > 10000'
selected: ogr.Layer = ds.ExecuteSQL(query)
# 这里的Feature中只包含两个属性NAME和HighSchool
for feature in selected:
print(feature.GetField('NAME'))
# 选择出中学数量最多的省份
# 我尝试使用MAX函数和嵌套的SELECT语句进行实现,但是执行报错,应该是OGR不支持嵌套的SQL查询
query: str = f'SELECT NAME, HighSchool FROM {layer.GetName()} ORDER BY HighSchool DESC'
selected: ogr.Layer = ds.ExecuteSQL(query)
print(selected.GetFeature(0).GetField('NAME'))
print(selected.GetFeature(0).GetField('HighSchool'))
ogr.Open()
函数读取数据,使用GetLayer()
方法获取图层ExecuteSQL()
方法执行查询,得到的查询结果仍然是一个ogr.Layer
图层类,但是图层中的要素属性只包含我们查询语句中指定的字段我们再来看使用遍历Feature要素的方法。
from osgeo import ogr
ogr.UseExceptions()
ds: ogr.DataSource = ogr.Open('../data/Provinces.shp')
# 注意Layer的名称不能包含中文
layer: ogr.Layer = ds.GetLayer()
# 使用filter函数对要素属性进行过滤
selected = list(filter(lambda f: f.GetField('HighSchool') > 10000, layer))
for feature in selected:
print(feature.GetField('NAME'))
# 使用sorted方法对要素进行自定义排序,这里使用逆序
selected = sorted(layer, key=lambda f: f.GetField('HighSchool'), reverse=True)
print(selected[0].GetField('NAME'))
print(selected[0].GetField('HighSchool'))
filter()
函数的第一个参数是一个自定义函数,第二个参数是一个可迭代对象iterable。该函数会遍历可迭代对象将满足第一个自定义函数的值过滤出来。sorted()
函数包含三个参数(后两个可选),第一个参数是一个可迭代对象iterable,第二个参数是用于自定义排序的函数,第三个参数指定是否逆序。sorted()
函数的返回值是一个list
对象。