จะเพิ่มคุณสมบัติที่กำหนดเองให้กับ 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 ที่จะอนุญาตให้ฉันแทรกฟิลด์คุณสมบัติของคุณลักษณะลงใน Shapefile ที่มีอยู่หรือไม่

คำตอบ:


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
NP ฉันรู้ตัวอย่าง แต่มองไปสองสามชิ้นเพื่อค้นหาชิ้นส่วนเฉพาะนี้
Derek Swingley

อ่าเยี่ยมมาก ฉันจะรอจนกว่าฉันจะอยู่บ้านและสามารถลองใช้สิ่งนี้ก่อนที่ฉันจะทำเครื่องหมายว่าตอบแล้ว แต่มันก็ดูดี
mattdeboard

ตัวอย่างข้างต้นสร้าง Shapefile ใหม่ จากนั้นคุณต้องโอนย้ายฟิลด์และเรขาคณิตอื่น ๆ ทั้งหมดจากที่มีอยู่ไปยังไฟล์ใหม่ คุณต้องการตัวอย่างที่เพิ่มเขตข้อมูลลงในรูปร่างไฟล์ที่มีอยู่หรือไม่?
klewis

@ klewis- คุณอาจต้องการถามคำถามนี้กับคำถามเดิม ฉันได้รับแจ้งจากคำตอบของคุณ แต่ฉันไม่คิดว่า OP จะเป็นเช่นนั้น
Derek Swingley

10

เป็นไปได้หรือไม่ที่จะเพิ่มฟิลด์ลงใน Shapefile ที่มีอยู่โดยใช้ 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 in layer: feat.SetField ('ชื่อ', 'myname') layer.SetFeature (feat) dataSource = ไม่มี
Dave X
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.