OK jadi upaya kedua untuk menjawab pertanyaan Anda dengan solusi GDAL murni.
Pertama, GDAL (Geospatial Data Abstraction Library) pada awalnya hanya perpustakaan untuk bekerja dengan data geo-spasial raster, sedangkan perpustakaan OGR terpisah dimaksudkan untuk bekerja dengan data vektor. Namun, kedua perpustakaan sekarang sebagian digabungkan, dan umumnya diunduh dan diinstal bersama di bawah nama gabungan GDAL. Jadi solusinya benar-benar berada di bawah OGR. Anda memiliki ini dalam kode awal Anda, jadi saya kira Anda tahu ini, tetapi ini merupakan perbedaan penting untuk diingat ketika mencari tips dan petunjuk.
Untuk membaca data dari layer vektor, kode awal Anda baik-baik saja:
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()
Kita perlu membuat fitur baru sebelum kita dapat menulisnya ke shapefile (atau kumpulan data vektor lainnya). Untuk membuat fitur baru, pertama-tama kita perlu: - Sebuah geometri - Sebuah definisi fitur, yang mungkin akan menyertakan definisi bidang. Gunakan ogr.Geometry konstruktor Geometri () untuk membuat objek Geometri kosong. Tentukan apa geometri dengan cara yang berbeda untuk setiap jenis (titik, garis, poligon, dll.). Jadi misalnya:
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(10,20)
atau
line = ogr.Geometry(ogr.wkbLineString)
line.AddPoint(10,10)
line.AddPoint(20,20)
line.SetPoint(0,30,30) #(10,10) -> (30,30)
Untuk definisi bidang
fieldDefn = ogr.FieldDefn('id', ogr.OFTInteger)
Sekarang Anda dapat membuat layer vektor Anda. Dalam hal ini, poligon persegi:
#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()