Як додати спеціальні атрибути Feature до Shapefile за допомогою Python?


16

Я шукаю спосіб взяти наявний Shapefile, який містить набір функцій у 200 країнах. Кожна країна має атрибут "NAME". Моя мета - створити сценарій 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)

Чи пропускаю я функцію OGR, яка дозволить мені вставити поля атрибутів Feature у існуючий Shapefile?

Відповіді:


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

@ klewis- ви можете задати це питання як оригінальне запитання. Мені було повідомлено про вашу відповідь, але я не думаю, що це буде ОП.
Дерек Свінглі,

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 ('Ім'я', 'моє ім’я') шар.SetFeature (feat) dataSource = None
Dave X
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.