Fork me on GitHub

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。

posted @ 2020-03-23 11:17  Rser_ljw  阅读(565)  评论(0编辑  收藏  举报