pngtile/image.py
author Tero Marttila <terom@paivola.fi>
Sun, 14 Sep 2014 23:18:35 +0300
changeset 141 19a3ed063d18
child 142 9b316e83e9e3
permissions -rw-r--r--
pngtile.image: leaflet browser for tiles; coordinates are still wonky..
141
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
"""
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
    Image handling.
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
"""
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
from werkzeug import Request, Response, exceptions
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
from werkzeug.utils import html
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
import pngtile.tile
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
from pngtile.application import BaseApplication
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
import pypngtile
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
import json
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
class ImageApplication (BaseApplication):
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
    STYLESHEETS = (
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
        'https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css',
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
        'https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css',
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
        'http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.css',
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
        '/static/pngtile/image.css',
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
    )
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
    SCRIPTS = (
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
        'https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js',
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
        'https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js',
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
        'http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.js',
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
    )
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
    def __init__ (self, **opts):
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
        BaseApplication.__init__(self, **opts)
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
    def render_image (self, request, image, name):
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
        """
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
            request:    werkzeug.Request
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
            image:      pypngtile.Image
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
            name:       request path for .png image
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
        """
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
        image_info = image.info()
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
        config = dict(
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
            tile_url        = 'http://zovoweix.qmsk.net:8080/{name}?x={x}&y={y}&zoom={z}',
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
            tile_name       = name,
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
            tile_size       = pngtile.tile.TILE_SIZE,
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
            tile_zoom       = pngtile.tile.MAX_ZOOM,
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
            
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
            image_width     = image_info['img_width'],
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
            image_height    = image_info['img_height'],
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
        )
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    52
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    53
        return self.render_html(
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    54
            title       = name,
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
            body        = (
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    56
                html.div(id='wrapper', *[
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    57
                    html.div(id='map')
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    58
                ]),
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
            ),
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
            end         = (
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
                html.script("""\
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
                    $(function() {{
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
                        var config = {config};
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
                        var bounds = [
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
                            [ 0, config.image_height ],
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
                            [ -config.image_width, 0 ]
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
                        ];
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
                        var center = [
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
                            -256, 512
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
                        ];
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
                        var zoom = config.tile_zoom;
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
                        
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
                        var map = L.map('map', {{
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    75
                            crs: L.CRS.Simple,
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    76
                            center: center,
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
                            zoom: zoom,
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    78
                            maxBounds: bounds
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
                        }});
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    81
                        L.tileLayer(config.tile_url, {{
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    82
                            name: config.tile_name,
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
                            minZoom: 0,
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    84
                            maxZoom: config.tile_zoom,
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    85
                            tileSize: config.tile_size,
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
                            continuousWorld: true,
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    87
                            noWrap: true,
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
                            zoomReverse: true,
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
                            bounds: bounds
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
                        }}).addTo(map);
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    91
                    }});
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
                """.format(config=json.dumps(config))),
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
            ),
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    94
        )
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
    def handle (self, request):
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    97
        """
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
            Handle request for an image
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
        """
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   100
         
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   101
        try:
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   102
            image, name = self.get_image(request.path)
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   103
        except pypngtile.Error as error:
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   104
            raise exceptions.BadRequest(str(error))
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   105
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   106
        html = self.render_image(request, image, name)
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   107
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   108
        return Response(html, content_type="text/html")
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   109
19a3ed063d18 pngtile.image: leaflet browser for tiles; coordinates are still wonky..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   110