GDAL笔记-chapter3
1.打印图层中前十个要素的属性字段
方法1
import sys from osgeo import ogr fn = r'E:\桌面文件保存路径\gdal\osgeopy-data\osgeopy-data\global\ne_50m_populated_places.shp' ds = ogr.Open(fn,0) #打开矢量数据源 if ds is None: sys.exit('Could not open {0}.'.format(fn)) lyr = ds.GetLayer(0) #打开数据所在图层 i=0 for feat in lyr: #遍历图层中的要素 pt = feat.geometry() #获取要素的几何体 x = pt.GetX() y = pt.GetY() name = feat.GetField('NAME') #获取要素的属性字段 pop = feat.GetField('POP_MAX') print(name,pop,x,y) i+=1 if i == 10: break del ds
方法2
import ospybook as pb pb.print_attributes(fn, 3, ['NAME'], ['POP_MAX'])
2.根据已有矢量数据创建新的矢量数据
这里文件夹里有很多shapefile文件,可以将文件夹作为输入数据,每一个shp文件作为一个图层打开。
######3.5从别的矢量数据中创建矢量数据 import sys from osgeo import ogr ds = ogr.Open(r'E:\桌面文件保存路径\gdal\osgeopy-data\osgeopy-data\global', 1) #打开一个文件夹作为数据源,里面多为shpfile if ds is None: sys.exit('Could not open folder') in_lyr = ds.GetLayer('ne_50m_populated_places') #读取图层代表读取shp,一个shp文件对应一个图层 if ds.GetLayer('capital_cities'): ds.DeleteLayer('capital_cities') out_lyr = ds.CreateLayer('capital_cities', in_lyr.GetSpatialRef(), ogr.wkbPoint) #创建图层2 out_lyr.CreateFields(in_lyr.schema) #给图层2创建属性字段,传递图层1的属性字段列表 out_defn = out_lyr.GetLayerDefn() #获取图层要素定义信息,创建新要素 out_feat = ogr.Feature(out_defn) for in_feat in in_lyr: if in_feat.GetField('FEATURECLA') == 'Admin-0 capital': geom = in_feat.geometry() #读取几何类型 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
3.创建新的数据源
####直接创建新的数据源 # ds = ogr.Open(r'') # driver = ds.GetDriver() #从已经打开的数据中获取驱动
json_fn = r'test.json' json_driver = ogr.GetDriverByName('GeoJSON') #直接通过驱动创建文件 json_ds = json_driver.CreateDataSource(json_fn) if os.path.exists(json_fn): json_driver.DeleteDataSource(json_fn) #用driver删除数据源,如果用python的删除函数,没法删除shp/shx/dbf所有 json_ds = json_driver.CreateDataSource(json_fn) #创建数据源 if json_ds is None: sys.exit('Could not create {0}.'.format(json_fn))
4.使用ogr.UseExceptions
####使用ogr例外 ogr.UseExceptions() #开启例外,利用try except语句输出错误信息 fn = r'' driver = ogr.GetDriverByName('GeoJSON') try: ds = driver.CreateDataSource(fn) lyr = ds.CreateLayer('layer') except RuntimeError as e: print(e)
5.属性字段的新建、更新/ 要素的新建、更新、删除
###新建属性字段 coord_fld = ogr.FieldDefn('X', ogr.OFTReal) #创建字段定义 coord_fld.SetWidth(8) #设置字段宽度 coord_fld.SetPrecision(3) #设置字段精度 out_lyr.CreateField(coord_fld) #在图层中创建字段 coord_fld.SetName('Y') #重用定义,只更改名称来创建另一个属性字段 out_lyr.CreateField(coord_fld) ####更新现有数据 i = lyr.GetLayerDefn().GetFieldIndex('Name') #更改一个字段的名字 fld_defn = ogr.FieldDefn('City Name', ogr.OFTString) lyr.AlterFieldDefn(i, fld_defn, ogr.ALTER_NAME_FLAG) #####更改字段的多个属性信息 lyr_defn = lyr.GetLayerDefn() i = lyr_defn.GetFieldIndex('X') #获取原X字段索引及宽度 width = lyr_defn.GetFieldDefn(i).GetWidth() fld_defn = ogr.FieldDefn('X_coord', ogr.OFTReal) #创建新的字段,浮点型 fld_defn.SetWidth(width) #设置宽度 fld_defn.SetPrecision(4) #设置精度 flag = ogr.ALTER_NAME_FLAG+ogr.ALTER_WIDTH_PRECISION_FLAG lyr.AlterFieldDefn(i, fld_defn, flag) #更新字段属性 ###要素的添加、更新和删除 lyr.CreateField(ogr.FieldDefn('ID', ogr.OFTInterger)) #创建字段定义并且用图层添加字段 n = 1 for feat in lyr: feat.SetField('ID', n) #添加字段信息,并且用图层添加要素 lyr.SetFeature(feat) n += 1 for feat in lyr: if feat.GetField('City_Name')=='Seattle': lyr.DeleteFeature(feat.GetFID()) #通过FID号删除指定的要素 ds.ExecuteSQL('REPACK' + lyr.GetName()) #shp回收空间 # ds.ExecuteSQL('VACCUM') #SQLite回收空间 ds.ExecuteSQL('RECOMPUTE EXTENT ON ' + lyr.GetName()) #shp文件重新计算空间范围
摘自Geoprocessing with python。