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

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

例如:下面这段代码,是从东北地区的分县数据中选择出吉林省的县级行政单位(对应的Prov_ID为22),并且按行政代码(BNDRY_ID)降序打印。

    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()是将查询结果释放,在执行下一条SQL语句之前一定要先释放。 为了更加方便,同样将查询的结果生成了数据来查看。

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

    while resultFeat :
        print resultFeat.GetField('BNDRY_ID')
        resultFeat = result.GetNextFeature ()

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