それでは、純粋なGDALソリューションを使用して2回目の質問に答えてみてください。
まず、GDAL(Geospatial Data Abstraction Library)はもともとラスター地理空間データを操作するためのライブラリでしたが、別のOGRライブラリはベクターデータを操作するためのものでした。ただし、2つのライブラリーは現在部分的にマージされており、通常はGDALの結合名で一緒にダウンロードおよびインストールされます。そのため、ソリューションは本当にOGRに該当します。最初のコードにこれがあるので、知っていたと思いますが、ヒントやヒントを検索する際に覚えておくべき重要な違いです。
ベクターレイヤーからデータを読み取るには、最初のコードで十分です。
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()
シェープファイル(またはその他のベクターデータセット)に書き込む前に、新しい機能を作成する必要があります。新しいフィーチャを作成するには、最初に次のものが必要です。-ジオメトリ-おそらくフィールド定義を含むフィーチャ定義Geometryコンストラクタogr.Geometry()を使用して空のGeometryオブジェクトを作成します。タイプ(ポイント、ライン、ポリゴンなど)ごとに異なる方法でジオメトリを定義します。たとえば、次のとおりです。
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(10,20)
または
line = ogr.Geometry(ogr.wkbLineString)
line.AddPoint(10,10)
line.AddPoint(20,20)
line.SetPoint(0,30,30) #(10,10) -> (30,30)
フィールド定義用
fieldDefn = ogr.FieldDefn('id', ogr.OFTInteger)
これで、ベクターレイヤーを作成できます。この例では、正方形のポリゴンは次のとおりです。
#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()