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部分章节未看,待续。