Python을 사용하여 Shapefile에 사용자 정의 기능 속성을 추가하는 방법은 무엇입니까?


16

200 개국의 기능 세트가있는 기존 Shapefile을 가져 오는 방법을 찾고 있습니다. 각 국가 지형지 물에는 'NAME'속성이 있습니다. 내 목표는 "POPULATION"과 같은 임의의 추가 속성을 추가하는 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 함수가 누락 되었습니까?

답변:


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을 만듭니다. 그런 다음 다른 모든 필드와 형상을 기존 파일에서 새 파일로 전송해야합니다. 기존 shapefile에 필드를 추가하는 예제가 필요합니까?
klewis

@ klewis- 당신은 원래 질문에 대한 질문으로 이것을 원할 수도 있습니다. 귀하의 답변에 대한 알림을 받았지만 OP가 될 것이라고 생각하지 않습니다.
Derek Swingley

10

Python OGR을 사용하여 기존 shapefile에 필드를 추가 할 수 있습니까?

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 ( 'Name', 'myname') layer.SetFeature (feat) dataSource = None
Dave X
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.