OK, vì vậy một nỗ lực thứ hai để trả lời câu hỏi của bạn với một giải pháp GDAL thuần túy.
Đầu tiên, GDAL (Thư viện trừu tượng dữ liệu không gian địa lý) ban đầu chỉ là một thư viện để làm việc với dữ liệu không gian địa lý raster, trong khi thư viện OGR riêng biệt được dự định để làm việc với dữ liệu vectơ. Tuy nhiên, hai thư viện hiện đã được hợp nhất một phần và thường được tải xuống và cài đặt cùng nhau dưới tên kết hợp của GDAL. Vì vậy, giải pháp thực sự thuộc OGR. Bạn có mã này trong mã ban đầu của bạn vì vậy tôi đoán bạn đã biết điều này nhưng đó là một điểm khác biệt quan trọng cần nhớ khi tìm kiếm các mẹo và gợi ý.
Để đọc dữ liệu từ một lớp vectơ, mã ban đầu của bạn vẫn ổn:
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()
Chúng ta cần tạo một tính năng mới trước khi có thể ghi nó vào shapefile (hoặc bất kỳ tập dữ liệu vectơ nào khác). Để tạo một tính năng mới, trước tiên chúng ta cần: - Hình học - Một định nghĩa tính năng, có thể sẽ bao gồm các định nghĩa trường Sử dụng hàm tạo Hình học ogr.Geometry () để tạo một đối tượng Hình học trống. Xác định hình học là gì theo một cách khác nhau cho từng loại (điểm, đường, đa giác, v.v.). Ví dụ:
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(10,20)
hoặc là
line = ogr.Geometry(ogr.wkbLineString)
line.AddPoint(10,10)
line.AddPoint(20,20)
line.SetPoint(0,30,30) #(10,10) -> (30,30)
Đối với một định nghĩa trường
fieldDefn = ogr.FieldDefn('id', ogr.OFTInteger)
Bây giờ bạn có thể tạo lớp vector của bạn. Trong trường hợp này, một đa giác vuông:
#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()