Python与开源GIS:在OGR中使用SQL语句进行查询

摘要: 属性选择与空间选择都可以看作是OGR内置的选择功能,这两种功能可以解决大部分实际中的问题。但是也有这种时候,就是进行查询时的条件比较复杂。针对这种情况,OGR也提供了更加灵活的解决方案:支持使用SQL语句进行查询。 例如执行SQL查询语句ExecuteSQL(...

属性选择与空间选择都可以看作是OGR内置的选择功能,这两种功能可以解决大部分实际中的问题。但是也有这种时候,就是进行查询时的条件比较复杂。针对这种情况,OGR也提供了更加灵活的解决方案:支持使用SQL语句进行查询。

例如执行SQL查询语句ExecuteSQL(),凭借SQL的强大功能,可以执行更复杂的任务。例如下面这段代码,是从东北地区的分县数据中选择出吉林省的县级行政单位(对应的Prov_ID为22),并且按行政代码(BNDRY_ID)降序打印。

 
1
2
3
4
5
6
7
8
9
10
11
from osgeo import ogr
driver=ogr.GetDriverByName("ESRI Shapefile")
world_shp='/opt/gdata/fenxian.shp'
world_ds=ogr.Open(world_shp)
world_layer=world_ds.GetLayer()
world_layer_name=world_layer.GetName()
result=world_ds.ExecuteSQL("select * from %s where prov_id = '22' order by BNDRY_ID desc"%(world_layer_name))# )
resultFeat=result.GetNextFeature()
out_shp='/opt/gdata/sql_res.shp'
create_shp_by_layer(out_shp,result)
world_ds.ReleaseResultSet(result)

可以看到上面使用的SQL语句与平常的SQL语句没有什么区别,我们使用了SELECT语句,也使用了WHERE条件;不同的是在OGR中,结果会生成空间数据。

最后一句|ReleaseResultSet(<result_layer>)是将查询结果释放,在执行下一条SQL语句之前一定要先释放。

为了更加方便,同样将查询的结果生成了数据来查看。

Python与开源GIS:在OGR中使用SQL语句进行查询

可以对查询的结果进行遍历:

 
1
2
3
whileresultFeat:
    print resultFeat.GetField('BNDRY_ID')
    resultFeat=result.GetNextFeature()

要注意,ExecuteSQL是基于数据集进行的,而不是图层。

上一篇:SQL语句关联查询


下一篇:Finger Trees: A Simple General-purpose Data Structure