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()