1、这部分的代码需要在前面“读ArcGIS shape文件”的代码后执行,先读后写,需要借用之前fieldlist等变量。
2、代码示例如下
from osgeo import ogr,gdal,osr
import osgeo
import os
# 解决中文路径
osgeo.gdal.SetConfigOption('GDAL_FILENAME_IS_UTF8', 'NO')
# 解决 SHAPE 文件的属性值
osgeo.gdal.SetConfigOption('SHAPE_ENCODING', 'gb2312')
filename = "cntry98_new.shp"
driver = ogr.GetDriverByName("ESRI Shapefile")
#如文件已存在,则删除
if os.access(filename, os.F_OK ):
driver.DeleteDataSource(filename)
#创建 Shape 文件
ds = driver.CreateDataSource(filename)
#用本地的arbitrary定义未知投影
spatialref = osr.SpatialReference( 'LOCAL_CS["arbitrary"]' )
#spatialref = osr.SpatialReference()
spatialref.ImportFromEPSG(4326)
geomtype = ogr.wkbPolygon
#创建图层
layer = ds.CreateLayer(filename [:-4], srs=spatialref, geom_type=geomtype)
#在Python3里fd.has_key的属性已经没有了,需要用in
#将字段列表写入图层
for fd in fieldlist:
field = ogr.FieldDefn(fd['name'],fd['type'])
if 'width' in fd:
field.SetWidth(fd['width'])
if 'decimal' in fd:
field.SetPrecision(fd['decimal'])
layer.CreateField(field)
#将 SF 数据记录(几何对象及其属性写入图层)
for i in range(len(reclist)):
geom = ogr.CreateGeometryFromWkt(geomlist[i])
#创建 SF
feat = ogr.Feature(layer.GetLayerDefn())
feat.SetGeometry(geom)
for fd in fieldlist:
feat.SetField(fd['name'], reclist[i][fd['name']])
# 将 SF 写入图层
layer.CreateFeature(feat)
ds.Destroy() #关闭文件
3、将字段列表、属性以及几何对象写入在新的shape文件后,文件及属性表与原来所读的shape文件一致。