Python——使用OGR操作矢量数据

本文介绍如何使用OGR库进行Shapefile文件的操作,包括打开、读取、创建及复制Shapefile文件等基本功能。通过Python代码示例展示了如何获取Shapefile文件的基本信息,如驱动名、图层数目、要素数量和空间范围等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OGR库是GDAL的一个分支

获取Shapefile信息

>>> from osgeo import ogr
>>> datasource=ogr.Open("E:/2019全国行政区划/省.shp")
>>> driver=datasource.GetDriver()
>>> driver.name
'ESRI Shapefile'
>>> dir(datasource)
['AbortSQL', 'CommitTransaction', 'CopyLayer', 'CreateLayer', 'DeleteLayer', 'Dereference', 'Destroy', 'ExecuteSQL', 'FlushCache', 'GetDescription', 'GetDriver', 'GetLayer', 'GetLayerByIndex', 'GetLayerByName', 'GetLayerCount', 'GetMetadata', 'GetMetadataDomainList', 'GetMetadataItem', 'GetMetadata_Dict', 'GetMetadata_List', 'GetName', 'GetRefCount', 'GetStyleTable', 'GetSummaryRefCount', 'Reference', 'Release', 'ReleaseResultSet', 'RollbackTransaction', 'SetDescription', 'SetMetadata', 'SetMetadataItem', 'SetStyleTable', 'StartTransaction', 'SyncToDisk', 'TestCapability', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__swig_destroy__', '__weakref__', 'name', 'this', 'thisown']





>>> from osgeo import ogr
>>> import sys
>>> inshp='"E:/2019全国行政区划/省.shp"'
>>> driver=ogr.GetDriverByName('ESRI Shapefile')
>>> datasource=driver.Open(inshp,update=0)
>>> if datasource:
...    print('done')
... else:
...    print('could not open')
...
could not open        
>>> ogr.GetDriverCount()
82
>>> datasource.Destory()

2.获取图层信息

>>> from osgeo import ogr
>>> datasource=ogr.Open("E:/2019全国行政区划/省.shp")
>>> layer=datasource.GetLayer(0)  #矢量数据只有一个图层,默认为0
>>> dir(layer)  #查看图层可执行操作
['AlterFieldDefn', 'Clip', 'CommitTransaction', 'CreateFeature', 'CreateField', 'CreateFields', 'CreateGeomField', 'DeleteFeature', 'DeleteField', 'Dereference', 'Erase', 'FindFieldIndex', 'GetDescription', 'GetExtent', 'GetFIDColumn', 'GetFeature', 'GetFeatureCount', 'GetFeaturesRead', 'GetGeomType', 'GetGeometryColumn', 'GetLayerDefn', 'GetMetadata', 'GetMetadataDomainList', 'GetMetadataItem', 'GetMetadata_Dict', 'GetMetadata_List', 'GetName', 'GetNextFeature', 'GetRefCount', 'GetSpatialFilter', 'GetSpatialRef', 'GetStyleTable', 'Identity', 'Intersection', 'Reference', 'ReorderField', 'ReorderFields', 'ResetReading', 'RollbackTransaction', 'SetAttributeFilter', 'SetDescription', 'SetFeature', 'SetIgnoredFields', 'SetMetadata', 'SetMetadataItem', 'SetNextByIndex', 'SetSpatialFilter', 'SetSpatialFilterRect', 'SetStyleTable', 'StartTransaction', 'SymDifference', 'SyncToDisk', 'TestCapability', 'Union', 'Update', '__bool__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'schema', 'this', 'thisown']
>>> layer.GetFeatureCount()  #查看图层要素数目
35
>>> layer.GetExtent()   #查看图层空间范围,四至(西东南北)
(73.50114210000005, 135.08851148000016, 6.323420775000072, 53.56090105000009)


#图层属性
>>> for i in range(layerdef.GetFieldCount()):
...     defn=layerdef.GetFieldDefn(i)
...     print(defn.GetName(),defn.GetWidth(),defn.GetType(),defn.GetPrecision())
...
省代码 10 12 0
省 50 4 0
类型 50 4 0
>>> 

创建矢量数据文件

1.创建shp数据

>>> from osgeo import ogr
#创建Shapefile驱动,以创建数据文件
>>> driver=ogr.GetDriverByName('ESRI Shapefile')
#>>> ds=driver.CreateDataSource('E:\python_wmx\test_1004.shp')
#>>> layer=ds.CreateLayer('test',geom_type=ogr.wkbPoint)
#ERROR 1: Failed to create file E:\python_wmx    est_1004.shp: No error
#文件地址的斜杠使用反斜杠,否则会出错
#创建shp文件
>>> ds=driver.CreateDataSource('E:/python_wmx/test_1004.shp')
#创建图层
>>> layer=ds.CreateLayer('test',geom_type=ogr.wkbPoint)
#添加新字段,前提条件是已创建图层,且该图层中不存在数据
>>> fieldDefn=ogr.FieldDefn('id',ogr.OFTString)
#添加的是字符串的话需要设定宽度
>>> fieldDefn.SetWidth(4)
>>> layer.CreateField(fieldDefn)
0
#将字段field添加完整,并从layer中读取相应的要素类型,才可在ArcGIS中打开
>>> featureDefn=layer.GetLayerDefn()
>>> feature=ogr.Feature(featureDefn)
#设定几何形状
>>> point=ogr.Geometry(ogr.wkbPoint)
>>> point.SetPoint(0,123,123)
>>> feature.SetGeometry(point)
0
#设定字段id的值
>>> feature.SetField('id',23)
#将feature写入layer中
>>> layer.CreateFeature(feature)
0
#从内存中清除ds,并存入磁盘中,若不进行该操作,创建的一系列要素将不被写入文件
>>> ds.Destroy()
#生成结果可在ArcGIS中查看

2.复制新的Shp

#数据源层次复制
>>> from osgeo import ogr
>>> import os,math
>>> inshp='E:/2019全国行政区划/省.shp'
>>> ds=ogr.Open(inshp)
>>> driver=ogr.GetDriverByName("ESRI Shapefile")
>>> outputfile='E:/python_wmx/sheng_copy1.shp'
#os.access(path,mode) 检查权限模式
>>> if os.access(outputfile,os.F_OK):
...      driver.DeleteDatSource(outputfile)  #检查是否已经存在同名称数据,若存在即删掉
#CopyDataSource(数据源,生成数据路径)
>>> pt_cp=driver.CopyDataSource(ds,outputfile)
>>> pt_cp.Release()  #将数据写入磁盘中,利用该函数释放此数据


#图层层次复制

os.access(path,mode)   检验权限模式

os.access()方法使用当前的uid/gid尝试访问路径。大部分操作使用有效的uid/gid,因此运行环境可以在suid/sgid环境尝试。

path -- 要用来检测是否有访问权限的路径。

mode -- mode为F_OK,测试存在的路径,或者它可以是包含R_OK, W_OK和X_OK或者R_OK, W_OK和X_OK其中之一或者更多。

os.F_OK: 作为access()的mode参数,测试path是否存在。
os.R_OK: 包含在access()的mode参数中 , 测试path是否可读。
os.W_OK 包含在access()的mode参数中 , 测试path是否可写。
os.X_OK 包含在access()的mode参数中 ,测试path是否可执行。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值