When you start with a Python module, there are several solutions to find the available functions. One of them is `dir`: geom = feat.GetGeometryRef() print dir(geom) ['AddGeometry', 'AddGeometryDirectly', 'AddPoint', 'AddPoint_2D', 'Area', 'AssignSpatialReference', 'Boundary', 'Buffer', 'Centroid', 'Clone', 'CloseRings', 'Contains', 'ConvexHull', 'Crosses', 'Destroy', 'Difference', 'Disjoint', 'Distance', 'Empty', 'Equal', 'Equals', 'ExportToGML', 'ExportToJson', 'ExportToKML', 'ExportToWkb', 'ExportToWkt', 'FlattenTo2D', 'GetArea', 'GetBoundary', 'GetCoordinateDimension', 'GetDimension', 'GetEnvelope', 'GetEnvelope3D', 'GetGeometryCount', 'GetGeometryName', 'GetGeometryRef', 'GetGeometryType', 'GetPoint', 'GetPointCount', 'GetPoint_2D', 'GetPoints', 'GetSpatialReference', 'GetX', 'GetY', 'GetZ', 'Intersect', 'Intersection', 'Intersects', 'IsEmpty', 'IsRing', 'IsSimple', 'IsValid', 'Length', 'Overlaps', 'PointOnSurface', 'Segmentize', 'SetCoordinateDimension', 'SetPoint', 'SetPoint_2D', 'Simplify', 'SimplifyPreserveTopology', 'SymDifference', 'SymmetricDifference', 'Touches', 'Transform', 'TransformTo', 'Union', 'UnionCascaded', 'Within', 'WkbSize', '__class__', '__del__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattr__', '__getattribute__', '__hash__', '__init__', '__iter__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__swig_destroy__', '__swig_getmethods__', '__swig_setmethods__', '__weakref__', 'next', 'this'] and no `getNumInteriorRings`: apparently this method is not exposed in the python bindings. But if you look at [[gdal-dev] Polygon topology][1]: > In fact you have to use the Geometry.GetGeometryCount() that returns 1 (the exterior ring) + the number of interior rings. So polygon.GetGeometryCount() - 1 should return the number of interior rings So a polygon only: geom.GetGeometryCount() 1 For a polygon whith one hole: ![enter image description here][2] geom.GetGeometryCount() 2 # -> one hole and geom.GetGeometryRef(0) # -> exterior ring = LinearRing, in red geom.GetGeometryRef(1) # -> interior ring = LinearRing ![enter image description here][3] exterior = Geometry(ogr.wkbPolygon) exterior.AddGeometry(geom.GetGeometryRef(0)) ![enter image description here][4] interior = Geometry(ogr.wkbPolygon) exterior.AddGeometry(geom.GetGeometryRef(1)) ![enter image description here][5] But it is easier with [fiona][6] (also based on GDAL/OGR) import fiona layer = fiona.open("myshape.shp") feat = layer.next() print feat {'geometry': {'type': 'Polygon', 'coordinates': [[(1149490.1097279801, 691044.60910800309), (1191579.10975257, 691044.60910800309), (1191579.10975257, 648030.57611583965), (1149490.1097279801, 648030.57611583965), (1149490.1097279801, 691044.60910800309)], [(1154115.2745658469, 686419.44427013607), (1154115.2745658469, 653118.25743749342), (1165678.186660514, 653118.25743749342), (1165678.186660514, 686419.44427013607), (1154115.2745658469, 686419.44427013607)]]}, 'type': 'Feature', 'id': '0', 'properties': OrderedDict([(u'FID', 0.0)])} print feat['geometry']['type']) Polygon print len(feat['geometry']['coordinates'] 2 # outer ring print feat['geometry']['coordinates'][0] [(1149490.1097279801, 691044.60910800309), (1191579.10975257, 691044.60910800309), (1191579.10975257, 648030.57611583965), (1149490.1097279801, 648030.57611583965), (1149490.1097279801, 691044.60910800309)] # inner ring print feat['geometry']['coordinates'][7] [(1154115.2745658469, 686419.44427013607), (1154115.2745658469, 653118.25743749342), (1165678.186660514, 653118.25743749342), (1165678.186660514, 686419.44427013607), (1154115.2745658469, 686419.44427013607)] >>> [1]: http://osgeo-org.1560.x6.nabble.com/gdal-dev-Polygon-topology-td3745761.html [2]: https://i.sstatic.net/qm9h1.jpg [3]: https://i.sstatic.net/vg0xc.jpg [4]: https://i.sstatic.net/EfIIc.jpg [5]: https://i.sstatic.net/LAYWp.jpg [6]: http://toblerity.org/fiona/manual.html [7]: http://osgeo-org.1560.x6.nabble.com/gdal-dev-Polygon-topology-td3745761.html