Python——使用OGR操作矢量数据
生活随笔
收集整理的這篇文章主要介紹了
Python——使用OGR操作矢量数据
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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是否可執行。
?
總結
以上是生活随笔為你收集整理的Python——使用OGR操作矢量数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AES加密,由S盒计算逆S盒程序
- 下一篇: xShell6远端登录Linux登录错误