Python kullanarak Shapefile'a özel Özellik nitelikleri nasıl eklenir?


16

200 ülke özellik setine sahip mevcut bir Shapefile dosyasını almanın bir yolunu arıyorum. Her ülke Özelliğinin "NAME" özelliği vardır. Amacım, (şimdilik) isteğe bağlı (şimdilik) ek özellik ekleyen bir Python betiği oluşturmaktır.

Tabii ki yüklü OSGeo ve GeoDjango modülleri var. Ben kadarıyla:

 from osgeo import ogr

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

Varolan bir Shapefile özellik özniteliği alanları eklememe izin verecek bir OGR işlevi eksik mi?

Yanıtlar:


13

Bence TIGER Poligonları Birleştir örneğinin aradığına sahip olduğuna inanıyorum :

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

Teşekkürler, bu önceden önceden bildiğiniz bir şey mi, yoksa aradıktan sonra buldunuz mu?
mattdeboard

1
NP, örnekleri biliyordum ama bu özel parçayı bulmak için birkaç tanesine baktım.
Derek Swingley

Ah tamam, harika. Evde olana kadar bekleyeceğim ve bunu cevap olarak işaretlemeden önce uygulamayı deneyebilirim, ama iyi görünüyor.
mattdeboard

Yukarıdaki örnek yeni bir şekil dosyası oluşturur. Ardından diğer tüm alanları ve geometriyi mevcut dosyadan yeni dosyaya aktarmalısınız. Varolan bir şekil dosyasına alan ekleyen bir örneğe mi ihtiyacınız var?
klewis

@ klewis- Bunu orijinal soru üzerine bir soru olarak sormak isteyebilirsiniz. Yanıtınız hakkında bilgilendirildim, ancak OP'nin olacağını sanmıyorum.
Derek Swingley

10

Python OGR kullanarak mevcut bir şekil dosyasına bir alan eklemek mümkün mü ..

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
Teşekkürler. Verileri doldurmak ve yazmak için şunları ekledim: katmandaki feat için: feat.SetField ('Ad', 'myname') layer.SetFeature (feat) dataSource = Yok
Dave X
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.