Exemplo n.º 1
0
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
Exemplo n.º 2
0
    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)
    '''