diff --git a/code/map_data.js b/code/map_data.js index e52a0fc0..37729ed1 100644 --- a/code/map_data.js +++ b/code/map_data.js @@ -14,10 +14,13 @@ window.requestData = function() { var bounds = clampLatLngBounds(map.getBounds()); - var x1 = lngToTile(bounds.getWest(), map.getZoom()); - var x2 = lngToTile(bounds.getEast(), map.getZoom()); - var y1 = latToTile(bounds.getNorth(), map.getZoom()); - var y2 = latToTile(bounds.getSouth(), map.getZoom()); + //we query the server as if the zoom level was effectiveZoom + var z = getPortalDataZoom(); + + var x1 = lngToTile(bounds.getWest(), z); + var x2 = lngToTile(bounds.getEast(), z); + var y1 = latToTile(bounds.getNorth(), z); + var y2 = latToTile(bounds.getSouth(), z); // will group requests by second-last quad-key quadrant tiles = {}; @@ -25,16 +28,16 @@ window.requestData = function() { // walk in x-direction, starts right goes left for (var x = x1; x <= x2; x++) { for (var y = y1; y <= y2; y++) { - var tile_id = pointToTileId(map.getZoom(), x, y); + var tile_id = pointToTileId(z, x, y); var bucket = Math.floor(x / 2) + "" + Math.floor(y / 2); if (!tiles[bucket]) tiles[bucket] = []; tiles[bucket].push(generateBoundsParams( tile_id, - tileToLat(y + 1, map.getZoom()), - tileToLng(x, map.getZoom()), - tileToLat(y, map.getZoom()), - tileToLng(x + 1, map.getZoom()) + tileToLat(y + 1, z), + tileToLng(x, z), + tileToLat(y, z), + tileToLng(x + 1, z) )); } } @@ -43,7 +46,7 @@ window.requestData = function() { portalRenderLimit.init(); // finally send ajax requests $.each(tiles, function(ind, tls) { - data = { zoom: map.getZoom() }; + data = { zoom: z }; data.boundsParamsList = tls; window.requests.add(window.postAjax('getThinnedEntitiesV2', data, window.handleDataResponse, window.handleFailedRequest)); }); diff --git a/code/utils_misc.js b/code/utils_misc.js index 2e7f3578..2d2cccc4 100644 --- a/code/utils_misc.js +++ b/code/utils_misc.js @@ -228,8 +228,28 @@ window.renderLimitReached = function(ratio) { return param.reached; } -window.getMinPortalLevel = function() { +window.getPortalDataZoom = function() { var z = map.getZoom(); + + // limiting the mazimum zoom level for data retrieval reduces the number of requests at high zoom levels + // (as all portal data is retrieved at z=17, why retrieve multiple z=18 tiles when fewer z=17 would do?) + // a potential downside - we end up requesting more data than we needed from the larger tiles that go off + // the window edge. + if (z > 17) z=17; + + // we could consider similar zoom-level consolidation, as, e.g. level 16 and 15 both return L1+, always + // request zoom 15 tiles. however, there are quirks in the current data stream, where small fields aren't + // returned by the server. using larger tiles always would amplify this issue. + + + //sanity check - should never happen + if (z < 0) z=0; + + return z; +} + +window.getMinPortalLevel = function() { + var z = getPortalDataZoom(); if(z >= 17) return 0; if(z < 0) return 8; var conv = [8,8,8,8,7,7,6,6,5,4,4,3,3,2,2,1,1];