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?
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
1 Answer 1
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.