def addPOIGroupAndLayer(self): if self.mode == 'r': raise ValueError("Can't add POI layer in read-only mode") if self._poigroup == None: # Create POI config file self.poicfg = ConfigParserUpper() self._cfg.set("POI","POI_CONFIG", self.mapnumstr + "poi.cfg") # Create POI group poigroup = POIGroup(self) poigroup.open('w') self._poigroup = poigroup # Create POI Layer layer=Layer(self, "poi", "poi", layertype=LayerTypePOI, fileidentifier=0xc0f0) layer.open('w') self._poiconfig.addLayer(layer, layerstyle=POILayerStyle())
def open(self, mode='r'): if self.mode != None: return None self.mode = mode if mode == 'w': if self.gpsimage: if self._inifile == None: self._inifile = self.mapnumstr + 'map.ini' ## Create database self._db = Database(self.mapdir, 'db' + self.mapnumstr, mode, self.bigendian) ## Create zip table if self.has_zip: buildziprecord(self._db, zipfilename = self.mapnumstr + 'z.dat', auxfilename = self.mapnumstr + 'cn.dat', extended = self.maptype == MapTypeStreetRoute) ## Create marine table if self.has_marine: buildmarinerecord(self._db, filenameprefix = self.mapnumstr) ## Create basic groups if self.maptype == MapTypeStreetRoute: roads = GroupStreet(self, name=self.mapnumstr + "_Roads") else: roads = GroupNormal(self, name=self.mapnumstr + "_Roads") roads.searchable = True self.addGroup(roads) self.addGroup(GroupNormal(self, name=self.mapnumstr + "_Railroads")) self.addGroup(GroupNormal(self, name=self.mapnumstr + "_Hydrography")) self.addGroup(GroupNormal(self, name=self.mapnumstr + "_Parks")) else: if self._inifile == None: self._inifile = 'map.ini' elif mode in ('r','a'): ## Find ini file if self._inifile == None: filelist = self.mapdir.listdir() possibleinifiles = ('map.ini', self.mapnumstr + 'map.ini', 'lay_info.ini') found = False for filename in possibleinifiles: if filename in filelist: self._inifile = filename found = True break if not found: raise ValueError('Could not find ini-file') self._cfg.readfp(IniFileFilter(self.mapdir.open(self._inifile))) # Get map type if self._cfg.has_option('MAP_INFO', 'MAPTYPE'): self.maptype = self._cfg.get("MAP_INFO", "MAPTYPE") # Get bounding box if self._cfg.has_option('MAP_INFO', 'BND_BOX'): bbox = map(float, self._cfg.get("MAP_INFO", "BND_BOX").split(" ")) self._bboxrec = Rec([bbox[0],bbox[2]], [bbox[1], bbox[3]]) # Get map name self.name = self._cfg.get('MAP_INFO', 'MAP_NAME') # self.date = self._cfg.get('MAP_INFO', 'MAP_DATE') self._laycfg.setupfromcfg(self._cfg, self) # Find database path dbname = self._cfg.get("LAYERS","DB_NAME") dbname = re.sub('\\\\', os.sep, dbname) # Since Windows is case insensitive, try to match the path case insensitive plist=dbname.split(os.sep) for i in range(0,len(plist)-2): path=os.sep.join(plist[0:i+1]) if len(path)>0: hits=[d for d in self.mapdir.listdir(path) if d.lower() == plist[i+1].lower()] if len(hits)==0: raise ValueError("Couldnt find database") plist[i+1]=hits[0] dbname = os.sep.join(plist) if dbname: self._db = Database(self.mapdir, dbname, self.mode, self.bigendian) # Read groups if self.debug: print "Groups:" for i in range(0,self._cfg.getint("GROUPS","NUMBER")): thegroup = groupFactory(self, i, self._cfg, self._db) self.groups.append(thegroup) thegroup.initFromIni(self._cfg) # Read POI file and POI layers if self._cfg.has_section("POI"): poi_ini = self._cfg.get("POI","POI_CONFIG") self.poicfg = ConfigParserUpper() if self.mapdir.isfile(poi_ini): self.poicfg.readfp(IniFileFilter(self.mapdir.open(poi_ini))) if self.poicfg.has_section("LAYERS"): self._poigroup = POIGroup(self) self._poiconfig.setupfromcfg(self.poicfg, self) # Read routing info if self.maptype == MapTypeStreetRoute: self.routingcfg = routing.RoutingConfig() self.routingcfg.setupfromcfg(self._cfg, self) # Read unpack tables if self._cfg.has_section('PACK_LAYS'): i = 0 while self._cfg.has_option('PACK_LAYS', str(i)): fields = self._cfg.get('PACK_LAYS', str(i)).split(' ') filename = fields[0] n = int(fields[1]) layernumbers = map(int, fields[2:]) assert len(layernumbers) == n for layernumber in layernumbers: self.getLayerByIndex(layernumber).setUnpackTable(filename) i += 1