首页 > 代码库 > GDAL读写矢量文件——Python

GDAL读写矢量文件——Python

在Python中使用OGR时,先要导入OGR库,如果需要对中文的支持,还需要导入GDAL库,具体代码如下。Python创建的shp结果如图1所示。

图1 Python创建矢量结果

1 #-*- coding: cp936 -*-2 try:3          from osgeo import gdal4          from osgeo import ogr5 exceptImportError:6          import gdal7          import ogr

1.读取矢量

 1 #-*- coding: cp936 -*- 2 try: 3          from osgeo import gdal 4          from osgeo import ogr 5 exceptImportError: 6          import gdal 7          import ogr 8   9 defReadVectorFile():10          # 为了支持中文路径,请添加下面这句代码11          gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","NO")12          # 为了使属性表字段支持中文,请添加下面这句13          gdal.SetConfigOption("SHAPE_ENCODING","")14  15          strVectorFile ="E:\\Datum\\GDALCsTest\\Debug\\beijing.shp"16  17          # 注册所有的驱动18          ogr.RegisterAll()19  20          #打开数据21          ds = ogr.Open(strVectorFile, 0)22          if ds == None:23                    print("打开文件【%s】失败!", strVectorFile)24                    return25  26          print("打开文件【%s】成功!", strVectorFile)27  28          # 获取该数据源中的图层个数,一般shp数据图层只有一个,如果是mdb、dxf等图层就会有多个29          iLayerCount = ds.GetLayerCount()30  31          # 获取第一个图层32          oLayer = ds.GetLayerByIndex(0)33          if oLayer == None:34                    print("获取第%d个图层失败!\n", 0)35                    return36  37          # 对图层进行初始化,如果对图层进行了过滤操作,执行这句后,之前的过滤全部清空38          oLayer.ResetReading()39  40          # 通过属性表的SQL语句对图层中的要素进行筛选,这部分详细参考SQL查询章节内容41          oLayer.SetAttributeFilter("\"NAME99\"LIKE \"北京市市辖区\"")42  43          # 通过指定的几何对象对图层中的要素进行筛选44          #oLayer.SetSpatialFilter()45  46          # 通过指定的四至范围对图层中的要素进行筛选47          #oLayer.SetSpatialFilterRect()48  49          # 获取图层中的属性表表头并输出50          print("属性表结构信息:")51          oDefn = oLayer.GetLayerDefn()52          iFieldCount = oDefn.GetFieldCount()53          for iAttr in range(iFieldCount):54                    oField =oDefn.GetFieldDefn(iAttr)55                    print( "%s: %s(%d.%d)" % ( 56                                      oField.GetNameRef(),57                                      oField.GetFieldTypeName(oField.GetType() ), 58                                      oField.GetWidth(),59                                      oField.GetPrecision()))60  61          # 输出图层中的要素个数62          print("要素个数 = %d", oLayer.GetFeatureCount(0))63  64          oFeature = oLayer.GetNextFeature()65          # 下面开始遍历图层中的要素66          while oFeature is not None:67                    print("当前处理第%d个: \n属性值:", oFeature.GetFID())68                    # 获取要素中的属性表内容69                    for iField inrange(iFieldCount):70                             oFieldDefn =oDefn.GetFieldDefn(iField)71                             line =  " %s (%s) = " % ( 72                                                oFieldDefn.GetNameRef(),73                                                ogr.GetFieldTypeName(oFieldDefn.GetType()))74  75                             ifoFeature.IsFieldSet( iField ):76                                      line = line+ "%s" % (oFeature.GetFieldAsString( iField ) )77                             else:78                                      line = line+ "(null)"79  80                             print(line)81         82                    # 获取要素中的几何体83                    oGeometry =oFeature.GetGeometryRef()84  85                    # 为了演示,只输出一个要素信息86                    break87  88          print("数据集关闭!")

执行上面的代码,如果不设置属性过滤,输出内容如图3?9上半部分所示,如过设置了属性过滤,输出内容如图3?9下半部分所示。(Python输出的中文转为编码了)。

图2 OGR库使用Python读取矢量示例

2.写入矢量

在使用Python创建矢量图形的时候,使用的WKT格式的字符串来进行创建。也可以使用其他的方式进行创建。代码如下,写出来的矢量图形和属性表如图1所示。

 1 #-*- coding: cp936 -*- 2 try: 3          from osgeo import gdal 4          from osgeo import ogr 5 exceptImportError: 6          import gdal 7          import ogr 8   9 defWriteVectorFile():10          # 为了支持中文路径,请添加下面这句代码11          gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","NO")12          # 为了使属性表字段支持中文,请添加下面这句13          gdal.SetConfigOption("SHAPE_ENCODING","")14  15          strVectorFile ="E:\\TestPolygon.shp"16  17          # 注册所有的驱动18          ogr.RegisterAll()19  20          # 创建数据,这里以创建ESRI的shp文件为例21          strDriverName = "ESRIShapefile"22          oDriver =ogr.GetDriverByName(strDriverName)23          if oDriver == None:24                    print("%s 驱动不可用!\n", strDriverName)25                    return26         27          # 创建数据源28          oDS =oDriver.CreateDataSource(strVectorFile)29          if oDS == None:30                    print("创建文件【%s】失败!", strVectorFile)31                    return32  33          # 创建图层,创建一个多边形图层,这里没有指定空间参考,如果需要的话,需要在这里进行指定34          papszLCO = []35          oLayer =oDS.CreateLayer("TestPolygon", None, ogr.wkbPolygon, papszLCO)36          if oLayer == None:37                    print("图层创建失败!\n")38                    return39  40          # 下面创建属性表41          # 先创建一个叫FieldID的整型属性42          oFieldID =ogr.FieldDefn("FieldID", ogr.OFTInteger)43          oLayer.CreateField(oFieldID, 1)44  45          # 再创建一个叫FeatureName的字符型属性,字符长度为5046          oFieldName =ogr.FieldDefn("FieldName", ogr.OFTString)47          oFieldName.SetWidth(100)48          oLayer.CreateField(oFieldName, 1)49  50          oDefn = oLayer.GetLayerDefn()51  52          # 创建三角形要素53          oFeatureTriangle = ogr.Feature(oDefn)54          oFeatureTriangle.SetField(0, 0)55          oFeatureTriangle.SetField(1, "三角形")56          geomTriangle =ogr.CreateGeometryFromWkt("POLYGON ((0 0,20 0,10 15,0 0))")57          oFeatureTriangle.SetGeometry(geomTriangle)58          oLayer.CreateFeature(oFeatureTriangle)59  60          # 创建矩形要素61          oFeatureRectangle = ogr.Feature(oDefn)62          oFeatureRectangle.SetField(0, 1)63          oFeatureRectangle.SetField(1, "矩形")64          geomRectangle =ogr.CreateGeometryFromWkt("POLYGON ((30 0,60 0,60 30,30 30,30 0))")65          oFeatureRectangle.SetGeometry(geomRectangle)66          oLayer.CreateFeature(oFeatureRectangle)67  68          # 创建五角形要素69          oFeaturePentagon = ogr.Feature(oDefn)70          oFeaturePentagon.SetField(0, 2)71          oFeaturePentagon.SetField(1, "五角形")72          geomPentagon =ogr.CreateGeometryFromWkt("POLYGON ((70 0,85 0,90 15,80 30,65 15,700))")73          oFeaturePentagon.SetGeometry(geomPentagon)74          oLayer.CreateFeature(oFeaturePentagon)75  76          oDS.Destroy()77          print("数据集创建完成!\n")

3.矢量数据管理

 1 defVectorDelete(strVectorFile): 2          # 注册所有的驱动 3          ogr.RegisterAll() 4   5          oDriver = None 6          #打开矢量 7          oDS = ogr.Open(strVectorFile, 0) 8          if oDS == None: 9                    os.remove(strVectorFile)10                    return11  12          oDriver = oDS.GetDriver()13          if oDriver == None:14                    os.remove(strVectorFile)15                    return16  17          ifoDriver.DeleteDataSource(strVectorFile) == ogr.OGRERR_NONE:18                    return19          else:20                    os.remove(strVectorFile)21  22 defVectorRename(strOldFile, strNewFile):23          # 注册所有的驱动24          ogr.RegisterAll()25  26          oDriver = None27          #打开矢量28          oDS = Ogr.Open(strOldFile, 0)29          if oDS == None :30                    os.rename(strOldFile,strNewFile)31                    return32  33          oDriver = oDS.GetDriver()34          if oDriver == None:35                    os.rename(strOldFile,strNewFile)36                    return37  38          oDDS = oDriver.CopyDataSource(oDS,strNewFile, None)39          if oDDS == None:40                    os.rename(strOldFile,strNewFile)41  42          if oDriver.DeleteDataSource(strOldFile)== ogr.OGRERR_NONE:43                    return44          else :45                    os.rename(strOldFile,strNewFile)

 

文章来源:http://blog.csdn.net/liminlu0314/article/details/8828983

 

GDAL读写矢量文件——Python