class CustomMapLayer(Layer): def __init__(self, renderer, cache_dir): super(CustomMapLayer, self).__init__(renderer) self.cache_dir = cache_dir self.mercator = GlobalMercator() self.tileloader = None if self.tiles is not None: map_envelope = self.m.envelope() # map_envelope is in mercator projection, convert it to # long/lat projection envelope = renderer.merc_to_lnglat(map_envelope) min_lon = envelope.minx min_lat = envelope.miny max_lon = envelope.maxx max_lat = envelope.maxy width = self.m.width indexing = self.tiles.get('indexing') max_zoom = self.tiles.get('maxZoom') if indexing == 'google': self.tileloader = GoogleTileLoader(min_lat, min_lon, max_lat, max_lon, width, max_zoom) elif indexing == 'tms': self.tileloader = TMSTileLoader(min_lat, min_lon, max_lat, max_lon, width, max_zoom) elif indexing == 'f': self.tileloader = FTileLoader(min_lat, min_lon, max_lat, max_lon, width, max_zoom) def draw(self): # clip drawing area, so everything out will be clipped zoom = self.style.get('zoom') self.ctx.save() self.ctx.scale(zoom, zoom) self.ctx.rectangle(0, 0, self.m.width, self.m.height) self.ctx.clip() if self.tileloader is not None: for tile in self._get_tiles(): tile.draw() self.ctx.restore() def _get_tiles(self): tiles = list() url = self.tiles.get('url') http_headers = self.tiles.get('http_headers') tile_files = self.tileloader.download(self.cache_dir, url, http_headers) if tile_files is None: sys.stderr.write( "Error when downloading map tiles. Please try again later.\n") sys.exit(1) for filename in tile_files: tile = TileLayer(self.renderer, filename, self.mercator) tiles.append(tile) return tiles
class CustomMapLayer(Layer): def __init__(self, renderer, cache_dir): super(CustomMapLayer, self).__init__(renderer) self.cache_dir = cache_dir self.mercator = GlobalMercator() self.tileloader = None if self.tiles is not None: map_envelope = self.m.envelope() # map_envelope is in mercator projection, convert it to # long/lat projection envelope = renderer.merc_to_lnglat(map_envelope) min_lon = envelope.minx min_lat = envelope.miny max_lon = envelope.maxx max_lat = envelope.maxy width = self.m.width indexing = self.tiles.get('indexing') max_zoom = self.tiles.get('maxZoom') if indexing == 'google': self.tileloader = GoogleTileLoader( min_lat, min_lon, max_lat, max_lon, width, max_zoom) elif indexing == 'tms': self.tileloader = TMSTileLoader( min_lat, min_lon, max_lat, max_lon, width, max_zoom) elif indexing == 'f': self.tileloader = FTileLoader( min_lat, min_lon, max_lat, max_lon, width, max_zoom) def draw(self): # clip drawing area, so everything out will be clipped zoom = self.style.get('zoom') self.ctx.save() self.ctx.scale(zoom, zoom) self.ctx.rectangle(0, 0, self.m.width, self.m.height) self.ctx.clip() if self.tileloader is not None: for tile in self._get_tiles(): tile.draw() self.ctx.restore() def _get_tiles(self): tiles = list() url = self.tiles.get('url') http_headers = self.tiles.get('http_headers') tile_files = self.tileloader.download(self.cache_dir, url, http_headers) if tile_files is None: sys.stderr.write("Error when downloading map tiles. Please try again later.\n") sys.exit(1) for filename in tile_files: tile = TileLayer(self.renderer, filename, self.mercator) tiles.append(tile) return tiles