属性选择与空间选择都可以看作是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语句之前一定要先释放。
为了更加方便,同样将查询的结果生成了数据来查看。
可以对查询的结果进行遍历:
1
2
3
|
while
resultFeat
:
print
resultFeat
.
GetField
(
'BNDRY_ID'
)
resultFeat
=
result
.
GetNextFeature
(
)
|
要注意,ExecuteSQL是基于数据集进行的,而不是图层。
本文转自博客园知识天地的博客,原文链接:Python与开源GIS:在OGR中使用SQL语句进行查询,如需转载请自行联系原博主。