Làm cách nào để thêm thuộc tính Tính năng tùy chỉnh vào Shapefile bằng Python?


16

Tôi đang tìm cách lấy một Shapefile hiện có có Bộ tính năng gồm 200 quốc gia. Mỗi tính năng quốc gia có một thuộc tính của "NAME." Mục tiêu của tôi là tạo ra một tập lệnh Python có thêm một thuộc tính bổ sung tùy ý (bây giờ), nói, "DÂN SỐ".

Tất nhiên tôi đã cài đặt các mô-đun OSGeo và GeoDjango. Tôi xa như:

 from osgeo import ogr

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

Tôi có thiếu chức năng OGR cho phép tôi chèn các trường thuộc tính Feature vào Shapefile hiện tại không?

Câu trả lời:


13

Tôi tin rằng mẫu Đa giác Assemble có những gì bạn đang tìm kiếm:

# 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 )

Cảm ơn, đây chỉ là thứ bạn đã quen thuộc trước đó hay bạn đã tìm thấy nó sau khi tìm kiếm?
mattdeboard

1
NP, tôi biết các mẫu nhưng đã xem qua một vài mẫu để tìm ra mảnh cụ thể này.
Derek Swingley

À, tuyệt. Tôi sẽ đợi cho đến khi tôi ở nhà và có thể cố gắng thực hiện điều này trước khi tôi đánh dấu điều này như đã trả lời, nhưng nó có vẻ tốt.
mattdeboard

Ví dụ trên tạo ra một shapefile mới. Sau đó, bạn phải chuyển tất cả các trường và hình học khác từ tệp hiện có sang tệp mới. Bạn có cần một ví dụ thêm một trường vào một shapefile hiện có không?
klewis

@ klewis- bạn có thể muốn hỏi điều này như một câu hỏi cho câu hỏi ban đầu. Tôi đã được thông báo về phản hồi của bạn nhưng tôi không nghĩ OP sẽ như vậy.
Derek Swingley

10

Có thể thêm một trường vào một shapefile hiện có bằng 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
Cảm ơn. Để điền và ghi dữ liệu, tôi đã thêm vào: for feat in layer: feat.SetField ('Name', 'myname') layer.SetFeature (feat) dataSource = Không
Dave X
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.