GeometryAdapter.py 4.5 KB
# coding=utf-8
#author:        4N
#createtime:    2021/6/3
#email:         nheweijun@sina.com
from osgeo import ogr
from osgeo.ogr import Geometry

class GeometryAdapter:

    @classmethod
    def getType(cls,layer):
        origin = layer.GetGeomType()  # type:str
        if origin == 1 or origin == 4:
            return "point"
        elif origin == 2 or origin == 5:
            return "linestring"
        elif origin == 3 or origin == 6:
            return "polygon"
        return str(origin)

    @classmethod
    def change_geom_type(cls,raw):
        if raw==2 or raw ==3:
            return raw+3
        if raw==4:
            return 1
        if raw==-2147483647 or raw.__eq__(-2147483644):
            return 1
        if raw==-2147483646 or raw.__eq__(-2147483643):
            return 5
        if raw==-2147483645 or raw.__eq__(-2147483642):
            return 6
        return raw

    @classmethod
    def change_geom(cls,geo:Geometry,geom_type):
        '''
        转换空间对象的类型,以适应dmap只支持Multi类型
        :param geo:
        :param geom_type:
        :return: 转换后的空间对象
        '''


        # Point = 1,
        # LineString = 2,
        # Polygon = 3,
        # MultiPoint = 4,
        # MultiLineString = 5,
        # MultiPolygon = 6,
        # GeometryCollection = 7,
        # CircularString = 8,
        # CompoundCurve = 9,
        # CurvePolygon = 10,
        # MultiCurve = 11,
        # MultiSurface = 12,
        # PolyhedralSurface = 15,
        # LinearRing = 101,

        # MultiPointZ = -2147483644
        # MultiLineStringZ = -2147483643
        # MultiPolygonZ = -2147483642



        # PointZ = -2147483647
        # LINESTRINGZ=-2147483646
        # POLYGONZ=-2147483645

        if geom_type==5 or geom_type.__eq__(-2147483646) or geom_type.__eq__(-2147483643):
            return ogr.ForceToMultiLineString(geo)
        if geom_type==6 or geom_type.__eq__(-2147483645) or geom_type.__eq__(-2147483642):
            return ogr.ForceToMultiPolygon(geo)
        if geom_type==1:
            return geo.Centroid()
        return geo

    @classmethod
    def get_table_type(cls, raw):
        # Point = 1,
        # LineString = 2,
        # Polygon = 3,
        # MultiPoint = 4,
        # MultiLineString = 5,
        # MultiPolygon = 6,
        # GeometryCollection = 7,
        # CircularString = 8,
        # CompoundCurve = 9,
        # CurvePolygon = 10,
        # MultiCurve = 11,
        # MultiSurface = 12,
        # PolyhedralSurface = 15,
        # LinearRing = 101,

        # MultiPointZ = -2147483644
        # MultiLineStringZ = -2147483643
        # MultiPolygonZ = -2147483642

        # PointZ = -2147483647
        # LINESTRINGZ=-2147483646
        # POLYGONZ=-2147483645

        if raw == 4 or raw == 5 or raw == 6:
            return raw - 3
        elif raw == -2147483644 or raw == -2147483647:
            return 1
        elif raw == -2147483643 or raw == -2147483646:
            return 2
        elif raw == -2147483642 or raw == -2147483645:
            return 3
        return raw

    def move(self,geo: Geometry, offx, offy):

        g = geo.GetGeometryRef(0)
        num = g.GetPointCount()

        coor = []

        for j in range(num):
            point = g.GetPoint(j)
            x = point[0]
            y = point[1]
            x += offx
            y += offy
            coor.append([x, y])
        if num == 1:
            point = ogr.Geometry(ogr.wkbPoint)
            point.AddPoint(coor[0][0], coor[0][1])
            return point
        elif coor[0].__eq__(coor[-1]):
            ring = ogr.Geometry(ogr.wkbLinearRing)
            for co in coor:
                ring.AddPoint(co[0], co[1])
            poly = ogr.Geometry(ogr.wkbPolygon)
            poly.AddGeometry(ring)
            return poly
        else:
            line = ogr.Geometry(ogr.wkbLineString)
            for co in coor:
                line.AddPoint(co[0], co[1])
            return line

    @classmethod
    def envelop_2_polygon(cls,env):
        ring = ogr.Geometry(ogr.wkbLinearRing)
        ring.AddPoint(env[0], env[2])
        ring.AddPoint(env[0], env[3])
        ring.AddPoint(env[1], env[3])
        ring.AddPoint(env[1], env[2])
        ring.AddPoint(env[0], env[2])
        # Create polygon
        poly = ogr.Geometry(ogr.wkbPolygon)
        poly.AddGeometry(ring)
        return poly