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.
http://clk.atdmt.com/UKM/go/157562755/direct/01/
_______________________________________________
Mapnik-users mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/mapnik-users

Reply via email to