gdal python | 对shp读取,新建和更新

31 篇文章 8 订阅

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。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Python中使用GDAL库进行矢量叠加可以通过以下步骤实现: 1. 导入所需的库和模块: ```python import ogr import osr from osgeo import gdal ``` 2. 打开两个矢量文件: ```python shp1 = ogr.Open("path/to/shp1.shp") lyr1 = shp1.GetLayer() shp2 = ogr.Open("path/to/shp2.shp") lyr2 = shp2.GetLayer() ``` 3. 创建一个新的矢量数据集和图层来存储叠加结果: ```python driver = ogr.GetDriverByName("ESRI Shapefile") output = driver.CreateDataSource("path/to/output.shp") output_lyr = output.CreateLayer("output", geom_type=ogr.wkbPolygon) ``` 4. 复制shp1的属性表结构到输出图层中: ```python lyr1_def = lyr1.GetLayerDefn() for i in range(lyr1_def.GetFieldCount()): output_lyr.CreateField(lyr1_def.GetFieldDefn(i)) ``` 5. 逐个读取shp1的要素,并使用Intersect方法与shp2进行叠加: ```python for feat1 in lyr1: geom1 = feat1.GetGeometryRef() # 筛选与shp1要素相交的shp2要素 lyr2.SetSpatialFilter(geom1) for feat2 in lyr2: geom2 = feat2.GetGeometryRef() # 判断两个要素是否相交 if geom1.Intersect(geom2): # 创建新的要素 output_feat = ogr.Feature(output_lyr.GetLayerDefn()) # 复制shp1的属性值到输出要素中 for i in range(lyr1_def.GetFieldCount()): output_feat.SetField(i, feat1.GetField(i)) # 将shp1和shp2的几何形状进行叠加 output_feat.SetGeometry(geom1.Intersection(geom2)) # 将新要素添加到输出图层 output_lyr.CreateFeature(output_feat) # 删除shp2筛选器 lyr2.SetSpatialFilter(None) break ``` 6. 关闭打开的矢量文件和输出数据集: ```python shp1 = None shp2 = None output = None ``` 这样,你就可以通过使用GDAL库的API在Python中实现两个矢量shp的叠加操作了。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值