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()
Tive sorte lendo e escrevendo em camadas. Especificamente, eu tenho um código que lerá uma camada de shapefile contendo polilinhas e produzirá a geometria de cada recurso em arquivos de texto (usados como entrada para um modelo antigo).
Parece que pode ser útil obter cada um dos recursos de suas camadas.
Gravar em outra camada não deve ser muito complexo a partir daqui. Algo assim deve funcionar em teoria:
A partir daqui, você poderá obter dados de cada recurso e gravar novos recursos em uma nova camada.
Dan
fonte