GDAL讀寫向量檔案——Python

來源:互聯網
上載者:User

在Python中使用OGR時,先要匯入OGR庫,如果需要對中文的支援,還需要匯入GDAL庫,具體代碼如下。Python建立的shp結果1所示。


圖1 Python建立向量結果

#-*- coding: cp936 -*-try:         from osgeo import gdal         from osgeo import ogrexceptImportError:         import gdal         import ogr
1.讀取向量

#-*- coding: cp936 -*-try:         from osgeo import gdal         from osgeo import ogrexceptImportError:         import gdal         import ogr defReadVectorFile():         # 為了支援中文路徑,請添加下面這句代碼         gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","NO")         # 為了使屬性工作表欄位支援中文,請添加下面這句         gdal.SetConfigOption("SHAPE_ENCODING","")          strVectorFile ="E:\\Datum\\GDALCsTest\\Debug\\beijing.shp"          # 註冊所有的驅動         ogr.RegisterAll()          #開啟資料         ds = ogr.Open(strVectorFile, 0)         if ds == None:                   print("開啟檔案【%s】失敗!", strVectorFile)                   return          print("開啟檔案【%s】成功!", strVectorFile)          # 擷取該資料來源中的圖層個數,一般shp資料圖層只有一個,如果是mdb、dxf等圖層就會有多個         iLayerCount = ds.GetLayerCount()          # 擷取第一個圖層         oLayer = ds.GetLayerByIndex(0)         if oLayer == None:                   print("擷取第%d個圖層失敗!\n", 0)                   return          # 對圖層進行初始化,如果對圖層進行了過濾操作,執行這句後,之前的過濾全部清空         oLayer.ResetReading()          # 通過屬性工作表的SQL語句對圖層中的要素進行篩選,這部分詳細參考SQL查詢章節內容         oLayer.SetAttributeFilter("\"NAME99\"LIKE \"北京市市轄區\"")          # 通過指定的幾何對象對圖層中的要素進行篩選         #oLayer.SetSpatialFilter()          # 通過指定的四至範圍對圖層中的要素進行篩選         #oLayer.SetSpatialFilterRect()          # 擷取圖層中的屬性工作表表頭並輸出         print("屬性工作表結構資訊:")         oDefn = oLayer.GetLayerDefn()         iFieldCount = oDefn.GetFieldCount()         for iAttr in range(iFieldCount):                   oField =oDefn.GetFieldDefn(iAttr)                   print( "%s: %s(%d.%d)" % ( \                                     oField.GetNameRef(),\                                     oField.GetFieldTypeName(oField.GetType() ), \                                     oField.GetWidth(),\                                     oField.GetPrecision()))          # 輸出圖層中的要素個數         print("要素個數 = %d", oLayer.GetFeatureCount(0))          oFeature = oLayer.GetNextFeature()         # 下面開始遍曆圖層中的要素         while oFeature is not None:                   print("當前處理第%d個: \n屬性值:", oFeature.GetFID())                   # 擷取要素中的屬性工作表內容                   for iField inrange(iFieldCount):                            oFieldDefn =oDefn.GetFieldDefn(iField)                            line =  " %s (%s) = " % ( \                                               oFieldDefn.GetNameRef(),\                                               ogr.GetFieldTypeName(oFieldDefn.GetType()))                             ifoFeature.IsFieldSet( iField ):                                     line = line+ "%s" % (oFeature.GetFieldAsString( iField ) )                            else:                                     line = line+ "(null)"                             print(line)                           # 擷取要素中的幾何體                   oGeometry =oFeature.GetGeometryRef()                    # 為了示範,只輸出一個要素資訊                   break          print("資料集關閉!")

執行上面的代碼,如果不設定屬性過濾,輸出內容3‑9上半部分所示,如過設定了屬性過濾,輸出內容3‑9下半部分所示。(Python輸出的中文轉為編碼了)。

圖2 OGR庫使用Python讀取向量樣本

2.寫入向量

在使用Python建立向量圖形的時候,使用的WKT格式的字串來進行建立。也可以使用其他的方式進行建立。代碼如下,寫出來的向量圖形和屬性工作表1所示。

#-*- coding: cp936 -*-try:         from osgeo import gdal         from osgeo import ogrexceptImportError:         import gdal         import ogr defWriteVectorFile():         # 為了支援中文路徑,請添加下面這句代碼         gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","NO")         # 為了使屬性工作表欄位支援中文,請添加下面這句         gdal.SetConfigOption("SHAPE_ENCODING","")          strVectorFile ="E:\\TestPolygon.shp"          # 註冊所有的驅動         ogr.RegisterAll()          # 建立資料,這裡以建立ESRI的shp檔案為例         strDriverName = "ESRIShapefile"         oDriver =ogr.GetDriverByName(strDriverName)         if oDriver == None:                   print("%s 驅動不可用!\n", strDriverName)                   return                 # 建立資料來源         oDS =oDriver.CreateDataSource(strVectorFile)         if oDS == None:                   print("建立檔案【%s】失敗!", strVectorFile)                   return          # 建立圖層,建立一個多邊形圖層,這裡沒有指定空間參考,如果需要的話,需要在這裡進行指定         papszLCO = []         oLayer =oDS.CreateLayer("TestPolygon", None, ogr.wkbPolygon, papszLCO)         if oLayer == None:                   print("圖層建立失敗!\n")                   return          # 下面建立屬性工作表         # 先建立一個叫FieldID的整型屬性         oFieldID =ogr.FieldDefn("FieldID", ogr.OFTInteger)         oLayer.CreateField(oFieldID, 1)          # 再建立一個叫FeatureName的字元型屬性,字元長度為50         oFieldName =ogr.FieldDefn("FieldName", ogr.OFTString)         oFieldName.SetWidth(100)         oLayer.CreateField(oFieldName, 1)          oDefn = oLayer.GetLayerDefn()          # 建立三角形要素         oFeatureTriangle = ogr.Feature(oDefn)         oFeatureTriangle.SetField(0, 0)         oFeatureTriangle.SetField(1, "三角形")         geomTriangle =ogr.CreateGeometryFromWkt("POLYGON ((0 0,20 0,10 15,0 0))")         oFeatureTriangle.SetGeometry(geomTriangle)         oLayer.CreateFeature(oFeatureTriangle)          # 建立矩形要素         oFeatureRectangle = ogr.Feature(oDefn)         oFeatureRectangle.SetField(0, 1)         oFeatureRectangle.SetField(1, "矩形")         geomRectangle =ogr.CreateGeometryFromWkt("POLYGON ((30 0,60 0,60 30,30 30,30 0))")         oFeatureRectangle.SetGeometry(geomRectangle)         oLayer.CreateFeature(oFeatureRectangle)          # 建立五角形要素         oFeaturePentagon = ogr.Feature(oDefn)         oFeaturePentagon.SetField(0, 2)         oFeaturePentagon.SetField(1, "五角形")         geomPentagon =ogr.CreateGeometryFromWkt("POLYGON ((70 0,85 0,90 15,80 30,65 15,700))")         oFeaturePentagon.SetGeometry(geomPentagon)         oLayer.CreateFeature(oFeaturePentagon)          oDS.Destroy()         print("資料集建立完成!\n")
3.向量資料管理
defVectorDelete(strVectorFile):         # 註冊所有的驅動         ogr.RegisterAll()          oDriver = None         #開啟向量         oDS = ogr.Open(strVectorFile, 0)         if oDS == None:                   os.remove(strVectorFile)                   return          oDriver = oDS.GetDriver()         if oDriver == None:                   os.remove(strVectorFile)                   return          ifoDriver.DeleteDataSource(strVectorFile) == ogr.OGRERR_NONE:                   return         else:                   os.remove(strVectorFile) defVectorRename(strOldFile, strNewFile):         # 註冊所有的驅動         ogr.RegisterAll()          oDriver = None         #開啟向量         oDS = Ogr.Open(strOldFile, 0)         if oDS == None :                   os.rename(strOldFile,strNewFile)                   return          oDriver = oDS.GetDriver()         if oDriver == None:                   os.rename(strOldFile,strNewFile)                   return          oDDS = oDriver.CopyDataSource(oDS,strNewFile, None)         if oDDS == None:                   os.rename(strOldFile,strNewFile)          if oDriver.DeleteDataSource(strOldFile)== ogr.OGRERR_NONE:                   return         else :                   os.rename(strOldFile,strNewFile)
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.