Layer definition¶
A layer definition describes the layer structure, which includes a list of field definitions.
We describe below how to get a layer definition instance osgeo.ogr.FeatureDefn
and use it.
Nevertheless, we recommend to avoid using it to work with layer properties. Instead, use the
methods provided in girs, in order to avoid possible program crashes.
Note
Avoid using an OGR-layer definition instance directily as shown below. Instead, use the corresponding girs methods described in Attribute Fields to retrieve field properties from layers.
Get an instance of osgeo.ogr.FeatureDefn¶
Each layer has a layer definition. Therefore, a layer number must be specified in order to retrieve the corresponding layer definition. The default layer number is zero.
from girs.feat.layers import LayersReader
lrs = LayersReader('D:/tmp/girs/DEU_adm_shp/DEU_adm4.shp')
print lrs.get_layer_definition()
print lrs.get_layer_definition(layer_number=0)
Using osgeo.ogr.FeatureDefn methods¶
osgeo.ogr.FeatureDefn methods
The methods available in osgeo.ogr.FeatureDefn
can be found in
http://gdal.org/python/osgeo.ogr.FeatureDefn-class.html. Here a list of available methods,
excluding the private (internal) methods starting with “__” (double underline):
from girs.feat.layers import LayersReader
lrs = LayersReader('D:/tmp/girs/DEU_adm_shp/DEU_adm4.shp')
for m in dir(lrs.get_layer_definition()):
if not m.startswith('__'):
print m
Output:
AddFieldDefn
AddGeomFieldDefn
DeleteGeomFieldDefn
Destroy
GetFieldCount
GetFieldDefn
GetFieldIndex
GetGeomFieldCount
GetGeomFieldDefn
GetGeomFieldIndex
GetGeomType
GetName
GetReferenceCount
IsGeometryIgnored
IsSame
IsStyleIgnored
SetGeomType
SetGeometryIgnored
SetStyleIgnored
this
thisown
Using osgeo.ogr.FeatureDefn methods
GetFieldCount
will be used to demonstrate how to use any of the osgeo.ogr.FeatureDefn
methods above:
from osgeo import ogr
filename = 'D:/tmp/girs/DEU_adm_shp/DEU_adm4.shp'
dataset = ogr.Open(filename, 0) # open read-only
if dataset is None:
raise ValueError('Could not open {}'.format(filename))
lyr = dataset.GetLayer(0) # osgeo.ogr.Layer instance
ldf = lyr.GetLayerDefn() # osgeo.ogr.FeatureDefn instance
print ldf.GetFieldCount()
Like in the case of using a layer instance directly (osgeo.ogr.Layer
), also an instance of
layer definition (osgeo.ogr.FeatureDefn
) cause the program to crash if not used carefully:
from girs.feat.layers import LayersReader
# This works
print LayersReader('D:/tmp/girs/DEU_adm_shp/DEU_adm4.shp').get_field_count()
# This works: the instance LayersReader(filename) is dellocated just after calling
# get_layer_definition()
print LayersReader('D:/tmp/girs/DEU_adm_shp/DEU_adm4.shp').get_layer_definition()
# This crashes: once LayersReader(filename) is deallocated, the return value of
# get_layer_definition() is a dangling pointer
print LayersReader('D:/tmp/girs/DEU_adm_shp/DEU_adm4.shp').get_layer_definition().GetFieldCount()
Using girs
from girs.feat.layers import LayersReader
lrs = LayersReader('D:/tmp/girs/DEU_adm_shp/DEU_adm4.shp')
print lrs.get_field_count() # using layer number = 0
The girs block above has less code lines and is probably easier to understand. In fact, girs just encapsulates the ogr procedures as shown in the upper block and guarantees that neither dataset, nor lyr, nor ldf go out of scope, causing the program to crash. These methods are described in Attribute Fields.