bef03c16d5f5eda3efa226d2feb34a17f0badb68
[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):
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)
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=9
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 not forced_max_zoom:
58       if (maxxt-minxt>16) or (maxyt-minyt>12):
59         conn.commit()
60         break
61
62   conn.commit()        
63
64 def process_queue(db,map):
65
66   from os import system
67
68   conn = sqlite3.connect(db)
69   cur = conn.cursor()
70   cur.execute('select id,zoom,minx,maxx,miny,maxy from render_queue')
71   list=cur.fetchall()
72
73   for rec in list:
74   
75     id,zoom,minx,maxx,miny,maxy=rec
76
77     command = 'render_list -a -m '+map+ \
78       ' -z '+str(zoom)+' -Z '+str(zoom)+ \
79       ' -x '+str(minx)+' -X '+str(maxx)+ \
80       ' -y '+str(miny)+' -Y '+str(maxy)
81     if system(command)==0:
82       dcur=conn.cursor()
83       dcur.execute('delete from render_queue where id=?',(id,))
84       conn.commit()
85
86 def main():
87
88   from optparse import OptionParser
89   
90   parser = OptionParser()
91   parser.add_option("-d", "--data", dest="directory",
92     help="Data directory", metavar="DIR")
93   parser.add_option("-m", "--map", dest="map",
94     help="Map name", metavar="MAP")
95   parser.add_option("-z", "--zoom", dest="zoom",
96     help="Maximal zoom (forced), used with coordinates pairs (minlat minlon maxlat maxlon) in arguments", metavar="MAP")
97   (options, args) = parser.parse_args()  
98
99   db=options.directory+'/gpx.db'
100   map=options.map  
101   zoom=options.zoom
102
103   if zoom:
104     minlat,minlon,maxlat,maxlon=args
105     queue_tiles(db,float(minlat),float(minlon),float(maxlat),float(maxlon),int(zoom))
106
107   if map:
108     process_queue(db,map)
109   
110 if __name__ == "__main__":
111
112   main()          
113