pngtile.image: split out javascript and rename js/css to map
authorTero Marttila <terom@paivola.fi>
Mon, 15 Sep 2014 00:10:43 +0300
changeset 142 9b316e83e9e3
parent 141 19a3ed063d18
child 143 22efa9fe73c8
pngtile.image: split out javascript and rename js/css to map
pngtile/image.py
static/pngtile/image.css
static/pngtile/map.css
static/pngtile/map.js
--- a/pngtile/image.py	Sun Sep 14 23:18:35 2014 +0300
+++ b/pngtile/image.py	Mon Sep 15 00:10:43 2014 +0300
@@ -18,13 +18,14 @@
         'https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css',
         'https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css',
         'http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.css',
-        '/static/pngtile/image.css',
+        '/static/pngtile/map.css',
     )
 
     SCRIPTS = (
         'https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js',
         'https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js',
         'http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.js',
+        '/static/pngtile/map.js',
     )
 
     def __init__ (self, **opts):
@@ -39,7 +40,7 @@
 
         image_info = image.info()
 
-        config = dict(
+        map_config = dict(
             tile_url        = 'http://zovoweix.qmsk.net:8080/{name}?x={x}&y={y}&zoom={z}',
             tile_name       = name,
 
@@ -58,38 +59,7 @@
                 ]),
             ),
             end         = (
-                html.script("""\
-                    $(function() {{
-                        var config = {config};
-
-                        var bounds = [
-                            [ 0, config.image_height ],
-                            [ -config.image_width, 0 ]
-                        ];
-                        var center = [
-                            -256, 512
-                        ];
-                        var zoom = config.tile_zoom;
-                        
-                        var map = L.map('map', {{
-                            crs: L.CRS.Simple,
-                            center: center,
-                            zoom: zoom,
-                            maxBounds: bounds
-                        }});
-
-                        L.tileLayer(config.tile_url, {{
-                            name: config.tile_name,
-                            minZoom: 0,
-                            maxZoom: config.tile_zoom,
-                            tileSize: config.tile_size,
-                            continuousWorld: true,
-                            noWrap: true,
-                            zoomReverse: true,
-                            bounds: bounds
-                        }}).addTo(map);
-                    }});
-                """.format(config=json.dumps(config))),
+                html.script("""$(function() {{ map_init({map_config}); }});""".format(map_config=json.dumps(map_config))),
             ),
         )
 
--- a/static/pngtile/image.css	Sun Sep 14 23:18:35 2014 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-#map {
-    overflow: hidden;
-    position: absolute;
-
-    top: 0px;
-    left: 0px;
-    width: 100%;
-    height: 100%;
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/static/pngtile/map.css	Mon Sep 15 00:10:43 2014 +0300
@@ -0,0 +1,9 @@
+#map {
+    overflow: hidden;
+    position: absolute;
+
+    top: 0px;
+    left: 0px;
+    width: 100%;
+    height: 100%;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/static/pngtile/map.js	Mon Sep 15 00:10:43 2014 +0300
@@ -0,0 +1,77 @@
+var map_config;
+var map;
+
+function map_init (_config) {
+    map_config = _config;
+
+    var bounds = L.latLngBounds(
+        L.latLng(-map_config.image_height, 0),
+        L.latLng(0, +map_config.image_width)
+    );
+    
+    map = L.map('map', {
+        crs: L              .CRS.Simple,
+        minZoom:            0,
+        maxZoom:            map_config.tile_zoom,
+        maxBounds:          bounds
+    });
+
+    map.on('move', map_move);
+
+    L.tileLayer(map_config.tile_url, {
+        name:               map_config.tile_name,
+        minZoom:            0,
+        maxZoom:            map_config.tile_zoom,
+        tileSize:           map_config.tile_size,
+        continuousWorld:    true,
+        noWrap:             true,
+        zoomReverse:        true,
+        bounds:             bounds
+    }).addTo(map);
+
+    // set position
+    var x = bounds.getCenter().lng;
+    var y = -bounds.getCenter().lat;
+    var z = 0;
+
+    if (document.location.hash) {
+        // parse x:y:z tuple
+        var pt = document.location.hash.substr(1).split(":");
+        
+        // unpack    
+        if (pt.length) x = parseInt(pt.shift()) || x;
+        if (pt.length) y = parseInt(pt.shift()) || y;
+        if (pt.length) z = parseInt(pt.shift()) || z;
+    }
+
+    map_center(x, y, z);
+}
+
+function map_move () {
+    var map_center = map.getCenter();
+    var map_zoom = map.getZoom();
+
+    var x = (+map_center.lng) << map_config.tile_zoom;
+    var y = (-map_center.lat) << map_config.tile_zoom;
+    var z = map_config.tile_zoom - map_zoom;
+
+    document.location.hash = x + ":" + y + ":" + z;
+}
+
+/*
+ * Position map based on pngtile coordinates
+ */
+function map_center (x, y, z) {
+    // translate to lat/lng
+    // leaflet seems to base its latlng coordinates on the max zoom level
+    var map_center = [
+        -(y >> map_config.tile_zoom),
+        +(x >> map_config.tile_zoom),
+    ];
+
+    // reversed zoom
+    var map_zoom = map_config.tile_zoom - z;
+    
+    map.setView(map_center, map_zoom);
+}
+