source: subversion/utils/mapnik/generate_tiles.py @ 2026

Last change on this file since 2026 was 2015, checked in by joerg, 13 years ago

print renderinfo in one line
Adapt default areas

  • Property svn:executable set to *
File size: 5.1 KB
Line 
1#!/usr/bin/python
2from math import pi,cos,sin,log,exp,atan
3from subprocess import call
4import sys, os
5
6DEG_TO_RAD = pi/180
7RAD_TO_DEG = 180/pi
8
9def minmax (a,b,c):
10    a = max(a,b)
11    a = min(a,c)
12    return a
13
14class GoogleProjection:
15    def __init__(self,levels=18):
16        self.Bc = []
17        self.Cc = []
18        self.zc = []
19        self.Ac = []
20        c = 256
21        for d in range(0,levels):
22            e = c/2;
23            self.Bc.append(c/360.0)
24            self.Cc.append(c/(2 * pi))
25            self.zc.append((e,e))
26            self.Ac.append(c)
27            c *= 2
28               
29    def fromLLtoPixel(self,ll,zoom):
30         d = self.zc[zoom]
31         e = round(d[0] + ll[0] * self.Bc[zoom])
32         f = minmax(sin(DEG_TO_RAD * ll[1]),-0.9999,0.9999)
33         g = round(d[1] + 0.5*log((1+f)/(1-f))*-self.Cc[zoom])
34         return (e,g)
35     
36    def fromPixelToLL(self,px,zoom):
37         e = self.zc[zoom]
38         f = (px[0] - e[0])/self.Bc[zoom]
39         g = (px[1] - e[1])/-self.Cc[zoom]
40         h = RAD_TO_DEG * ( 2 * atan(exp(g)) - 0.5 * pi)
41         return (f,h)
42
43
44import os
45from PIL.Image import fromstring, new
46from PIL.ImageDraw import Draw
47from StringIO import StringIO
48from mapnik import *
49
50def render_tiles(bbox, mapfile, tile_dir, minZoom=1,maxZoom=18, name="unknown"):
51    print "render_tiles(",bbox, mapfile, tile_dir, minZoom,maxZoom, name,")"
52
53    if not os.path.isdir(tile_dir):
54         os.mkdir(tile_dir)
55
56    gprj = GoogleProjection(maxZoom+1) 
57    m = Map(2 * 256,2 * 256)
58    load_map(m,mapfile)
59    prj = Projection("+proj=merc +datum=WGS84")
60   
61    ll0 = (bbox[0],bbox[3])
62    ll1 = (bbox[2],bbox[1])
63   
64    for z in range(minZoom,maxZoom + 1):
65        px0 = gprj.fromLLtoPixel(ll0,z)
66        px1 = gprj.fromLLtoPixel(ll1,z)
67        for x in range(int(px0[0]/256.0),int(px1[0]/256.0)+1):
68            for y in range(int(px0[1]/256.0),int(px1[1]/256.0)+1):
69                p0 = gprj.fromPixelToLL((x * 256.0, (y+1) * 256.0),z)
70                p1 = gprj.fromPixelToLL(((x+1) * 256.0, y * 256.0),z)
71
72                # render a new tile and store it on filesystem
73                c0 = prj.forward(Coord(p0[0],p0[1]))
74                c1 = prj.forward(Coord(p1[0],p1[1]))
75           
76                bbox = Envelope(c0.x,c0.y,c1.x,c1.y)
77                bbox.width(bbox.width() * 2)
78                bbox.height(bbox.height() * 2)
79                m.zoom_to_box(bbox)
80               
81                # check if we have directories in place
82                zoom = "%s" % z
83                str_x = "%s" % x
84                str_y = "%s" % y
85
86                if not os.path.isdir(tile_dir + zoom):
87                    os.mkdir(tile_dir + zoom)
88                if not os.path.isdir(tile_dir + zoom + '/' + str_x):
89                    os.mkdir(tile_dir + zoom + '/' + str_x)
90
91                tile_uri = tile_dir + zoom + '/' + str_x + '/' + str_y + '.png'
92
93                exists= ""
94                if os.path.isfile(tile_uri):
95                    exists= "exists"
96                else:
97                    im = Image(512, 512)
98                    render(m, im)
99                    im = fromstring('RGBA', (512, 512), rawdata(im))
100                    im = im.crop((128,128,512-128,512-128))
101                    fh = open(tile_uri,'w+b')
102                    im.save(fh, 'PNG', quality=100)
103                    command = "convert  -colors 255 %s %s" % (tile_uri,tile_uri)
104                    call(command, shell=True)
105
106
107                bytes=os.stat(tile_uri)[6]
108                empty= ''
109                if bytes == 137:
110                    empty = " Empty Tile "
111
112                print name,"[",minZoom,"-",maxZoom,"]: " ,z,x,y,"p:",p0,p1,exists, empty
113
114if __name__ == "__main__":
115    bbox = (-2, 50.0,1.0,52.0)
116    home = os.environ['HOME']
117    mapfile = home + "/svn.openstreetmap.org/utils/mapnik/osm.xml"
118    tile_dir = home + "/osm/tiles/"
119
120    minZoom = 10
121    maxZoom = 16
122    render_tiles(bbox, mapfile, tile_dir, minZoom, maxZoom)
123
124    # Start with an overview
125    # World
126    bbox = (-180.0,-90.0, 180.0,90.0)
127    render_tiles(bbox, mapfile, tile_dir, 1, 5,"World")
128
129    # Muenchen
130    bbox = (11.4,48.07, 11.7,48.22)
131    render_tiles(bbox, mapfile, tile_dir, 1, 12 , "Muenchen")
132
133
134    # Muenchen+
135    bbox = (11.3,48.01, 12.15,48.44)
136    render_tiles(bbox, mapfile, tile_dir, 7, 12 , "Muenchen+")
137
138    # Muenchen++
139    bbox = (10.92,47.7, 12.24,48.61)
140    render_tiles(bbox, mapfile, tile_dir, 7, 12 , "Muenchen++")
141
142    # Nuernberg
143    bbox=(10.903198,49.560441,49.633534,11.038085)
144    render_tiles(bbox, mapfile, tile_dir, 10, 16,"Nuernberg")
145
146    # Karlsruhe
147    bbox=(8.179113,48.933617,8.489252,49.081707)
148    render_tiles(bbox, mapfile, tile_dir, 10, 16,"Karlsruhe")
149
150    # Karlsruhe+
151    bbox = (8.3,48.95,8.5,49.05)
152    render_tiles(bbox, mapfile, tile_dir, 1, 16, "Karlsruhe+")
153
154    # Augsburg
155    bbox = (8.3,48.95,8.5,49.05)
156    render_tiles(bbox, mapfile, tile_dir, 1, 16, "Augsburg")
157
158    # Augsburg+
159    bbox=(10.773251,48.369594,10.883834,48.438577)
160    render_tiles(bbox, mapfile, tile_dir, 10, 14, "Augsburg+")
161
162    # Europe+
163    bbox = (1.0,10.0, 20.6,50.0)
164    render_tiles(bbox, mapfile, tile_dir, 1, 11 , "Europe+")
165
166    # World
167    bbox = (-180.0,-90.0, 180.0,90.0)
168    render_tiles(bbox, mapfile, tile_dir, 1, 6,"World")
Note: See TracBrowser for help on using the repository browser.