.GetFeature()和.GetNextFeature()是Python/GDAL库中获取feature特性的函数,但由于实现方法不同造成执行速度差别很大,特别需要遍历整个对象的feature时。
使用.GetFeature()的代码片段:
time_array = []
featureCount = layer.GetFeatureCount()
for i in range(featureCount):
time_t1 = time.time()
feature = layer.GetFeature(i)
time_array.append(time.time()-time_t1)
使用.GetNextFeature()的代码片段:
time_array = []
featureCount = layer.GetFeatureCount()
for i in range(featureCount):
time_t1 = time.time()
#feature = layer.GetFeature(i)
feature = layer.GetNextFeature()
time_array.append(time.time()-time_t1)
执行结果:
原因分析:
对于顺次遍历feature的情况,如现在需获得feature(i)则:
对于.GetFeature(),其初始指针都是从0开始,因此遍历顺序为0,1,...,i,共读取i+1次
对于.GetNextFeature(),当前指针指向feature(i+1),此时只需要将指针下移1次,即读取1次
附录-整个代码:
from osgeo import gdal, ogrimport time
# 防止中文乱码
gdal.SetConfigOption('DXF_ENCODING', 'utf-8')
# 注册所有的驱动
ogr.RegisterAll()
# 数据格式的驱动
driver = ogr.GetDriverByName("DXF")
ds = driver.Open("test.dxf")
layer = ds.GetLayerByIndex(0)
print u'要素个数=%d' % layer.GetFeatureCount()
cad_entities = []
time_t1 = time.time()
f1 = layer.GetFeature(0)
print time.time()-time_t1
time_array = []
featureCount = layer.GetFeatureCount()
for i in range(featureCount):
time_t1 = time.time()
#feature = layer.GetFeature(i)
feature = layer.GetNextFeature()
time_array.append(time.time()-time_t1)