class Geometry: def __init__(self): """The constructoris just an empty container.""" def GeomFromFeature(self, feature): self.ogrGeom = feature.GetGeometryRef() self.OgrGeomToShapely() def SetShapelyGeom(self, geom): self.shapelyGeom = geom self.ShapelyToOgrGeom() def LoadWKTGeom(self, geom): import shapely.wkt self.shapelyGeom = shapely.wkt.loads(geom) self.ShapelyToOgrGeom() def BoundsToPoly(self): from shapely.geometry import Polygon minx, miny, maxx, maxy = self.shapelyGeom.bounds ptLT = ((minx, maxy), (maxx, maxy), (maxx, miny), (minx, miny), (minx, maxy)) return Polygon(ptLT) def PointsToMultiPointGeom(self, ptL): from shapely.geometry import Point, MultiPoint ptgeomL = [] for pt in ptL: ptgeomL.append(Point(pt)) self.shapelyGeom = MultiPoint(ptgeomL) self.ShapelyToOgrGeom() def PointsToPolygonGeom(self, ptL): from shapely.geometry import Polygon #ptgeomL = [] #for pt in ptL: # ptgeomL.append(Point(pt)) self.shapelyGeom = Polygon(ptL) #self.shapelyGeom = Polygon(ptgeomL) self.ShapelyToOgrGeom() def CascadeUnion(self, shapelyGeomL): from shapely.ops import cascaded_union self.SetShapelyGeom(cascaded_union(shapelyGeomL)) #return cascaded_union(shapelyGeomL) def MultPolyToSinglePoly(self, multipoly): from shapely.ops import cascaded_union from shapely.geometry import Polygon ''' self.shapelyGeom = cascaded_union([ Polygon(component.exterior) for component in multipoly ]) ''' polyL = [item for item in multipoly] self.shapelyGeom = polyL[0] for item in polyL: self.shapelyGeom.union(item) self.ShapelyToOgrGeom() def OgrGeomToShapely(self): from shapely.wkb import loads self.shapelyGeom = loads(self.ogrGeom.ExportToWkb()) def ShapelyToOgrGeom(self): self.ogrGeom = ogr.CreateGeometryFromWkb(self.shapelyGeom.wkb) def ShapelyBuffer(self, buff): if not self.shapelyGeom.is_valid: print(' mending invalid geometry by buffer = 0') self.shapelyGeom = self.shapelyGeom.buffer(0) if not self.shapelyGeom.is_valid: exitstr = 'Can not fix invalid geometry in ShapelyBuffer' sys.exit(exitstr) def ShapelyPolysToMultiPoly(self, multiPolyL): from shapely.geometry.multipolygon import MultiPolygon self.shapelyGeom = MultiPolygon(multiPolyL) def ShapelyIntersection(self, otherGeom): return self.shapelyGeom.intersection(otherGeom.shapelyGeom) def MultiPolyGeomFromGeomL(self, geomL): singlegeomL = [] for testgeom in geomL: if testgeom.geom_type == 'MultiPolygon': for polygeom in [polygeom for polygeom in testgeom]: if len(list(polygeom.exterior.coords)) > 2: singlegeomL.append(polygeom) else: if len(list(testgeom.exterior.coords)) > 2: singlegeomL.append(testgeom) self.ShapelyPolysToMultiPoly(self, singlegeomL) def SplitPolygonsToSingleGeomL(self): singlegeomL = [] if self.shapelyGeom.geom_type == 'MultiPolygon': for polygeom in [polygeom for polygeom in self.shapelyGeom]: if len(list(polygeom.exterior.coords)) > 2: singlegeomL.append(polygeom) else: if len(list(self.shapelyGeom.exterior.coords)) > 2: singlegeomL.append(self.shapelyGeom) return singlegeomL def ShapelyRemoveSlivers(self): eps = 0.000001 from shapely.geometry import JOIN_STYLE self.ShapelyBuffer(0) #remove slivers self.shapelyGeom = self.shapelyGeom.buffer( eps, 1, join_style=JOIN_STYLE.mitre).buffer(-eps, 1, join_style=JOIN_STYLE.mitre) def ShapelyContainCut(self, cut): if cut.shapelyGeom.contains(self.shapelyGeom): pass #geom remains intact elif cut.shapelyGeom.intersects(self.shapelyGeom): self.shapelyGeom = cut.shapelyGeom.intersection(self.shapelyGeom) else: self.shapelyGeom = False def ShapelyOutsideCut(self, cut): if cut.shapelyGeom.contains(self.shapelyGeom): self.shapelyGeom = False elif cut.shapelyGeom.intersects(self.shapelyGeom): self.shapelyGeom = self.shapelyGeom.difference(cut.shapelyGeom) else: pass #geom remains intact def ShapelyWithin(self, cut): if self.shapelyGeom.within(cut.shapelyGeom): return True else: return False def GeoTransform(self, srcProj, tarProj): self.geoTransform = osr.CoordinateTransformation( srcProj.proj_cs, tarProj.proj_cs) res = self.ogrGeom.Transform(self.geoTransform) if res != 0: sys.exit('Geotransformation failed') #set shapley to reproejcted self.OgrGeomToShapely() def GeoTransformCoordsFIX(self, srcProj, tarProj, ptL): #Special version that allows geotransformation outised lat lon boundaries (i.e. for SIN outised erait sphere transform = osr.CoordinateTransformation(srcProj.proj_cs, tarProj.proj_cs) xyL = [] for pt in ptL: xyL.append(transform.TransformPoint(pt[0], pt[1])) return xyL
print(f, t, "valid?", shapes[f].is_valid) ploys = {} for f in shapes.keys(): print("doing", f) ploys[f] = make_valid(shapes[f]) if ploys[f] is not MultiPolygon: print(ploys[f].__repr__(), "is not multipolygon") if isinstance(ploys[f], GeometryCollection): print("is GeometryCollection") tmp = MultiPolygon() for shape in ploys[f]: if isinstance(shape, MultiPolygon) or isinstance( shape, Polygon): tmp = tmp.union(shape) ploys[f] = tmp ''' if shapes[f].is_valid: print(0) ploys[f]=shapes[f] continue else: i=0 while i<1000: if shapes[f].simplify(i).is_valid: break i=i+1 print(i) ploys[f]=shapes[f].simplify(i) '''