Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import arcpy
- import os
- arcpy.env.overwriteOutput = True
- def iter_geom(g):
- for i in xrange(g.partCount):
- yield i, g.getPart(i)
- def fill_donut_holes(polys, output, fill_threshold=0):
- # fields
- fields = [f.name for f in arcpy.ListFields(polys)
- if f.type not in ('OID', 'Geometry')
- and 'shape' not in f.name.lower()]
- # loop thru geometry
- geom = {}
- with arcpy.da.SearchCursor(polys, ['SHAPE@'] + fields) as rows:
- if fill_threshold:
- for row in rows:
- print row[0].partCount
- if row[0].partCount > 1:
- array = arcpy.Array()
- for i, p in iter_geom(row[0]):
- pg = arcpy.Polygon(p).area
- print pg
- if pg >= fill_threshold:
- array.add(p)
- geom[arcpy.Polygon(array)] = row[1:]
- else:
- geom[row[0]] = row[1:]
- else:
- for row in rows:
- array = arcpy.Array()
- for i, part in iter_geom(row[0]):
- for pt in iter(lambda: part.next(), None):
- array.add(pt)
- geom[arcpy.Polygon(array)] = row[1:]
- # create output
- path, name = os.path.split(output)
- sm = 'SAME_AS_TEMPLATE'
- arcpy.CreateFeatureclass_management(path, name, 'POLYGON', polys,
- sm, sm, polys)
- # insert rows
- with arcpy.da.InsertCursor(output, ['SHAPE@'] + fields) as irows:
- for geometry, attributes in geom.iteritems():
- irows.insertRow((geometry,) + attributes)
- arcpy.AddMessage('Created "{0}"'.format(output))
- return output
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement