OK, então uma segunda tentativa de responder sua pergunta com uma solução GDAL pura.
Em primeiro lugar, o GDAL (Geospatial Data Abstraction Library) era originalmente apenas uma biblioteca para trabalhar com dados geoespaciais rasterizados, enquanto a biblioteca OGR separada destinava-se a trabalhar com dados vetoriais. No entanto, as duas bibliotecas agora estão parcialmente mescladas e geralmente são baixadas e instaladas juntas com o nome combinado de GDAL. Portanto, a solução realmente se enquadra no OGR. Você tem isso no seu código inicial, então acho que sabia disso, mas é uma distinção importante a ser lembrada ao procurar dicas e sugestões.
Para ler dados de uma camada vetorial, seu código inicial é bom:
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()
Precisamos criar um novo recurso antes de poder gravá-lo em um shapefile (ou qualquer outro conjunto de dados vetoriais). Para criar um novo recurso, primeiro precisamos: - Uma geometria - Uma definição de recurso, que provavelmente incluirá definições de campo Use o construtor Geometry ogr.Geometry () para criar um objeto Geometry vazio. Defina qual é a geometria de maneira diferente para cada tipo (ponto, linha, polígono etc.). Então, por exemplo:
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(10,20)
ou
line = ogr.Geometry(ogr.wkbLineString)
line.AddPoint(10,10)
line.AddPoint(20,20)
line.SetPoint(0,30,30) #(10,10) -> (30,30)
Para uma definição de campo
fieldDefn = ogr.FieldDefn('id', ogr.OFTInteger)
Agora você pode criar sua camada vetorial. Nesse caso, um polígono quadrado:
#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()