Hi Chris,

Mapnik won't re-project raster on fly, yet. This is something I'd like
to implement but for the time being you must re-project your geotiff
to master map projection (900913) using external tools like gdal.

Cheers,
Artem

2009/7/28 Chris Emberson <[email protected]>:
> Dear Mapnik users,
>
> I am suffering from the 'empty tile' syndrome - attempting to tile a Geotiff
> using generate_tiles.py which creates transparent tiles.
> I have implemented the suggestions on similar posts, but still to no avail..
>
> Can you help?
>
> Thanks,
> Chris
>
> code is as follows.....
>
> #!/usr/bin/python
> from math import pi,cos,sin,log,exp,atan
> from subprocess import call
> import sys, os
>
> DEG_TO_RAD = pi/180
> RAD_TO_DEG = 180/pi
>
> def minmax (a,b,c):
>     a = max(a,b)
>     a = min(a,c)
>     return a
>
> class GoogleProjection:
>     def __init__(self,levels=18):
>         self.Bc = []
>         self.Cc = []
>         self.zc = []
>         self.Ac = []
>         c = 256
>         for d in range(0,levels):
>             e = c/2;
>             self.Bc.append(c/360.0)
>             self.Cc.append(c/(2 * pi))
>             self.zc.append((e,e))
>             self.Ac.append(c)
>             c *= 2
>
>     def fromLLtoPixel(self,ll,zoom):
>          d = self.zc[zoom]
>          e = round(d[0] + ll[0] * self.Bc[zoom])
>          f = minmax(sin(DEG_TO_RAD * ll[1]),-0.9999,0.9999)
>          g = round(d[1] + 0.5*log((1+f)/(1-f))*-self.Cc[zoom])
>          return (e,g)
>
>     def fromPixelToLL(self,px,zoom):
>          e = self.zc[zoom]
>          f = (px[0] - e[0])/self.Bc[zoom]
>          g = (px[1] - e[1])/-self.Cc[zoom]
>          h = RAD_TO_DEG * ( 2 * atan(exp(g)) - 0.5 * pi)
>          return (f,h)
>
> from mapnik import *
>
> def render_tiles(bbox, mapfile, tile_dir, minZoom=1,maxZoom=18,
> name="unknown"):
>     print "render_tiles(",bbox, mapfile, tile_dir, minZoom,maxZoom, name,")"
>
>     if not os.path.isdir(tile_dir):
>          os.mkdir(tile_dir)
>
>     gprj = GoogleProjection(maxZoom+1)
>     m = Map(2 * 256,2 * 256)
>     load_map(m,mapfile)
>
>     prj = Projection("+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0+lon_0=0.0
> +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgri...@null +no_defs+over")
>
>     ll0 = (bbox[0],bbox[3])
>     ll1 = (bbox[2],bbox[1])
>
>     for z in range(minZoom,maxZoom + 1):
>         px0 = gprj.fromLLtoPixel(ll0,z)
>         px1 = gprj.fromLLtoPixel(ll1,z)
>
>         # check if we have directories in place
>         zoom = "%s" % z
>         if not os.path.isdir(tile_dir + 'Z' + zoom):
>             os.mkdir(tile_dir + 'Z' + zoom)
>         for x in range(int(px0[0]/256.0),int(px1[0]/256.0)+1):
>             # check if we have directories in place
>             str_x = "%s" % x
>             for y in range(int(px0[1]/256.0),int(px1[1]/256.0)+1):
>                 p0 = gprj.fromPixelToLL((x * 256.0, (y+1) * 256.0),z)
>                 p1 = gprj.fromPixelToLL(((x+1) * 256.0, y * 256.0),z)
>
>                 # render a new tile and store it on filesystem
>                 c0 = prj.forward(Coord(p0[0],p0[1]))
>                 c1 = prj.forward(Coord(p1[0],p1[1]))
>
>                 bbox = Envelope(c0.x,c0.y,c1.x,c1.y)
>                 bbox.width(bbox.width() * 2)
>                 bbox.height(bbox.height() * 2)
>                 m.zoom_to_box(bbox)
>
>                 str_y = "%s" % y
>
>                 if not os.path.isdir(tile_dir + 'Z' + zoom + '/' + str_y):
>                     os.mkdir(tile_dir + 'Z' + zoom + '/' + str_y)
>                 tile_uri = tile_dir + 'Z' + zoom + '/' + str_y + '/' + str_x
> + '.png'
>                 exists= ""
>                 if os.path.isfile(tile_uri):
>                     exists= "exists"
>                 else:
>                     render_to_file(m, tile_uri)
>                     im = Image(512, 512)
>                     render(m, im)
>                     view = im.view(128,128,256,256) # x,y,width,height
>                     view.save(tile_uri,'png')
>  #                   command = "convert  -colors 255 %s %s" %
> (tile_uri,tile_uri)
>  #                   call(command, shell=True)
>
>                 bytes=os.stat(tile_uri)[6]
>                 empty= ''
>                 if bytes == 334:
>                     empty = " Empty Tile "
>
>                 print name,"[",minZoom,"-",maxZoom,"]: "
> ,z,x,y,"p:",p0,p1,exists, empty
>
> if __name__ == "__main__":
>     home = os.environ['HOME']
>     mapfile = '/home/chrise/rasters/rasters2.xml'
>     tile_dir = '/home/chrise/rasters/tiles/'
>
>
> #-------------------------------------------------------------------------
>     #
>     # Change the following for different bounding boxes and zoom levels
>     #
>     # Start with an overview
>     # World
>
>     minZoom = 8 # 8 & 9 don't show names
>     maxZoom = 12
>     # Original
>     #bbox = (-4.19104,50.55263,-3.74899,51.77649)
>     # Full area
>     #bbox = (-5.39104,50.55263,-3.74899,52.37649)
>     # Tiny
>     #bbox = (-3.97915,51.61631,-3.95435,51.62137)
>     # [ (51.61352,-3.98052), (51.6289,-3.93092) ]
>     #bbox = (-3.98052,51.61352,-3.93092,51.6289)
>     # London
>     bbox = (-0.5527,51.22825,0.33372,51.70009)
>
>     render_tiles(bbox, mapfile, tile_dir, minZoom, maxZoom, "dem")
>
>
>
>
> rasters2.xml............
>
> <?xml version="1.0" encoding="utf-8"?>
> <!DOCTYPE Map>
>
> <Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0
> +y_0=0 +k=1.0 +units=m +nadgri...@null +no_defs +over">
>
> <Style name="My Style">
>     <Rule>
>           <RasterSymbolizer>
>             <CssParameter name="opacity">0.8</CssParameter>
> <!--            <CssParameter name="scaling">fast</CssParameter>-->
> <!--            <CssParameter name="mode">multiply</CssParameter>-->
>           </RasterSymbolizer>
>     </Rule>
> </Style>
>
>
> <Layer name="dem" status="on" >
>         <StyleName>raster</StyleName>
>         <Datasource>
>                 <Parameter name="type">raster</Parameter>
>                 <Parameter
> name="file">/home/chrise/rasters/q5_proc_prj.tiff</Parameter>
>                 <Parameter name="lox">-58366.462</Parameter>
>                 <Parameter name="loy">6746403.661</Parameter>
>                 <Parameter name="hix">38553.750</Parameter>
>                 <Parameter name="hiy">6670183.296</Parameter>
>         </Datasource>
> </Layer>
>
> </Map>
>
>
>
>
>
> ________________________________
> Celebrate a decade of Messenger with free winks, emoticons, display pics,
> and more. Get Them Now
> _______________________________________________
> Mapnik-users mailing list
> [email protected]
> https://lists.berlios.de/mailman/listinfo/mapnik-users
>
>
_______________________________________________
Mapnik-users mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/mapnik-users

Reply via email to