def buildTiles(self, items, attributes): """ Build tiles of given items :param items: list of items to build :param attributes: attributes for layout """ matrix = {} def addItem(tx, ty, px, py, **itemparams): if '{}|{}'.format(tx, ty) not in matrix: matrix['{}|{}'.format(tx, ty)] = [] matrix['{}|{}'.format(tx, ty)].append([px, py, itemparams]) params = {} for zoom in self.ZOOMLEVELS: if not os.path.exists('{}/{}'.format(self.DESTPATH, zoom)): # create directory os.makedirs('{}/{}'.format(self.DESTPATH, zoom)) for item in items: _last = None for node in item.parameters['nodes']: coord = deg2num(float(node['lat']), float(node['lon']), zoom) if _last is not None: if _last[0] <= coord[0]: # eval tiles in x direction dx = range(_last[0], coord[0] + 1) else: dx = range(_last[0], coord[0] - 1, -1) if _last[1] <= coord[1]: # eval tiles in y direction dy = range(_last[1], coord[1] + 1) else: dy = range(_last[1], coord[1] - 1, -1) for x in dx: # loop through tiles for y in dy: lstart = (_last[2] + (_last[0] - x) * 256, _last[3] + (_last[1] - y) * 256) # start point lend = (coord[2] + (coord[0] - x) * 256, coord[3] + (coord[1] - y) * 256) # end point if os.path.exists('{}/{}/{}-{}.png'.format(self.DESTPATH, zoom, x, y)): img = Image.open('{}/{}/{}-{}.png'.format(self.DESTPATH, zoom, x, y)) else: img = Image.new('RGBA', (256, 256)) draw = ImageDraw.Draw(img) draw.line([lstart, lend], fill=self.LINECOLOR, width=(zoom - 15) * 2) # draw line img.save('{}/{}/{}-{}.png'.format(self.DESTPATH, zoom, x, y)) _last = coord
def buildTiles(self, items, attributes): """ Build tiles for given configuration :param items: list of items to build :param attributes: parameters """ font = ImageFont.truetype("emonitor/modules/mapitems/inc/font.ttf", 12) for zoom in self.ZOOMLEVELS: matrix = {} if not os.path.exists('{}/{}'.format(self.DESTPATH, zoom)): os.makedirs('{}/{}'.format(self.DESTPATH, zoom)) for item in items: coord = deg2num(float(item.parameters['lat']), float(item.parameters['lon']), zoom) def addItem(tx, ty, px, py, **itemparams): if '{}|{}'.format(tx, ty) not in matrix: matrix['{}|{}'.format(tx, ty)] = [] matrix['{}|{}'.format(tx, ty)].append([px, py, itemparams]) params = {} for param in [a for a in attributes if a in item.parameters]: params[param] = item.parameters[param] addItem(coord[0], coord[1], coord[2], coord[3], params=params) # q5 if coord[2] + self.HALFX > 256: addItem(coord[0] + 1, coord[1], coord[2] - 256, coord[3], params=params) # q6 if coord[2] - self.HALFX < 0: addItem(coord[0] - 1, coord[1], coord[2] + 256, coord[3], params=params) # q4 if coord[3] + self.HALFY > 256: addItem(coord[0], coord[1] + 1, coord[2], coord[3] - 256, params=params) # q8 if coord[3] - self.HALFY < 0: addItem(coord[0], coord[1] - 1, coord[2], coord[3] + 256, params=params) # q2 if coord[2] + self.HALFX > 256 and coord[3] + self.HALFY > 256: addItem(coord[0] + 1, coord[1] + 1, coord[2] - 256, coord[3] - 256, params=params) # q9 elif coord[2] - self.HALFX < 0 and coord[3] - self.HALFY < 0: addItem(coord[0] - 1, coord[1] - 1, coord[2] + 256, coord[3] + 256, params=params) # q1 for tile in matrix: img = Image.new('RGBA', (256, 256)) draw = ImageDraw.Draw(img) if zoom == 18: """ icon=ellipse;20;20 # objecttype, x dimension, y dimension color=255;0;0 textattribute=fire_hydrant:diameter """ for p in matrix[tile]: draw.ellipse((p[0] - 10, p[1] - 10, p[0] + 10, p[1] + 10), outline=(255, 0, 0)) if 'fire_hydrant:diameter' in p[2]['params']: draw.text((p[0] - self.HALFX, p[1] + self.HALFY), "{}".format(p[2]['params']['fire_hydrant:diameter']), (255, 0, 0), font=font) if zoom == 17: """ icon=ellipse;10;10 # objecttype, x dimension, y dimension color=255;0;0 # rgb color value """ for p in matrix[tile]: draw.ellipse((p[0] - 5, p[1] - 5, p[0] + 5, p[1] + 5), fill=(255, 0, 0)) if zoom == 16: """ icon=ellipse;4;4 # objecttype, x dimension, y dimension color=255;0;0 # rgb color value """ for p in matrix[tile]: draw.ellipse((p[0] - 2, p[1] - 2, p[0] + 2, p[1] + 2), fill=(255, 0, 0)) img.save('{}/{}/{}-{}.png'.format(self.DESTPATH, zoom, tile.split('|')[0], tile.split('|')[1]))
def buildTiles(self, items, attributes): """ Build tiles of given items :param items: list of items to build :param attributes: attributes for layout """ matrix = {} def addItem(tx, ty, px, py, **itemparams): if '{}|{}'.format(tx, ty) not in matrix: matrix['{}|{}'.format(tx, ty)] = [] matrix['{}|{}'.format(tx, ty)].append([px, py, itemparams]) params = {} for zoom in self.ZOOMLEVELS: if not os.path.exists('{}/{}'.format(self.DESTPATH, zoom)): # create directory os.makedirs('{}/{}'.format(self.DESTPATH, zoom)) for item in items: _last = None for node in item.parameters['nodes']: coord = deg2num(float(node['lat']), float(node['lon']), zoom) if _last is not None: if _last[0] <= coord[0]: # eval tiles in x direction dx = range(_last[0], coord[0] + 1) else: dx = range(_last[0], coord[0] - 1, -1) if _last[1] <= coord[1]: # eval tiles in y direction dy = range(_last[1], coord[1] + 1) else: dy = range(_last[1], coord[1] - 1, -1) for x in dx: # loop through tiles for y in dy: lstart = (_last[2] + (_last[0] - x) * 256, _last[3] + (_last[1] - y) * 256 ) # start point lend = (coord[2] + (coord[0] - x) * 256, coord[3] + (coord[1] - y) * 256 ) # end point if os.path.exists('{}/{}/{}-{}.png'.format( self.DESTPATH, zoom, x, y)): img = Image.open('{}/{}/{}-{}.png'.format( self.DESTPATH, zoom, x, y)) else: img = Image.new('RGBA', (256, 256)) draw = ImageDraw.Draw(img) draw.line([lstart, lend], fill=self.LINECOLOR, width=(zoom - 15) * 2) # draw line img.save('{}/{}/{}-{}.png'.format( self.DESTPATH, zoom, x, y)) _last = coord