5dae0290ce5f4e32f1e27223c01e9ecb63d49a0d
[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 queue_tiles(db,minlat,minlon,maxlat,maxlon,forced_max_zoom=None):
18
19   conn = sqlite3.connect(db)
20   
21   # определяем примерный стартовый зум
22   
23   minlatrad = math.radians(minlat)
24   maxlatrad = math.radians(maxlat)
25   
26   minx = (minlon + 180.0)/360.0
27   maxx = (maxlon + 180.0)/360.0
28   
29   miny = (1.0 - math.log(math.tan(minlatrad) + (1 / math.cos(minlatrad))) / math.pi) / 2.0
30   maxy = (1.0 - math.log(math.tan(maxlatrad) + (1 / math.cos(maxlatrad))) / math.pi) / 2.0
31
32   if minx>maxx:
33     minx,maxx = maxx,minx
34     
35   if miny>maxy:
36     miny,maxy = maxy,miny
37   
38   minzoom=8
39   if forced_max_zoom:
40     maxzoom=forced_max_zoom
41   else:
42     maxzoom=16  
43   
44   for zoom in range(minzoom,maxzoom+1):
45     
46     n = 2 ** zoom
47     
48     minxt = int(minx * n)
49     minyt = int(miny * n)
50     maxxt = int(maxx * n)
51     maxyt = int(maxy * n)
52     
53     ins = conn.cursor()
54     print zoom,minxt,maxxt,minyt,maxyt
55     ins.execute('insert into render_queue(zoom,minx,maxx,miny,maxy) values(?,?,?,?,?)',(zoom,minxt,maxxt,minyt,maxyt))
56
57     if forced_max_zoom is None:
58       if (maxxt-minxt>32) or (maxyt-minyt>24):
59         print "Breaking..."
60         conn.commit()
61         break
62
63   conn.commit()        
64
65 def process_queue(db,map,force=False):
66
67   from os import system
68
69   conn = sqlite3.connect(db)
70   cur = conn.cursor()
71   cur.execute('select id,zoom,minx,maxx,miny,maxy from render_queue')
72   list=cur.fetchall()
73
74   for rec in list:
75   
76     id,zoom,minx,maxx,miny,maxy=rec
77
78     command = 'map='+map+ \
79       ' z='+str(zoom)+ \
80       ' x='+str(minx)+'-'+str(maxx)+ \
81       ' y='+str(miny)+'-'+str(maxy)
82
83     if force:
84       command = 'tirex-batch '+command
85     else:
86       command = 'tirex-batch '+command+' -f not-exists'  
87     
88     print command  
89       
90     if system(command)==0:
91       dcur=conn.cursor()
92       dcur.execute('delete from render_queue where id=?',(id,))
93       conn.commit()
94
95 def main():
96
97   from optparse import OptionParser
98   
99   parser = OptionParser()
100   parser.add_option("-d", "--data", dest="directory",
101     help="Data directory", metavar="DIR")
102   parser.add_option("-m", "--map", dest="map",
103     help="Map name", metavar="MAP")
104   parser.add_option("-z", "--zoom", dest="zoom",
105     help="Maximal zoom (forced), used with coordinates pairs (minlat minlon maxlat maxlon) or filename in arguments", metavar="MAP")
106   parser.add_option("-f", "--force", dest="force", 
107     help="Force tile regeneration (on/off), default off")
108   (options, args) = parser.parse_args()  
109
110   print options,args
111
112   db=options.directory+'/gpx.db'
113   map=options.map  
114   zoom=options.zoom
115   force=(options.force=='on')
116
117   if zoom:
118     if len(args)==1:
119       filename,=args
120       print "Rendering file: "+filename+"\n"
121       queue_render(db,filename)
122     else:
123       minlat,minlon,maxlat,maxlon=args
124       queue_tiles(db,float(minlat),float(minlon),float(maxlat),float(maxlon),int(zoom))
125
126   if map:
127     process_queue(db,map,force)
128   
129 if __name__ == "__main__":
130
131   main()          
132