3 import Image, ImageDraw
5 ####### first - rustic - linear positioning on a map
6 def circle (image, percentX, percentY, radiusX, radiusY, colorIn, colorOut):
8 imageX, imageY = image.size
9 centerX = int(imageX*percentX)
10 centerY = int(imageY*percentY)
11 x = max (0, min (centerX,imageX))
12 y = max (0, min (centerY,imageY))
19 draw = ImageDraw.Draw (image)
20 draw.chord((x1,y1,x2,y2), 0, 360, fill=colorIn, outline=colorOut )
25 longitude={'left':-11.,
28 def render_site (site, image, sx, sy, cIn, cOut):
29 if site['longitude'] is not None and site['latitude'] is not None:
30 px=float(longitude['left']-site['longitude'])/float(longitude['left']-longitude['right'])
31 py=float(latitude['top']-site['latitude'])/float(latitude['top']-latitude['bottom'])
32 if (px<0 or py<0 or px>1 or py>1):
35 circle(image,px,py,sx,sy,cIn,cOut)
38 path = '/var/www/html/sites/'
39 original = path + 'map.png'
40 live = path + 'livemap.png'
42 # map characteristics, in degrees.
43 # latitude : positive is north
44 # longitude : positive is east
46 # circle radius in pixels
48 # circle in and out colors
49 cInLocal , cOutLocal = '#566b8a','#bbbbbb'
51 # same for federating / foreign sites
52 sxForeign,syForeign=6,6
53 cInForeign , cOutForeign = '#acb3a4', '#444444'
55 image = Image.open(original)
57 for site in GetSites({'~peer_id':None,'enabled':True}):
58 render_site (site, image, sxForeign, syForeign, cInForeign , cOutForeign)
59 # local sites go last to be more visible
60 for site in GetSites({'peer_id':None,'enabled':True}):
61 render_site (site, image, sxLocal, syLocal, cInLocal , cOutLocal)
65 ########## second - way simpler - export sites as a list to javascript for rendering with googlemap
67 function Site (lat,lon,site_id,name,peer_id,peername,nb_nodes) {
73 this.peername=peername;
74 this.nb_nodes=nb_nodes;
78 def locate_peer (peers,peer_id):
80 if peer['peer_id']==peer_id:
82 return {'peername':'Cannot locate peer'}
84 def js_site (site,peers):
85 # some sites come with lat or lon being None
86 lat = site['latitude']
89 lon = site['longitude']
92 # build javascript text
94 jstext += str(lat) + "," + str(lon) + ","
95 jstext += str(site['site_id']) + ","
96 # needs html encoding for wierd chars
97 jstext += '"' + site['name'].encode("utf-8") + '"' + ','
98 if not site['peer_id']:
101 peer=locate_peer(peers,site['peer_id'])
102 jstext += str(site['peer_id']) + ',"' + peer['peername'].encode("utf-8") + '"' + ','
103 jstext += str(len(site['node_ids']))
107 def make_javascript():
108 outputname="/var/www/html/sites/plc-sites.js"
109 f=open(outputname,"w")
111 columns=['latitude','longitude','site_id','name','peer_id','node_ids']
112 f.write("allSites=new Array(\n")
113 # writes foreign sites first
114 foreign_sites=GetSites({'~peer_id':None},columns)
116 local_sites=GetSites({'peer_id':None},columns)
117 f.write(",".join([js_site(site,peers) for site in foreign_sites+local_sites]))
124 if __name__ == '__main__':