zoukankan      html  css  js  c++  java
  • GDAL读写矢量文件——Python

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


    图1 Python创建矢量结果

    #-*- coding: cp936 -*-
    try:
             from osgeo import gdal
             from osgeo import ogr
    exceptImportError:
             import gdal
             import ogr

    1.读取矢量

    #-*- 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("数据集关闭!")

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

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

    2.写入矢量

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

    #-*- 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.矢量数据管理

    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)
  • 相关阅读:
    CF 936C Lock Puzzle——构造
    LOJ 2980 「THUSCH 2017」大魔法师——线段树
    LOJ 2979 「THUSCH 2017」换桌——多路增广费用流
    LOJ 2978 「THUSCH 2017」杜老师——bitset+线性基+结论
    LOJ 2997 「THUSCH 2017」巧克力——思路+随机化+斯坦纳树
    LOJ 2557 「CTSC2018」组合数问题 (46分)
    bzoj 3158 千钧一发 —— 最小割
    CF1092 D & E —— 思路+单调栈,树的直径
    bzoj 5120 无限之环 & 洛谷 P4003 —— 费用流(多路增广SPFA)
    bzoj 1070 修车 —— 费用流
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6313962.html
Copyright © 2011-2022 走看看