Python+OGR库学习(四):重投影shp文件并另存,属性表保持不变
2018-12-31 16:10
686 查看
版权声明:本文为博主原创文章,未经允许不得转载 https://blog.csdn.net/weixin_42924891/article/details/85469881
代码关键点
1、首先要定义好转换参数
2、主要操作对象是要素,需要提前创建好输出文件,然后遍历所有要素,对每一个几何对象进行坐标转换
3、输出文件的字段属性定义需要从输入文件读取
代码思路
1、导入相关包,切换路径,注册驱动
2、定义转换关系
3、打开输入文件,读取到图层,创建输出文件,定义字段属性
4、遍历要素,循环读取要素、转换投影、创建对应新要素写入几何,并添加要素到图层
5、定义空间参考文件.prj
代码
#! usr/bin/env python3 # -*- coding:utf-8 -*- #导入相关包 import ogr,os,osr #定义投影转换关系 inosr = osr.SpatialReference() inosr.ImportFromEPSG(4269) outosr = osr.SpatialReference() outosr.ImportFromEPSG(26912) trans = osr.CoordinateTransformation(inosr,outosr) #读取矢量文件,获取图层 os.chdir(r'F:\Python+gdal\7weeks数据\7weeks数据\ospy_data2\ospy_data2') driver = ogr.GetDriverByName('ESRI Shapefile') infile = 'ut_counties.shp' inds = ogr.Open(infile,0) inlayer = inds.GetLayer() #创建输出文件 if os.path.exists('out_country.shp'): driver.DeleteDataSource('out_country.shp') outds = driver.CreateDataSource('out_country.shp') outlayer = outds.CreateLayer('out_country',geom_type = ogr.wkbPolygon) #定义输出属性表信息 feature = inlayer.GetFeature(0)#读取一个要素,以便获取表头信息 infieldcount = feature.GetFieldCount() print(infieldcount) for attr in range(infieldcount): infielddefn = feature.GetFieldDefnRef(attr) print(infielddefn.GetName())#输出输入矢量的所有字段名称 outlayer.CreateField(infielddefn) #inlayer.ResetReading() #print(dir(feature)) #获取输出文件属性表信息 outfielddefn = outlayer.GetLayerDefn() #遍历输入矢量文件,对每一要素投影转换 infeature = inlayer.GetNextFeature() while infeature: geom = infeature.GetGeometryRef() geom.Transform(trans) outfeature = ogr.Feature(outfielddefn) outfeature.SetGeometry(geom) outfeature.SetField('name',infeature.GetField('name')) outlayer.CreateFeature(outfeature) infeature.Destroy() outfeature.Destroy() infeature = inlayer.GetNextFeature() #清除缓存 inds.Destroy() outds.Destroy() #保存投影文件 outosr.MorphFromESRI() prjfile = ('out_country.prj') fn = open(prjfile,'w') fn.write(outosr.ExportToWkt()) fn.close()
结果
补充
1、在利用输入文件某一要素定义输出字段属性时,除了inlayer.GetFeature(0)获取第一个要素,也可以inlayer.GetNextFeature(),但这种方法必须在下一次读取要素之前重置:inlayer.ResetReading(),保证下一次读取还是从头开始,否则输出文件可能会少一个要素
2、定义空间参考文件时,除了创建.prj,可以直接在创建图层时定义,但还是要保证对每一个要素都进行坐标转换。
之后整理各种方式筛选要素、要素之间简单的几何分析、以及定义函数和模块,批量对shp文件投影转换。
相关文章推荐
- 压缩、复制保持目录和文件的属性不变
- Python 练习------文件属性,Json数据
- python 中移去文件的只读属性
- python打开文件并获取文件相关属性的方法
- python提取CSS文件中背景图片等属性的外部链接值
- python进阶之py文件内置属性
- cp 拷贝文件保持源文件的时间属性
- python的文件和系统属性
- Python文件对象的内建方法和属性
- 测量地图,给shp文件赋参考坐标系,并给mxd文档中的数据框架设置投影类型
- 如何在加入域后保持原有的系统配置文件不变-即漫游配置文件
- 在ashx文件中输出html中的文本框和按钮,并且当单击按钮时,输出文本框中的文字到网页上,同时文本框中的内容保持不变。
- python类中的特殊属性and特殊方法and特殊文件
- python实例26[查询修改文件的属性]
- Python读属性文件
- 小工具---修改.shp文件,删除指定属性的要素(gdal, boost库)
- python应用之文件属性浏览
- 图片和文字保持相对位置不变以及background属性
- 对python 读取线的shp文件实例详解
- ArcEngine读取shp文件属性表