Wechat: yu389741| Email: gisdqy@163.com

Shop:https://www.giserdqy.com/shop

Python+OGR库学习(四):重投影shp文件并另存,属性表保持不变



代码关键点

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文件投影转换。

转载自:https://blog.csdn.net/weixin_42924891/article/details/85469881