Pythonを使用してカスタムフィーチャ属性をShapefileに追加する方法は?


16

200か国の機能セットを持つ既存のShapefileを取得する方法を探しています。各国の機能には「NAME」という属性があります。私の目的は、「POPULATION」などの任意の(現時点では)追加属性を追加するPythonスクリプトを作成することです。

もちろん、OSGeoおよびGeoDjangoモジュールがインストールされています。私は限りです:

 from osgeo import ogr

    infile = ogr.Open('sample.shp', 1) #'sample.shp' is a pre-existing ESRI shapefile described above
    inlyr = ogr.GetLayerByIndex(0)

Feature属性フィールドを既存のShapefileに挿入できるOGR関数がありませんか?

回答:


13

私は信じて組み立てTIGERポリゴンサンプルは、あなたが探しているものがあります。

# Open the datasource to operate on.

ds = ogr.Open( infile, update = 0 )

poly_layer = ds.GetLayerByName( 'Polygon' )

#############################################################################
#   Create output file for the composed polygons.

nad83 = osr.SpatialReference()
nad83.SetFromUserInput('NAD83')

shp_driver = ogr.GetDriverByName( 'ESRI Shapefile' )
shp_driver.DeleteDataSource( outfile )

shp_ds = shp_driver.CreateDataSource( outfile )

shp_layer = shp_ds.CreateLayer( 'out', geom_type = ogr.wkbPolygon,
                                srs = nad83 )

src_defn = poly_layer.GetLayerDefn()
poly_field_count = src_defn.GetFieldCount()

for fld_index in range(poly_field_count):
    src_fd = src_defn.GetFieldDefn( fld_index )

    fd = ogr.FieldDefn( src_fd.GetName(), src_fd.GetType() )
    fd.SetWidth( src_fd.GetWidth() )
    fd.SetPrecision( src_fd.GetPrecision() )
    shp_layer.CreateField( fd )

おかげで、これはあなたが事前に知っていたものだけですか、検索後に見つけましたか?
-mattdeboard

1
NP、私はサンプルを知っていましたが、この特定の部分を見つけるためにいくつかを調べました。
デレクスイングリー

ああ、いいよ。私は家に帰ってからこれを実装しようとするまで待ってから、これを回答済みとしてマークしますが、見栄えは良いです。
-mattdeboard

上記の例は、新しいシェープファイルを作成します。次に、他のすべてのフィールドとジオメトリを既存のファイルから新しいファイルに転送する必要があります。既存のシェープファイルにフィールドを追加する例が必要ですか?
クレウィス

@ klewis-元の質問の質問としてこれを尋ねることができます。私はあなたの応答を通知されましたが、OPはそうなるとは思いません。
デレクスイングリー

10

Python OGRを使用して既存のシェープファイルにフィールドを追加することは可能ですか?

from osgeo import ogr
driver = ogr.GetDriverByName('ESRI Shapefile')
dataSource = driver.Open(“c:/test/Test2.shp”, 1) #1 is read/write

#define floating point field named DistFld and 16-character string field named Name:
fldDef = ogr.FieldDefn('DistFld', ogr.OFTReal)
fldDef2 = ogr.FieldDefn('Name', ogr.OFTString)
fldDef2.SetWidth(16) #16 char string width

#get layer and add the 2 fields:
layer = dataSource.GetLayer()
layer.CreateField(fldDef)
layer.CreateField(fldDef2)

3
ありがとう。データを取り込み、書き込むために、これらを追加しました:レイヤーの特技:feat.SetField( 'Name'、 'myname')layer.SetFeature(feat)dataSource = None
Dave X
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.