e229ead9dd764a5dfcb8200b6aba5cfbbd810c94
[pyrungps.git] / render_tiles.py
1 #!/usr/bin/env python
2 # coding: UTF-8
3
4 import sqlite3
5 import math
6 from pprint import pprint
7
8 def queue_render(db,filename,forced_max_zoom=None):
9
10   conn = sqlite3.connect(db)
11   cur = conn.cursor()
12         
13   cur.execute("select minlat,minlon,maxlat,maxlon from tracks where filename=?" , (filename.decode('UTF-8'),))
14   minlat,minlon,maxlat,maxlon=cur.fetchone()
15   queue_tiles(db,minlat,minlon,maxlat,maxlon,forced_max_zoom)
16
17 def deg2num(lat_deg, lon_deg, zoom):
18   lat_rad = math.radians(lat_deg)
19   n = 2.0 ** zoom
20   xtile = int((lon_deg + 180.0) / 360.0 * n)
21   ytile = int((1.0 - math.log(math.tan(lat_rad) + (1 / math.cos(lat_rad))) / math.pi) / 2.0 * n)
22   return (xtile, ytile)
23             
24 def queue_tiles(db,minlat,minlon,maxlat,maxlon,forced_max_zoom=None):
25
26   conn = sqlite3.connect(db)
27   
28   # определяем примерный стартовый зум
29   
30   minzoom=8
31
32   if forced_max_zoom:
33     maxzoom=forced_max_zoom
34   else:
35     maxzoom=minzoom
36     while True:
37       minx,miny=deg2num(minlat,minlon,maxzoom)
38       maxx,maxy=deg2num(maxlat,maxlon,maxzoom)
39       print maxzoom,':',minx,'-',maxx,'/',miny,'-',maxy
40       if (maxx-minx>16) or (maxy-miny>12) or (maxzoom==16):
41         break
42       else:
43         maxzoom=maxzoom+1   
44   
45   ins = conn.cursor()
46   print minlat,maxlat,minlon,maxlon,minzoom,maxzoom
47   ins.execute('insert into render_queue(minlat,maxlat,minlon,maxlon,minzoom,maxzoom) values(?,?,?,?,?,?)',(minlat,maxlat,minlon,maxlon,minzoom,maxzoom))
48
49   conn.commit()        
50
51 def process_queue(db,map,force=False):
52
53   from os import system
54
55   conn = sqlite3.connect(db)
56   cur = conn.cursor()
57   cur.execute('select id,minlat,maxlat,minlon,maxlon,minzoom,maxzoom from render_queue')
58   list=cur.fetchall()
59
60   for rec in list:
61   
62     id,minlat,maxlat,minlon,maxlon,minzoom,maxzoom=rec
63
64     command = 'map='+map+ \
65       ' z='+str(minzoom)+'-'+str(maxzoom)+ \
66       ' lat='+str(minlat)+','+str(maxlat)+ \
67       ' lon='+str(minlon)+','+str(maxlon)
68
69     if force:
70       command = 'tirex-batch -n 0 '+command
71     else:
72       command = 'tirex-batch -n 0 '+command+' -f not-exists'  
73     
74     print command  
75       
76     if system(command)==0:
77       dcur=conn.cursor()
78       dcur.execute('delete from render_queue where id=?',(id,))
79       conn.commit()
80
81 def main():
82
83   from optparse import OptionParser
84   
85   parser = OptionParser()
86   parser.add_option("-d", "--data", dest="directory",
87     help="Data directory", metavar="DIR")
88   parser.add_option("-m", "--map", dest="map",
89     help="Map name", metavar="MAP")
90   parser.add_option("-z", "--zoom", dest="zoom",
91     help="Maximal zoom (forced), used with coordinates pairs (minlat minlon maxlat maxlon) or filename in arguments", metavar="MAP")
92   parser.add_option("-f", "--force", dest="force", 
93     help="Force tile regeneration (on/off), default off")
94   (options, args) = parser.parse_args()  
95
96   print options,args
97
98   db=options.directory+'/gpx.db'
99   map=options.map  
100   zoom=options.zoom
101   if not zoom:
102     zoom=12
103   force=(options.force=='on')
104
105   if len(args)==1:
106     filename,=args
107     print "Rendering file: "+filename+"\n"
108     queue_render(db,filename)
109   else:
110     minlat,minlon,maxlat,maxlon=args
111     print "Rendering region "+minlat+'..'+maxlat+' / '+minlon+'..'+maxlon+"\n"
112     queue_tiles(db,float(minlat),float(minlon),float(maxlat),float(maxlon),int(zoom))
113
114   if map:
115     print "Processing map "+map+"\n"
116     process_queue(db,map,force)
117   
118 if __name__ == "__main__":
119
120   main()          
121