Merge pull request #3518 from Leaflet/visible-tiles
Reworked pixelBounds calculation in GridTile to deal with fractional zoom
This commit is contained in:
commit
79105f78a7
61
debug/tests/tile-bounds.html
Normal file
61
debug/tests/tile-bounds.html
Normal file
@ -0,0 +1,61 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Leaflet debug page</title>
|
||||
|
||||
<link rel="stylesheet" href="../../dist/leaflet.css" />
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
|
||||
<link rel="stylesheet" href="../css/screen.css" />
|
||||
|
||||
<script type="text/javascript" src="../../build/deps.js"></script>
|
||||
<script src="../leaflet-include.js"></script>
|
||||
<style>
|
||||
#map {
|
||||
margin: 256px;
|
||||
width: auto;
|
||||
overflow: visible
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
The CSS in this page makes the boundaries of the GridLayer tiles visible. Tiles which do not overlap the map bounds shall not be shown, even at fractional zoom levels.
|
||||
|
||||
<button onclick='map.zoomIn(0.1)'> Zoom + 0.1 </button>
|
||||
<button onclick='map.zoomOut(0.1)'> Zoom - 0.1 </button>
|
||||
|
||||
<div id="map" class="map"></div>
|
||||
|
||||
<script type="text/javascript">
|
||||
var mapopts = {
|
||||
center: [35, -122],
|
||||
zoom : 5.7
|
||||
};
|
||||
|
||||
var map = L.map('map', mapopts);
|
||||
|
||||
var grid = L.gridLayer({
|
||||
attribution: 'Grid Layer'
|
||||
});
|
||||
|
||||
grid.createTile = function (coords, done) {
|
||||
var tile = document.createElement('div');
|
||||
tile.innerHTML = [coords.x, coords.y, coords.z].join(', ');
|
||||
tile.style.border = '2px solid red';
|
||||
// tile.style.background = 'white';
|
||||
|
||||
// test async
|
||||
setTimeout(function () {
|
||||
done(null, tile);
|
||||
}, 0);
|
||||
|
||||
return tile;
|
||||
};
|
||||
|
||||
map.addLayer(grid);
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
@ -413,15 +413,19 @@ L.GridLayer = L.Layer.extend({
|
||||
if (!map) { return; }
|
||||
|
||||
if (center === undefined) { center = map.getCenter(); }
|
||||
if (zoom === undefined) { zoom = Math.round(map.getZoom()); }
|
||||
if (zoom === undefined) { zoom = map.getZoom(); }
|
||||
var tileZoom = Math.round(zoom);
|
||||
|
||||
if (zoom > this.options.maxZoom ||
|
||||
zoom < this.options.minZoom) { return; }
|
||||
if (tileZoom > this.options.maxZoom ||
|
||||
tileZoom < this.options.minZoom) { return; }
|
||||
|
||||
var pixelBounds = map.getPixelBounds(center, zoom),
|
||||
tileRange = this._pxBoundsToTileRange(pixelBounds),
|
||||
tileCenter = tileRange.getCenter(),
|
||||
queue = [];
|
||||
var scale = this._map.getZoomScale(zoom, tileZoom),
|
||||
pixelCenter = map.project(center, tileZoom).floor(),
|
||||
halfSize = map.getSize().divideBy(scale * 2),
|
||||
pixelBounds = new L.Bounds(pixelCenter.subtract(halfSize), pixelCenter.add(halfSize)),
|
||||
tileRange = this._pxBoundsToTileRange(pixelBounds),
|
||||
tileCenter = tileRange.getCenter(),
|
||||
queue = [];
|
||||
|
||||
for (var key in this._tiles) {
|
||||
this._tiles[key].current = false;
|
||||
@ -431,7 +435,7 @@ L.GridLayer = L.Layer.extend({
|
||||
for (var j = tileRange.min.y; j <= tileRange.max.y; j++) {
|
||||
for (var i = tileRange.min.x; i <= tileRange.max.x; i++) {
|
||||
var coords = new L.Point(i, j);
|
||||
coords.z = zoom;
|
||||
coords.z = tileZoom;
|
||||
|
||||
if (!this._isValidTile(coords)) { continue; }
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user