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 __init__(self, mapdir): self.mapdir = mapdir self.blxsets = [] self.cfgfilename = None for cfgfilename in ('topo3d.ini', ): if self.mapdir.exists(cfgfilename): cfgfile = mapdir.open(cfgfilename) if cfgfile: self.cfgfilename = cfgfilename break if self.cfgfilename: cfg = ConfigParserUpper() cfg.readfp(IniFileFilter(cfgfile)) blxset = BLXSet() self.blxsets.append(blxset) blxset.setupFromIni(cfg, 'BLX0') else: self.blxsets = [BLXSet()]
def __init__(self, mapdirobj = None, gpsimage = True, maptype = MapTypeNormal, mapnumber=0, bigendian = False, inifile = None, hasmultiplemaps=True): self.gpsimage = gpsimage self.maptype = maptype self._mapnumber = mapnumber if mapdirobj == None: self.mapdir = mapdir.MapDirectory() else: if not isinstance(mapdirobj, mapdir.MapDirectory): raise ValueError("mapdirobj should be a MapDirectory object") self.mapdir = mapdirobj self.name = "Map" self.mode = None # Open mode ['r','w','a'] self.debug=False self.has_zip = True self.has_marine = (maptype == MapTypeStreetRoute) self._inifile = inifile self.inmemory = False ## If true all processing will be done in memory if maptype == MapTypeStreetRoute: self.routingcfg = routing.RoutingConfig() else: self.routingcfg = None ## Set endian self.bigendian = bigendian # Groups self._poigroup=None self.groups=[] self._searchgroups = [] ## Searchable group indices # Tables if maptype == MapTypeStreetRoute: self._ziptables = (0,1,0,0) else: self._ziptables = (0,0) self._marinetables = (0,1,0,1) ## Bounding box and bounding rect self._bboxrec = None self._boundrec = Rec((-198.316818, -99.475197), (198.316818, 99.475197)) ## Resolution and reference point self._scale = self.defaultscale self._refpoint = N.array([0.0, 0.0]) ## Config file self._cfg = ConfigParserUpper() self._initcfg() ## Layer and POI config self._laycfg = LayerConfig() self._poiconfig = POILayerConfig() ## Database self._db = None ## Other parameters otherparameters = ( ## Name, default value, description ('startscale', 4500.0, 'Start scale'), ('laycolor', 0, 'Unknown'), ('copyrightholders', ['Unknown'], 'Copyright holders'), ) ## Create properties for these parameters for param in otherparameters: setattr(self, '_' + param[0], param[1]) getfunc = lambda self, val: self.set_parameter('_'+param[0]) setfunc = lambda self, val: self.set_parameter('_'+param[0], val) setattr(self.__class__, param[0], property(getfunc, setfunc, doc=param[2])) ## Update config self._updatecfg() ## hasmultiplemaps is True if mapdir can have multiple maps with prefixes before their files self.hasmultiplemaps = hasmultiplemaps
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