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:
@@ -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({
|
||||
|
||||
@@ -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');
|
||||
|
||||
Reference in New Issue
Block a user