Vector Layers#

Opening a Vector File#

Open methods:

Mode

Description

0

Read only

1

Write

import ogr

driver = ogr.GetDriverByName('ESRI Shapefile')
fn = r'C:\data\sites.shp'
dataSource = driver.Open(fn, 0)
layer = dataSource.GetLayer()

Getting Info#

# Name
name = layer.GetName()

# Number of features
numFeatures = layer.GetFeatureCount()

# Extent: Xmin, Xmax, Ymin, Ymax
extent = layer.GetExtent()
print('UL:', extent[0], extent[3])
print('LR:', extent[1], extent[2])

# Spatial reference
sRef = layer.GetSpatialRef()
sRefText = sRef.ExportToWkt()
EPSG = sRef.GetAuthorityCode(None)

# Geometry type
type_num = layer.GetGeomType()
type_name = ogr.GeometryTypeToName(type_num)

Geometry types:

Type Number

Type Name

0

Unknown (any)

1

Point

2

Line String

3

Polygon

4

Multi Point

5

Multi Line String

6

Multi Polygon

Tables#

# Field info
layerDef = layer.GetLayerDefn()
for i in range(layerDef.GetFieldCount()):
    fieldDef = layerDef.GetFieldDefn(i)

    fieldName = fieldDef.GetName()
    fieldTypeCode = fieldDef.GetType()
    fieldType = fieldDef.GetFieldTypeName(fieldTypeCode)
    fieldWidth = fieldDef.GetWidth()
    fieldPrecision = fieldDef.GetPrecision()

# Field values
for i in range(layer.GetFeatureCount()):
    feature = layer.GetFeature(i)
    dict_feature = feature.items()
    value = feature.GetField("FIELD")

Geometry#

# Feature by FID
feature = layer.GetFeature(0)
geometry = feature.GetGeometryRef()

feat_numb = geometry.GetGeometryCount()
geotype = geometry.GetGeometryName()

# Point
x = geometry.GetX()
y = geometry.GetY()

# Polygon
area = geometry.GetArea()
centroid = geometry.Centroid().GetPoint()

ring = geometry.GetGeometryRef(0)
vertex_num = ring.GetPointCount()
for vertex in range(vertex_num):
    lat, lon, z = ring.GetPoint(vertex)

Filtering#

Attribute Filtering#

>>> layer.GetFeatureCount()
42
>>> layer.SetAttributeFilter("cover = 'shrubs'")
>>> layer.GetFeatureCount()
6
>>> layer.SetAttributeFilter(None)
>>> layer.GetFeatureCount()
42

Spatial Filtering#

# By extent
layer.SetSpatialFilterRect(Xmin, Ymin, Xmax, Ymax)

# By a polygon
polygon = poly.GetFeature(0)
polyGeom = polygon.GetGeometryRef()
layer.SetSpatialFilter(polyGeom)

Delete Objects#

feature.Destroy()
dataSource.Destroy()