From a622f6f37e1a8e22238ff50cfd6b6129a805642b Mon Sep 17 00:00:00 2001 From: Stuart Buchanan Date: Mon, 2 Oct 2017 20:25:11 +0100 Subject: [PATCH] Add zoom limits for SlippyMap layers --- Nasal/canvas/MapStructure.nas | 13 +++++++++---- Nasal/canvas/map/OSM.lcontroller | 3 +++ Nasal/canvas/map/OpenAIP.lcontroller | 11 ++++++++++- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/Nasal/canvas/MapStructure.nas b/Nasal/canvas/MapStructure.nas index 78334d149..b75b021bb 100644 --- a/Nasal/canvas/MapStructure.nas +++ b/Nasal/canvas/MapStructure.nas @@ -1282,12 +1282,15 @@ var TileLayer = { map: map, group: group.createChild("group", me.type), maps_base: "", + controller: controller, num_tiles: [5,5], makeURL: nil, makePath: nil, center_tile_offset : [], tile_size: 256, zoom: 9, + max_zoom: 16, + min_zoom: 4, tile_type: "map", last_tile_type: "map", last_tile : [-1,-1], @@ -1311,7 +1314,6 @@ var TileLayer = { append(m.parents, m.group); m.setVisible(visible); OverlayLayer._new(m, style, controller, options); - #m.group.setCenter(0,0); for(var x = 0; x < m.num_tiles[0]; x += 1) { @@ -1326,6 +1328,8 @@ var TileLayer = { }, updateLayer: func() { + if (me.controller != nil) me.controller.updateLayer(); + # get current position var lat = me.map.getLat(); var lon = me.map.getLon(); @@ -1341,7 +1345,11 @@ var TileLayer = { # 156543.03 meters/pixel * cos(latitude) / (2 ^ zoomlevel) # Determine the closest zoom level and scaling ratio. Each increase in zoom level doubles resolution. var ideal_zoom = math.ln(156543.03 * math.cos(lat * math.pi/180.0) / screen_resolution) / math.ln(2); + me.zoom = math.ceil(ideal_zoom); + if (me.zoom < me.min_zoom) me.zoom = me.min_zoom; + if (me.zoom > me.max_zoom) me.zoom = me.max_zoom; + var ratio = 1 / math.pow(2,me.zoom - ideal_zoom); for(var x = 0; x < me.num_tiles[0]; x += 1) @@ -1354,9 +1362,6 @@ var TileLayer = { } } - #var heading = me.map.getHdg(); - #me.group.setRotation(heading); - var ymax = math.pow(2, me.zoom); # Slippy map location of center point diff --git a/Nasal/canvas/map/OSM.lcontroller b/Nasal/canvas/map/OSM.lcontroller index f23dcb773..d93588735 100644 --- a/Nasal/canvas/map/OSM.lcontroller +++ b/Nasal/canvas/map/OSM.lcontroller @@ -21,6 +21,9 @@ var new = func(layer) { layer.makeURL = string.compileTemplate('https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png'); layer.makePath = string.compileTemplate(layer.maps_base ~ '/osm-intl/{z}/{x}/{y}.png'); + layer.max_zoom = 18; + layer.min_zoom = 1; + m.addVisibilityListener(); m.addRangeListener(); m.addScreenRangeListener(); diff --git a/Nasal/canvas/map/OpenAIP.lcontroller b/Nasal/canvas/map/OpenAIP.lcontroller index 801624c28..2a7884683 100644 --- a/Nasal/canvas/map/OpenAIP.lcontroller +++ b/Nasal/canvas/map/OpenAIP.lcontroller @@ -19,9 +19,18 @@ var new = func(layer) { }; # http://1.tile.maps.openaip.net/geowebcache/service/tms/1.0.0/openaip_basemap@EPSG%3A900913@png/6/30/43.png - layer.makeURL = string.compileTemplate('http://1.tile.maps.openaip.net/geowebcache/service/tms/1.0.0/openaip_basemap@EPSG%3A900913@png/{z}/{x}/{tms_y}.png'); + + if (rand() < 0.5) { + layer.makeURL = string.compileTemplate('http://1.tile.maps.openaip.net/geowebcache/service/tms/1.0.0/openaip_basemap@EPSG%3A900913@png/{z}/{x}/{tms_y}.png'); + } else { + layer.makeURL = string.compileTemplate('http://2.tile.maps.openaip.net/geowebcache/service/tms/1.0.0/openaip_basemap@EPSG%3A900913@png/{z}/{x}/{tms_y}.png'); + } + layer.makePath = string.compileTemplate(layer.maps_base ~ '/openaip_basemap/{z}/{x}/{tms_y}.png'); + layer.max_zoom = 14; + layer.min_zoom = 4; + m.addVisibilityListener(); m.addRangeListener(); m.addScreenRangeListener();