示例#1
0
class BackImporter:
    def __init__ (self, model, grid):
        self.__model = model
        self.__grid = grid
        self.__cutter = ClipHelper(grid)
        self.__preprocessor = Preprocessor()

    def process (self, filename, minlevel, maxlevel):
        self.__minlevel = minlevel
        self.__maxlevel = maxlevel
        cursize = 0
        progress = Progress(filename, 0, os.stat(filename)[6])
        for ln in open(filename):
            if ln.startswith('AF'):
                self.processAF(ln)
            elif ln.startswith('LF'):
                self.processLF(ln)
            elif ln.startswith('LM'):
                self.processLM(ln)
            elif ln.startswith('PF'):
                self.processPF(ln)
            cursize += len(ln)
            progress.update(cursize)

    def processAF(self, af):
        #if len(af) > 64*1024:
        #    return
        grp = af.split(';')
        transtype = transform_af(grp)
        if transtype:
            themecode, featcode = transtype
            priority    = int(grp[3])
            name = self.__preprocessor.nominalizeName(grp[6])
            polylist = []
            for poly in grp[2].split('|'):
                points = poly.split(',')
                poly = [(int(points[i]), int(points[i+1])) for i in range(0, len(points), 2)]
                #  
                polyList = [poly]
                for level in range(self.__maxlevel-1, self.__minlevel-1, -1):
                    newPolyList = []
                    for poly in polyList:
                        for mesh, clipPoly in self.__cutter.clipPolygon(poly, level):
                            area = XBackArea()
                            area.priority = priority
                            area.themecode = themecode
                            area.featcode = featcode
                            area.name = name
                            area.polylist = [clipPoly]
                            # save
                            model = self.__model[level]
                            parcel = model.get(mesh)
                            if not parcel:
                                parcel = XParcel()
                            parcel.back_area_list.append(area)
                            model.put(mesh, parcel)
                            newPolyList.append(clipPoly)
                    polyList = newPolyList
                themecode = 0
                featcode = 0
                
    def processLF (self, lf):
        grp = lf.split(';')
        transtype = transform_lf(grp)
        if transtype:
            themecode, featcode = transtype
            priority = int(grp[3])
            name = self.__preprocessor.nominalizeName(grp[6])
            points = grp[2].split(',')
            poly = [(int(points[i]), int(points[i+1])) for i in range(0, len(points), 2)]
            for level in range(self.__minlevel, self.__maxlevel):
                for meshcode, segment in self.__cutter.clipPolyline(poly, level):
                    edge = XBackEdge()
                    edge.themecode = themecode
                    edge.featcode = featcode
                    edge.polyline = segment
                    edge.name = name
                    model = self.__model[level]
                    parcel = model.get(meshcode)
                    if not parcel:
                        parcel = XParcel()
                    parcel.back_edge_list.append(edge)
                    model.put(meshcode, parcel)
            
    def processLM (self, lm):
        grp = lm.split(';')
        transtype = transform_lm(grp)
        if transtype:
            point = tuple([int(x) for x in grp[2].split(',')])
            name = self.__preprocessor.nominalizeName(grp[3])
            for level in range(self.__minlevel, self.__maxlevel):
                meshcode = self.__grid.getPointMesh(point, level)
                node = XBackNode()
                node.themecode = transtype[0]
                node.featcode = transtype[1]
                node.point = point
                node.name = name
                model = self.__model[level]
                parcel = model.get(meshcode)
                if not parcel:
                    parcel = XParcel()
                parcel.back_node_list.append(node)
                model.put(meshcode, parcel)


    def processPF (self, pf):
        grp = pf.split(';')
        transtype = transform_pf(grp)
        if transtype:
            themecode, featcode = transtype
            point = tuple([int(x) for x in grp[2].split(',')])
            name = self.__preprocessor.nominalizeName(grp[6])
            for level in range(self.__minlevel, self.__maxlevel):
                meshcode = self.__grid.getPointMesh(point, level)
                node = XBackNode()
                node.themecode = themecode
                node.featcode = featcode
                node.point = point
                node.name = name
                model = self.__model[level]
                parcel = model.get(meshcode)
                if not parcel:
                    parcel = XParcel()
                parcel.back_node_list.append(node)
                model.put(meshcode, parcel)