Jak dodać niestandardowe atrybuty Feature do Shapefile przy użyciu Pythona?

16

Szukam sposobu na przejęcie istniejącego pliku Shapefile, który ma zestaw funkcji obejmujący 200 krajów. Każda funkcja kraju ma atrybut „NAME”. Moim celem jest stworzenie skryptu w języku Python, który doda dowolny (jak na razie) dodatkowy atrybut, powiedzmy „LUDNOŚĆ”.

Oczywiście mam zainstalowane moduły OSGeo i GeoDjango. Jestem tak daleko jak:

 from osgeo import ogr

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

Czy brakuje mi funkcji OGR, która pozwoli mi wstawić pola atrybutu Feature do istniejącego pliku Shapefile?

mattdeboard
źródło

Odpowiedzi:

13

Wierzę, że próbka Assemble TIGER Polygons ma to, czego szukasz:

# 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 )
Derek Swingley
źródło
Dzięki, czy to tylko coś, co znałeś wcześniej, czy znalazłeś to po wyszukiwaniu?
mattdeboard,
1
NP, znałem próbki, ale przejrzałem kilka, aby znaleźć ten konkretny kawałek.
Derek Swingley,
Ach ok, świetnie. Mam zamiar poczekać, aż będę w domu i mogę spróbować to zaimplementować, zanim oznaczę to jako odpowiedź, ale wygląda dobrze.
mattdeboard
Powyższy przykład tworzy nowy plik kształtu. Następnie musisz przenieść wszystkie pozostałe pola i geometrię z istniejącego do nowego pliku. Potrzebujesz przykładu, który dodaje pole do istniejącego pliku kształtu?
klewis
@ klewis- możesz zadać to pytanie jako pytanie pierwotne. Zostałem powiadomiony o twojej odpowiedzi, ale nie sądzę, że OP będzie.
Derek Swingley
10

Czy można dodać pole do istniejącego pliku kształtu za pomocą 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)
Dave
źródło
3
Dzięki. Aby wypełnić i zapisać dane, dodałem te: for feat in layer: feat.SetField ('Name', 'myname') layer.SetFeature (feat) dataSource = None
Dave X