好的,第二次尝试使用纯GDAL解决方案来回答您的问题。
首先,GDAL(地理空间数据抽象库)最初只是一个用于处理栅格地理空间数据的库,而单独的OGR库则旨在用于矢量数据。但是,这两个库现在已部分合并,并且通常以GDAL的组合名称一起下载和安装。因此,解决方案确实属于OGR。您在初始代码中就有了此功能,所以我想您知道这一点,但这是在搜索提示和提示时要记住的重要区别。
要从矢量层读取数据,您可以使用初始代码:
from osgeo import ogr
shapefile = ogr.Open(shapefile)
layer = shapefile.GetLayer(0)
for i in range(layer.GetFeatureCount()):
feature = layer.GetFeature(i)
name = feature.GetField("NAME")
geometry = feature.GetGeometryRef()
print i, name, geometry.GetGeometryName()
我们需要先创建一个新功能,然后才能将其写入shapefile(或任何其他矢量数据集)。要创建新特征,我们首先需要:-几何-特征定义,其中可能包含字段定义。使用几何构造函数ogr.Geometry()创建一个空的几何对象。为每种类型(点,线,多边形等)定义几何形状不同的几何形状。因此,例如:
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(10,20)
要么
line = ogr.Geometry(ogr.wkbLineString)
line.AddPoint(10,10)
line.AddPoint(20,20)
line.SetPoint(0,30,30) #(10,10) -> (30,30)
对于字段定义
fieldDefn = ogr.FieldDefn('id', ogr.OFTInteger)
现在,您可以创建矢量层。在这种情况下,一个正方形多边形:
#create simple square polygon shapefile:
from osgeo import ogr
driver = ogr.GetDriverByName('ESRI Shapefile')
datasource = driver.CreateDataSource('YOUR_PATH')
layer = datasource.CreateLayer('layerName',geom_type=ogr.wkbPolygon)
#create polygon object:
myRing = ogr.Geometry(type=ogr.wkbLinearRing)
myRing.AddPoint(0.0, 0.0) #LowerLeft
myRing.AddPoint(0.0, 10.0) #UpperLeft
myRing.AddPoint(10.0, 10.0) #UpperRight
myRing.AddPoint(10.0, 0.0) #Lower Right
myRing.AddPoint(0.0, 0.0) #close ring
myPoly = ogr.Geometry(type=ogr.wkbPolygon)
myPoly.AddGeometry(myRing)
print ('Polygon area =',myPoly.GetArea()) #returns correct area of 100.0
#create feature object with point geometry type from layer object:
feature = ogr.Feature( layer.GetLayerDefn())
feature.SetGeometry(myPoly)
layer.CreateFeature(feature)
#flush memory - very important
feature.Destroy()
datasource.Destroy()