Fork me on GitHub

GDAL笔记-chapter5

1.属性过滤条件(作用于图层lyr)

#########属性过滤条件(作用于图层)
import sys
from osgeo import ogr
import ospybook as pb
ds = ogr.Open(r'')
lyr = ds.GetLayer('')
lyr.SetAttributeFilter('')
lyr.GetFeatureCount()
pb.print_attributes(lyr, 4, ['name'], geom='False')

2.空间过滤条件

#######空间过滤条件
ds = ogr.Open(r'')
country_lyr = ds.GetLayer('')
country_lyr.SetAttributeFilter('name="Germany"')
feat = country_lyr.GetNextFeature()
germany = feat.geometry().Clone()
city_lyr = ds.GetLayer('')
city_lyr.SetSpatialFilter(germany)
city_lyr.GetFeatureCount()

3.Clone操作

####为什么要Clone,如果在使用图层前数据源已经超出作用域或者已经被删除,那么相关的图层不再可用
ds = ogr.Open(r'')
lyr = ds.GetLayer('')
feat = lyr.GetNextFeature()
geom_clone = feat.geometry().Clone()
###反例如下(这里就是因为超出的作用域)
feat = ogr.Open().GetLayer().GetNextFeature()
#or
lyr = ogr.Open().GetLayer()
feat = lyr.GetNextFeature()

4.结合空间查询条件和属性查询条件来优化选择

#结合空间查询条件和属性查询条件来优化选择
city_lyr.SetAttributeFilter('')
city_lyr.GetFeatureCount()
city_lyr.SetSpatialFilterRect(minx, miny, maxx, maxy)  #SetSpatialFilterRect用于提供坐标创建矩形进行空间过滤

5.ExecuteSQL函数(该函数可以设置查询的属性,并且作用于数据源ds)

####5.3使用SQL创建临时图层,该函数与过滤函数不同。后 者返回一个包含结果的新图层,前者只是对图层进行筛选。
ds = ogr.Open()
sql = '''SELECT ogr_geom_area as area, name, pop_est FROM 'ne_50m_admin_0_countries' ORDER BY POP_EST ESC'''
lyr = ds.ExecuteSQL(sql)
pb.print_layers(lyr, 3)

6.利用过滤条件CopyLayer复制图层中的要素到新图层

####充分利用过滤条件CopyLayer复制图层中的要素到新图层中
ds = ogr.Open('')
in_lyr = ds.GetLayer('')
in_lyr.SetAttributeFilter('FEATURECLA=''')
out_lyr = ds.CopyLayer(in_lyr, 'capital_cities2')
###用ExecuteSQL可以设置查询的属性
sql='...'
in_lyr2 = ds.ExecuteSQL(sql)
out_lyr2 = ds.CopyLayer(in_lyr2, '...')

此处例举chapter3中的方法进行比较

###矢量数据的写入
import sys
from osgeo import ogr

ds = ogr.Open('')
if ds is None:
    sys.exit('Could not open it')
in_lyr = ds.GetLayer('')
if ds.GetLayer(''):
    ds.DeleteLayer('')

out_lyr = ds.CreateLayer('', in_lyr.GetSpatialRef(), ogr.wkbPoint)  #创建输出图层
out_lyr.CreateFields(in_lyr.schema)  #创建输出图层的属性字段,源自输入图层的属性列表

out_defn = out_lyr.GetLayerDefn()  #获取图层定义
out_feat = ogr.Feature(out_defn)  #创建一个空要素

for in_feat in in_lyr:  #遍历图层的要素
    if in_feat.GetField('...') == '...':
        geom = in_feat.GetGeometry()
        out_feat.SetGeometry(geom)
        for i in range(in_feat.GetFieldCount()):  #遍历要素的属性字段
            value = in_feat.GetField(i)
            out_feat.SetField(i, value)
        out_lyr.CreateFeature(out_feat)  #图层逐个创建要素
del ds

 

 

注:SQL部分章节未看,待续。

posted @ 2020-03-23 19:54  Rser_ljw  阅读(881)  评论(0编辑  收藏  举报