Как добавить атрибуты пользовательских объектов в Shapefile, используя Python?

16

Я ищу способ взять существующий шейп-файл с набором функций из 200 стран. Каждая функция страны имеет атрибут «ИМЯ». Моя цель - создать скрипт 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, которая позволит мне вставлять поля атрибутов объектов в существующий шейп-файл?

mattdeboard
источник

Ответы:

13

Я считаю, что образец Assemble TIGER Polygons имеет то, что вы ищете:

# 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
Н.П., я знал об образцах, но просмотрел несколько, чтобы найти этот конкретный кусок.
Дерек Суингли
Ах, хорошо, отлично. Я собираюсь подождать, пока я не дома, и могу попытаться реализовать это, прежде чем отмечать это как ответ, но это выглядит хорошо.
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 в слое: feat.SetField ('Name', 'myname') layer.SetFeature (feat) dataSource = None
Дейв X