Python+OGR库学习(二):读取点矢量文件,复制特定属性值点并另存为shp文件

版权声明:本文为博主原创文章,未经允许不得转载 https://blog.csdn.net/weixin_42924891/article/details/85314528

代码思路:

1、导入相关库包,切换到当前文件夹
2、注册驱动,打开点矢量文件,获取图层
3、创建输出文件,并获取图层(没有属性定义)
4、定义输出图层字段属性:假设已知文件所有属性字段定义(即ID和cover)
(1)读取输入文件中某一要素
(2)获取ID、cover字段定义
(3)添加定义到输出图层
(如果不知道属性表具体字段,可以参考前一篇文章获取:https://blog.csdn.net/weixin_42924891/article/details/85269395)
在这里插入图片描述
PS:单纯定义字段属性可以不明确字段名称,读取字段个数,以索引方式定义
5、读取刚刚定义的图层属性表信息
6、遍历所有要素:
(1)获取当前要素cover值
(2)如果满足cover=‘trees’:
创建新要素,复制点到要素,写入点的2个字段值,要素添加到图层,最后清除输出要素
(3)清除临时要素变量,并读取下一要素
7、清除DataSource缓存

关键点:主要操作对象为feature,前面把输入文件layer和输出文件layer相关定义好,再遍历要素,对符合条件的要素进行复制,

代码:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

#导入相关库包
import ogr,os
#切换到目标路径
os.chdir(r'F:\Python+gdal\7weeks数据\7weeks数据\ospy_data1\ospy_data1')
#读取矢量文件
driver = ogr.GetDriverByName('ESRI Shapefile')
inds = ogr.Open('sites.shp',0)
inlayer = inds.GetLayer()
#获取文件空间参考
spatial = inlayer.GetSpatialRef()
#print(spatial)
#创建输出文件
outfile = 'outsites.shp'
outds = driver.CreateDataSource(outfile)
outlayer = outds.CreateLayer('outsites',spatial,geom_type = ogr.wkbPoint)
#获取文件字段属性
infeature = inlayer.GetNextFeature()
idfielddefn = infeature.GetFieldDefnRef('id')##也可以从inlayer获取字段数,循环读取两个字段属性?
coverfielddefn = infeature.GetFieldDefnRef('cover')
#print(id)
#输出layer创建字段
outlayer.CreateField(idfielddefn)
outlayer.CreateField(coverfielddefn)
#获取输出图层属性表信息
outfeaturedefn = outlayer.GetLayerDefn()
#遍历要素
feature = inlayer.GetNextFeature()
while feature:
    cover = feature.GetField('cover')
    if cover == 'trees':
        #如果符合条件,对应创建新的要素
        newfeature = ogr.Feature(outfeaturedefn)
        geom = feature.GetGeometryRef()
        newfeature.SetGeometry(geom)#添加点
        #添加点的字段值
        newfeature.SetField('cover',cover)
        newfeature.SetField('id',feature.GetField('id'))
        #添加要素到图层
        outlayer.CreateFeature(newfeature)
        newfeature.Destroy()
    feature.Destroy()
    feature = inlayer.GetNextFeature()
inds.Destroy()
outds.Destroy()

结果

1、输入文件属性表
在这里插入图片描述
2、输出文件属性表
在这里插入图片描述
*也可以用ExecuteSQL语句直接筛选出features返回layer,然后将layer中所有要素添加到新的shp,学习使用,如有意见,感谢指正

猜你喜欢

转载自blog.csdn.net/weixin_42924891/article/details/85314528