pngtile/tile.py
author Tero Marttila <terom@paivola.fi>
Sun, 14 Sep 2014 17:19:54 +0300
changeset 135 e99dd75afa15
child 138 59d61da2b64f
permissions -rw-r--r--
pngtile.tile: separate Application dedicated to PNG serving
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
"""
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
    Raw tile handling.
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
"""
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
import os.path
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
from werkzeug import Request, Response, exceptions
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
import pypngtile
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
## Coordinates
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
# width of a tile
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
TILE_WIDTH = 256
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
TILE_HEIGHT = 256
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
# max. output resolution to allow
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
MAX_PIXELS = 1920 * 1200
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
def scale (val, zoom):
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
    """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
        Scale dimension by zoom factor
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
        zl > 0 -> bigger
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
        zl < 0 -> smaller
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
    """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
    if zoom > 0:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
        return val << zoom
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
    elif zoom < 0:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
        return val >> -zoom
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
    else:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
        return val
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
def scale_center (val, dim, zoom):
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
    """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
        Scale value about center by zoom.
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
    """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
    return scale(val - dim / 2, zoom)
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
class Application (object):
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
    def __init__ (self, image_root):
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
        if not os.path.isdir(image_root) :
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
            raise Exception("Given image_root does not exist: {image_root}".format(image_root=image_root))
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
        self.image_root = os.path.abspath(image_root)
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
        self.image_cache = { }
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    52
    def lookup_image (self, url):
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    53
        """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    54
            Lookup image by request path.
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    56
            Returns image_name, image_path.
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    57
        """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    58
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
        if not os.path.isdir(self.image_root):
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
            raise exceptions.InternalServerError("Server image_root has gone missing")
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
    
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
        # path to image
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
        name = url.lstrip('/')
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
        
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
        # build absolute path
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
        path = os.path.abspath(os.path.join(self.image_root, name))
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
        # ensure the path points inside the data root
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
        if not path.startswith(self.image_root):
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
            raise exceptions.NotFound(name)
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
        return name, path
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
    def get_image (self, url):
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    75
        """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    76
            Return Image object.
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
        """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    78
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
        name, path = self.lookup_image(url)
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    81
        # get Image object
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    82
        image = self.image_cache.get(path)
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    84
        if not image:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    85
            # open
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
            image = pypngtile.Image(path)
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    87
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
            # check
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
            if image.status() not in (pypngtile.CACHE_FRESH, pypngtile.CACHE_STALE):
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
                raise exceptions.InternalServerError("Image cache not available: {name}".format(name=name))
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    91
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
            # load
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
            image.open()
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    94
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
            # cache
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
            self.image_cache[path] = image
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    97
        
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
        return image
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   100
    def render_region (self, request, image):
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   101
        """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   102
            Handle request for an image region
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   103
        """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   104
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   105
        width = int(request.args['w'])
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   106
        height = int(request.args['h'])
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   107
        x = int(request.args['x'])
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   108
        y = int(request.args['y'])
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   109
        zoom = int(request.args.get('zoom', "0"))
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   110
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   111
        # safely limit
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   112
        if width * height > MAX_PIXELS:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   113
            raise exceptions.BadRequest("Image size: %d * %d > %d" % (width, height, MAX_PIXELS))
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   114
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   115
        x = scale(x, zoom)
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   116
        y = scale(y, zoom)
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   117
        
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   118
        try:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   119
            return image.tile_mem(width, height, x, y, zoom)
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   120
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   121
        except pypngtile.Error as error:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   122
            raise exceptions.BadRequest(str(error))
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   123
        
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   124
    def render_tile (self, request, image):
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   125
        """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   126
            Handle request for image tile
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   127
        """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   128
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   129
        width = TILE_WIDTH
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   130
        height = TILE_HEIGHT
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   131
        row = int(request.args['row'])
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   132
        col = int(request.args['col'])
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   133
        zoom = int(request.args.get('zoom', "0"))
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   134
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   135
        x = scale(row * width, zoom)
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   136
        y = scale(col * height, zoom)
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   137
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   138
        try:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   139
            return image.tile_mem(width, height, x, y, zoom)
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   140
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   141
        except pypngtile.Error as error:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   142
            raise exceptions.BadRequest(str(error))
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   143
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   144
    def handle (self, request):
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   145
        """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   146
            Handle request for an image
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   147
        """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   148
        
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   149
        try:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   150
            image = self.get_image(request.path)
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   151
        except pypngtile.Error as error:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   152
            raise exceptions.BadRequest(str(error))
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   153
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   154
        if 'w' in request.args and 'h' in request.args and 'x' in request.args and 'y' in request.args:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   155
            png = self.render_region(request, image)
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   156
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   157
        elif 'row' in request.args and 'col' in request.args:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   158
            png = self.render_tile(request, image)
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   159
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   160
        else:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   161
            raise exceptions.BadRequest("Unknown args")
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   162
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   163
        return Response(png, content_type='image/png')
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   164
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   165
    @Request.application
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   166
    def __call__ (self, request):
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   167
        """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   168
            WSGI entry point.
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   169
        """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   170
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   171
        try:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   172
            return self.handle(request)
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   173
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   174
        except exceptions.HTTPException as error:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   175
            return error
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   176