pngtile/tile.py
author Tero Marttila <terom@qmsk.net>
Fri, 03 Oct 2014 23:56:25 +0300
changeset 165 1dc09e81a4e2
parent 144 5b2b866ad0a3
child 167 16b600e927fe
permissions -rw-r--r--
pngtile.tile: handle dir/image requests by redirecting to image_server
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
165
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
     5
from pngtile.application import BaseApplication, url
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
from werkzeug import Request, Response, exceptions
165
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
     7
from werkzeug.utils import redirect
135
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
140
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    13
TILE_SIZE = 256
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    14
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    15
# maximum zoom out
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    16
MAX_ZOOM = 4
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
# max. output resolution to allow
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
MAX_PIXELS = 1920 * 1200
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
def scale (val, zoom):
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
        Scale dimension by zoom factor
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
        zl > 0 -> bigger
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
        zl < 0 -> smaller
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
    """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
    if zoom > 0:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
        return val << zoom
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
    elif zoom < 0:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
        return val >> -zoom
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
    else:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
        return val
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
def scale_center (val, dim, 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
        Scale value about center by zoom.
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
    """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
144
5b2b866ad0a3 pngtile.tile: fix render_region centering
Tero Marttila <terom@paivola.fi>
parents: 140
diff changeset
    43
    return scale(val, zoom) - dim / 2
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
138
59d61da2b64f pngtile.tile: split off BaseAppliation
Tero Marttila <terom@paivola.fi>
parents: 135
diff changeset
    45
class TileApplication (BaseApplication):
165
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
    46
    def __init__ (self, image_server, **opts):
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
    47
        """
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
    48
            image_server:       http://.../ url to image-server frontend
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
    49
        """
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
    50
138
59d61da2b64f pngtile.tile: split off BaseAppliation
Tero Marttila <terom@paivola.fi>
parents: 135
diff changeset
    51
        BaseApplication.__init__(self, **opts)
165
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
    52
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
    53
        self.image_server = image_server
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    54
        
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
    def render_region (self, request, image):
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    56
        """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    57
            Handle request for an image region
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
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
        width = int(request.args['w'])
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
        height = int(request.args['h'])
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
        x = int(request.args['x'])
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
        y = int(request.args['y'])
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
        zoom = int(request.args.get('zoom', "0"))
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
140
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    66
        # safety limit
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
        if width * height > MAX_PIXELS:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
            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
    69
140
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    70
        if zoom > MAX_ZOOM:
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    71
            raise exceptions.BadRequest("Image zoom: %d > %d" % (zoom, MAX_ZOOM))
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    72
144
5b2b866ad0a3 pngtile.tile: fix render_region centering
Tero Marttila <terom@paivola.fi>
parents: 140
diff changeset
    73
        x = scale_center(x, width, zoom)
5b2b866ad0a3 pngtile.tile: fix render_region centering
Tero Marttila <terom@paivola.fi>
parents: 140
diff changeset
    74
        y = scale_center(y, height, zoom)
135
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
        try:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
            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
    78
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
        except pypngtile.Error as error:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
            raise exceptions.BadRequest(str(error))
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    81
        
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    82
    def render_tile (self, request, image):
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
            Handle request for image tile
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    85
        """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
140
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    87
        width = TILE_SIZE
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    88
        height = TILE_SIZE
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    89
        x = int(request.args['x'])
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    90
        y = int(request.args['y'])
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    91
        zoom = int(request.args.get('zoom', "0"))
140
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    92
        
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    93
        if zoom > MAX_ZOOM:
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    94
            raise exceptions.BadRequest("Image zoom: %d > %d" % (zoom, MAX_ZOOM))
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
140
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    96
        x = scale(x * width, zoom)
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    97
        y = scale(y * height, zoom)
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
        try:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   100
            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
   101
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   102
        except pypngtile.Error as error:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   103
            raise exceptions.BadRequest(str(error))
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   104
165
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   105
    def handle_dir (self, request, name, path):
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   106
        """
165
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   107
            Redirect to the image frontend for a non-tile request.
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   108
        """
165
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   109
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   110
        if not name.endswith('/'):
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   111
            # avoid an additional redirect
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   112
            name += '/'
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   113
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   114
        return redirect(url(self.image_server, name))
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   115
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   116
    def handle_image (self, request, name, path):
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   117
        """
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   118
            Redirect to the image frontend for a non-tile request.
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   119
        """
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   120
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   121
        return redirect(url(self.image_server, name))
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   122
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   123
    def handle_region (self, request):
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   124
        """
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   125
            Return image/png for given region.
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   126
        """
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   127
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   128
        try:
138
59d61da2b64f pngtile.tile: split off BaseAppliation
Tero Marttila <terom@paivola.fi>
parents: 135
diff changeset
   129
            image, name = self.get_image(request.path)
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   130
        except pypngtile.Error as error:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   131
            raise exceptions.BadRequest(str(error))
165
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   132
 
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   133
        png = self.render_region(request, image)
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   134
        
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   135
        return Response(png, content_type='image/png')
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   136
165
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   137
    def handle_tile (self, request):
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   138
        """
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   139
            Return image/png for given tile.
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   140
        """
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   141
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   142
        try:
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   143
            image, name = self.get_image(request.path)
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   144
        except pypngtile.Error as error:
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   145
            raise exceptions.BadRequest(str(error))
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   146
            
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   147
        png = self.render_tile(request, image)
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   148
        
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   149
        return Response(png, content_type='image/png')
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   150
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   151
    def handle (self, request):
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   152
        """
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   153
            Handle request for an image
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   154
        """
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   155
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   156
        name, path, type = self.lookup_path(request.path)
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   157
        
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   158
        # determine handler
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   159
        if not type:
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   160
            return self.handle_dir(request, name, path)
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   161
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   162
        elif not request.args:
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   163
            return self.handle_image(request, name, path)
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   164
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   165
        elif 'w' in request.args and 'h' in request.args and 'x' in request.args and 'y' in request.args:
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   166
            return self.handle_region(request)
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   167
140
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
   168
        elif 'x' in request.args and 'y' in request.args:
165
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   169
            return self.handle_tile(request)
135
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
        else:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   172
            raise exceptions.BadRequest("Unknown args")
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   173