Merge pull request #207 from tschaub/tilerange

Make tile range calculation consistent.  Tile ranges are always inclusive in their min/max values.
This commit is contained in:
Tim Schaub
2013-02-19 07:43:27 -08:00
4 changed files with 208 additions and 114 deletions

View File

@@ -289,11 +289,11 @@ describe('ol.tilegrid.TileGrid', function() {
});
});
describe('getTileCoordForCoordAndResolution fractional', function() {
it('returns the expected TileCoord', function() {
var tileSize = new ol.Size(256, 256);
describe('getTileCoordForCoordAndResolution_', function() {
it('returns higher tile coord for intersections by default', function() {
var tileGrid = new ol.tilegrid.TileGrid({
resolutions: [1 / 3],
resolutions: resolutions,
extent: extent,
origin: origin,
tileSize: tileSize
@@ -302,91 +302,53 @@ describe('ol.tilegrid.TileGrid', function() {
var coordinate;
var tileCoord;
// These tests render at a resolution of 1. Because the layer's
// closest resolution is 1/3, the images are scaled by 1/3.
// In this scenario, every third tile will be one pixel wider when
// rendered (0,0 is normal; 1,0 is wider; 0,1 is taller; etc.)
// gets the first tile at the origin
// gets higher tile for edge intersection
coordinate = new ol.Coordinate(0, 0);
tileCoord = tileGrid.getTileCoordForCoordAndResolution(
coordinate, 1);
expect(tileCoord.z).toEqual(0);
tileCoord = tileGrid.getTileCoordForCoordAndResolution_(
coordinate, 100);
expect(tileCoord.z).toEqual(3);
expect(tileCoord.x).toEqual(0);
expect(tileCoord.y).toEqual(0);
// gets the 1,0 tile at 256/3,0
coordinate = new ol.Coordinate(256 / 3, 0);
tileCoord = tileGrid.getTileCoordForCoordAndResolution(
coordinate, 1);
expect(tileCoord.z).toEqual(0);
expect(tileCoord.x).toEqual(1);
expect(tileCoord.y).toEqual(0);
// gets higher tile for edge intersection
coordinate = new ol.Coordinate(100000, 100000);
tileCoord = tileGrid.getTileCoordForCoordAndResolution_(
coordinate, 100);
expect(tileCoord.z).toEqual(3);
expect(tileCoord.x).toEqual(10);
expect(tileCoord.y).toEqual(10);
// still gets the 1,0 tile at 512/3,0 - wider tile
coordinate = new ol.Coordinate(512 / 3, 0);
tileCoord = tileGrid.getTileCoordForCoordAndResolution(
coordinate, 1);
expect(tileCoord.z).toEqual(0);
expect(tileCoord.x).toEqual(1);
expect(tileCoord.y).toEqual(0);
// gets the 2,0 tile at 513/3,0
coordinate = new ol.Coordinate(513 / 3, 0);
tileCoord = tileGrid.getTileCoordForCoordAndResolution(
coordinate, 1);
expect(tileCoord.z).toEqual(0);
expect(tileCoord.x).toEqual(2);
expect(tileCoord.y).toEqual(0);
// gets the 3,0 tile at 768/3,0
coordinate = new ol.Coordinate(768 / 3, 0);
tileCoord = tileGrid.getTileCoordForCoordAndResolution(
coordinate, 1);
expect(tileCoord.z).toEqual(0);
expect(tileCoord.x).toEqual(3);
expect(tileCoord.y).toEqual(0);
// gets the 4,0 tile at 1024/3,0
coordinate = new ol.Coordinate(1024 / 3, 0);
tileCoord = tileGrid.getTileCoordForCoordAndResolution(
coordinate, 1);
expect(tileCoord.z).toEqual(0);
expect(tileCoord.x).toEqual(4);
expect(tileCoord.y).toEqual(0);
// still gets the 4,0 tile at 1280/3,0 - wider tile
coordinate = new ol.Coordinate(1280 / 3, 0);
tileCoord = tileGrid.getTileCoordForCoordAndResolution(
coordinate, 1);
expect(tileCoord.z).toEqual(0);
expect(tileCoord.x).toEqual(4);
expect(tileCoord.y).toEqual(0);
// gets the 5,0 tile at 1281/3,0
coordinate = new ol.Coordinate(1281 / 3, 0);
tileCoord = tileGrid.getTileCoordForCoordAndResolution(
coordinate, 1);
expect(tileCoord.z).toEqual(0);
expect(tileCoord.x).toEqual(5);
expect(tileCoord.y).toEqual(0);
// gets the 0,1 tile at 0,-256/3
coordinate = new ol.Coordinate(0, -256 / 3);
tileCoord = tileGrid.getTileCoordForCoordAndResolution(
coordinate, 1);
expect(tileCoord.z).toEqual(0);
expect(tileCoord.x).toEqual(0);
expect(tileCoord.y).toEqual(-2);
// still gets the 0,1 tile at 0,-512/3 - taller tile
coordinate = new ol.Coordinate(0, -512 / 3);
tileCoord = tileGrid.getTileCoordForCoordAndResolution(
coordinate, 1);
expect(tileCoord.z).toEqual(0);
expect(tileCoord.x).toEqual(0);
expect(tileCoord.y).toEqual(-2);
});
it('handles alt intersection policy', function() {
var tileGrid = new ol.tilegrid.TileGrid({
resolutions: resolutions,
extent: extent,
origin: origin,
tileSize: tileSize
});
var coordinate;
var tileCoord;
// can get lower tile for edge intersection
coordinate = new ol.Coordinate(0, 0);
tileCoord = tileGrid.getTileCoordForCoordAndResolution_(
coordinate, 100, true);
expect(tileCoord.z).toEqual(3);
expect(tileCoord.x).toEqual(-1);
expect(tileCoord.y).toEqual(-1);
// gets higher tile for edge intersection
coordinate = new ol.Coordinate(100000, 100000);
tileCoord = tileGrid.getTileCoordForCoordAndResolution_(
coordinate, 100, true);
expect(tileCoord.z).toEqual(3);
expect(tileCoord.x).toEqual(9);
expect(tileCoord.y).toEqual(9);
});
});
describe('getTileCoordCenter', function() {
@@ -443,6 +405,46 @@ describe('ol.tilegrid.TileGrid', function() {
});
});
describe('getTileRangeForExtentAndResolution', function() {
it('returns the expected TileRange', function() {
var tileGrid = new ol.tilegrid.TileGrid({
resolutions: resolutions,
extent: extent,
origin: origin,
tileSize: tileSize
});
var tileRange;
tileRange = tileGrid.getTileRangeForExtentAndResolution(extent,
resolutions[0]);
expect(tileRange.minY).toEqual(0);
expect(tileRange.minX).toEqual(0);
expect(tileRange.maxX).toEqual(0);
expect(tileRange.maxY).toEqual(0);
tileRange = tileGrid.getTileRangeForExtentAndResolution(extent,
resolutions[1]);
expect(tileRange.minX).toEqual(0);
expect(tileRange.minY).toEqual(0);
expect(tileRange.maxX).toEqual(1);
expect(tileRange.maxY).toEqual(1);
tileRange = tileGrid.getTileRangeForExtentAndResolution(extent,
resolutions[2]);
expect(tileRange.minX).toEqual(0);
expect(tileRange.minY).toEqual(0);
expect(tileRange.maxX).toEqual(3);
expect(tileRange.maxY).toEqual(3);
tileRange = tileGrid.getTileRangeForExtentAndResolution(extent,
resolutions[3]);
expect(tileRange.minX).toEqual(0);
expect(tileRange.minY).toEqual(0);
expect(tileRange.maxX).toEqual(9);
expect(tileRange.maxY).toEqual(9);
});
});
describe('getTileRangeForExtentAndZ', function() {
it('returns the expected TileRange', function() {
var tileGrid = new ol.tilegrid.TileGrid({

View File

@@ -2,6 +2,20 @@ goog.provide('ol.test.TileRange');
describe('ol.TileRange', function() {
describe('constructor', function() {
it('creates a range', function() {
var range = new ol.TileRange(1, 2, 3, 4);
expect(range).toBeA(ol.TileRange);
});
it('can represent a range of one tile', function() {
var range = new ol.TileRange(2, 3, 2, 3);
expect(range).toBeA(ol.TileRange);
expect(range.getHeight()).toBe(1);
expect(range.getWidth()).toBe(1);
});
});
describe('contains', function() {
it('returns the expected value', function() {
var tileRange = new ol.TileRange(1, 1, 3, 3);
@@ -53,6 +67,36 @@ describe('ol.TileRange', function() {
});
});
describe('equals', function() {
it('determines equivalence of two ranges', function() {
var one = new ol.TileRange(0, 1, 2, 4);
var same = new ol.TileRange(0, 1, 2, 4);
var diff1 = new ol.TileRange(0, 1, 2, 5);
var diff2 = new ol.TileRange(0, 1, 3, 4);
var diff3 = new ol.TileRange(0, 2, 2, 4);
var diff4 = new ol.TileRange(1, 1, 2, 4);
expect(one.equals(same)).toBe(true);
expect(one.equals(diff1)).toBe(false);
expect(one.equals(diff2)).toBe(false);
expect(one.equals(diff3)).toBe(false);
expect(one.equals(diff4)).toBe(false);
});
});
describe('extent', function() {
it('modifies range so it includes another', function() {
var one = new ol.TileRange(0, 1, 2, 4);
var other = new ol.TileRange(-1, 10, -3, 12);
one.extend(other);
expect(one.minX).toBe(-1);
expect(one.minY).toBe(1);
expect(one.maxX).toBe(2);
expect(one.maxY).toBe(12);
});
});
describe('getSize', function() {
it('returns the expected size', function() {
var tileRange = new ol.TileRange(0, 1, 2, 4);
@@ -62,6 +106,29 @@ describe('ol.TileRange', function() {
});
});
describe('intersects', function() {
it('determines if two ranges overlap', function() {
var one = new ol.TileRange(0, 1, 2, 4);
var overlapsRight = new ol.TileRange(2, 1, 4, 4);
var overlapsLeft = new ol.TileRange(-3, 1, 0, 4);
var overlapsTop = new ol.TileRange(0, 4, 2, 5);
var overlapsBottom = new ol.TileRange(0, -3, 2, 1);
expect(one.intersects(overlapsLeft)).toBe(true);
expect(one.intersects(overlapsRight)).toBe(true);
expect(one.intersects(overlapsTop)).toBe(true);
expect(one.intersects(overlapsBottom)).toBe(true);
var right = new ol.TileRange(3, 1, 5, 4);
var left = new ol.TileRange(-3, 1, -1, 4);
var above = new ol.TileRange(0, 5, 2, 6);
var below = new ol.TileRange(0, -3, 2, 0);
expect(one.intersects(right)).toBe(false);
expect(one.intersects(left)).toBe(false);
expect(one.intersects(above)).toBe(false);
expect(one.intersects(below)).toBe(false);
});
});
});
goog.require('ol.TileRange');