gdal python | 對shp讀取,新建和更新

1.讀取shp文件

#-*- coding: cp936 -*-
try:
         from osgeo import gdal
         from osgeo import ogr
exceptImportError:
         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("數據集關閉!")
2.新建shp文件
#-*- coding: cp936 -*-
try:
         from osgeo import gdal
         from osgeo import ogr
exceptImportError:
         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.更新

import os,sys
from osgeo import gdal
from osgeo import ogr
from osgeo import osr
import numpy
import transformer
# 爲了支持中文路徑,請添加下面這句代碼
 
 
pathname = sys.argv[1]
choose = sys.argv[2]
gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO")
# 爲了使屬性表字段支持中文,請添加下面這句
gdal.SetConfigOption("SHAPE_ENCODING", "")
# 註冊所有的驅動
ogr.RegisterAll()
# 數據格式的驅動
driver = ogr.GetDriverByName('ESRI Shapefile')
ds = driver.Open(pathname, update=1)
if ds is None:
    print 'Could not open %s'%pathname
    sys.exit(1)
# 獲取第0個圖層
layer0 = ds.GetLayerByIndex(0);
# 投影
spatialRef = layer0.GetSpatialRef();
# 輸出圖層中的要素個數
print '要素個數=%d'%(layer0.GetFeatureCount(0))
print '屬性表結構信息'
defn = layer0.GetLayerDefn()
fieldindex = defn.GetFieldIndex('x')
xfield = defn.GetFieldDefn(fieldindex)
#新建field
fieldDefn = ogr.FieldDefn('newx', xfield.GetType())
fieldDefn.SetWidth(32)
fieldDefn.SetPrecision(6)
layer0.CreateField(fieldDefn,1)
fieldDefn = ogr.FieldDefn('newy', xfield.GetType())
fieldDefn.SetWidth(32)
fieldDefn.SetPrecision(6)
layer0.CreateField(fieldDefn,1)
feature = layer0.GetNextFeature()
# 下面開始遍歷圖層中的要素
while feature is not None:
    # 獲取要素中的屬性表內容
    x = feature.GetFieldAsDouble('x')
    y = feature.GetFieldAsDouble('y')
    newx, newy = transformer.begintrans(choose, x, y)
    feature.SetField('newx', newx)
    feature.SetField('newy', newy)
    layer0.SetFeature(feature)
    feature = layer0.GetNextFeature()
feature.Destroy()
ds.Destroy()

   更新之後,必須SetFeature(),不然數據不會更新。新建的時候有createfeature,已經設置了,所以不需要set。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章