[GIS] Why does this python OGR code for creating a layer and then adding a field not work

fields-attributesogrpython

Spot the difference!
So this works…

fp = "C:\\LiDAR\\MyLayer.shp"
layer = "MyLayer"
driver = ogr.GetDriverByName("ESRI Shapefile")
data_source = driver.CreateDataSource(fp)
srs = osr.SpatialReference()
srs.ImportFromEPSG(4326)
layer = data_source.CreateLayer(layer, srs, ogr.wkbPoint)

field_name = ogr.FieldDefn("Ben", ogr.OFTString)
field_name.SetWidth(24)
layer.CreateField(field_name)
layer = None

But this does not (Error 6: CreateField() not supported by this layer). Anyone know why and know what I need to do to fix? Thanks.

def createLayer(fp,layer):
    driver = ogr.GetDriverByName("ESRI Shapefile")
    data_source = driver.CreateDataSource(fp)
    srs = osr.SpatialReference()
    srs.ImportFromEPSG(4326)
    return data_source.CreateLayer(layer, srs, ogr.wkbPoint)


layer = createLayer("C:\\LiDAR\\MyLayer.shp","MyLayer")

field_name = ogr.FieldDefn("Ben", ogr.OFTString)
field_name.SetWidth(24)
layer.CreateField(field_name)
layer = None

Best Answer

This seems to work for me:

def createLayer(fp,layer):
    driver = ogr.GetDriverByName("ESRI Shapefile")
    data_source = driver.CreateDataSource(fp)
    srs = osr.SpatialReference()
    srs.ImportFromEPSG(4326)
    return(data_source.CreateLayer(layer, srs, ogr.wkbPoint),data_source)

layer,ds=createLayer('MyLayer.shp','MyLayer')
field_name = ogr.FieldDefn('Ben', ogr.OFTString)
field_name.SetWidth(24)
layer.CreateField(field_name)

it appears the datasource should be passed back - otherwise it is likely deallocated after the function completes, upon which the layer depends. It works - but you might also consider renaming your function something other than 'createLayer' - i would be concerned it could cause confusion or worse, overloading.