Tamam, sorunuzu saf bir GDAL çözümü ile cevaplamak için ikinci bir girişim.
İlk olarak, GDAL (Jeo-Uzamsal Veri Soyutlama Kütüphanesi) başlangıçta sadece raster coğrafi-uzamsal verilerle çalışmak için bir kütüphane iken, ayrı OGR kütüphanesinin vektör verileriyle çalışması amaçlanmıştır. Bununla birlikte, iki kütüphane şimdi kısmen birleştirilmiştir ve genellikle GDAL'ın birleşik adı altında indirilir ve kurulur. Bu yüzden çözüm gerçekten OGR'nin altına düşüyor. İlk kodunuzda bu var, bu yüzden bunu biliyordum ama ipuçları ve ipuçları ararken hatırlamak önemli bir ayrım.
Bir vektör katmanından veri okumak için ilk kodunuz iyidir:
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()
Bir şekil dosyasına (veya başka bir vektör veri kümesine) yazmadan önce yeni bir özellik oluşturmamız gerekir. Yeni bir özellik oluşturmak için öncelikle şunlara ihtiyacımız vardır: - Bir geometri - Büyük olasılıkla alan tanımlarını içerecek bir özellik tanımı Boş bir Geometri nesnesi oluşturmak için Geometry yapıcısı ogr.Geometry () öğesini kullanın. Her bir tür için (nokta, çizgi, çokgen vb.) Geometrinin ne olduğunu tanımlayın. Yani mesela:
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(10,20)
veya
line = ogr.Geometry(ogr.wkbLineString)
line.AddPoint(10,10)
line.AddPoint(20,20)
line.SetPoint(0,30,30) #(10,10) -> (30,30)
Alan tanımı için
fieldDefn = ogr.FieldDefn('id', ogr.OFTInteger)
Artık vektör katmanınızı oluşturabilirsiniz. Bu örnekte, bir kare çokgen:
#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()