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是否可执行。