Skip to content

tilesToZoom #19

@morganherlocker

Description

@morganherlocker

Convert a set of tiles to a different zoom level.

Here's a stab at the code (assumes homogenous zoom level for input tiles):

function tilesToZoom(tiles, zoom) {
  var newTiles = zoomTiles(tiles, zoom);
  return newTiles;

  function zoomTiles(zoomedTiles) {
    if(zoomedTiles[0][2] === zoom){
      return zoomedTiles;
    } else if(zoomedTiles[0][2] < zoom){
      var oneIn = [];
      zoomedTiles.forEach(function(tile){
        oneIn = oneIn.concat(tilebelt.getChildren(tile));
      });
      return zoomTiles(oneIn);
    } else {
      var zoomedTiles = zoomedTiles.map(function(tile){
        var centroid =
          turf.centroid(
            turf.bboxPolygon(
              tilebelt.tileToBBOX(tile)
            )
          );
        return tilebelt.pointToTile(
          centroid.geometry.coordinates[0],
          centroid.geometry.coordinates[1], zoom);
      });
      return zoomedTiles;
    }
  }
}

Initial tests:

test('tilesToZoom', function(t){
  var zoomUp1 = tilesToZoom([[0,0,0]],1);
  t.equal(zoomUp1.length, 4);
  var zoomUp1HasTiles = true;
  [[0,0,1],[1,0,1],[0,1,1],[1,1,1]].forEach(function(tile){
    if(!tilebelt.hasTile(zoomUp1, tile)) hasTiles = false;
  });
  t.true(zoomUp1HasTiles, '0,0,0 zoomUp1 has tiles');

  var zoomUp2 = tilesToZoom([[0,0,0]],2);
  t.equal(zoomUp2.length, 16, 'zoom in 2x has 16 tiles');

  var zoomUp5 = tilesToZoom([[0,0,0]],5);
  t.equal(zoomUp5.length, 1024, 'zoom in 5x has 1024 tiles');

  var zoomUp8 = tilesToZoom([[0,0,0]],8);
  t.equal(zoomUp8.length, 65536, 'zoom in 5x has 65536 tiles');

  var zoomDown1 = tilesToZoom([[1,1,1]],0);
  t.equal(zoomDown1.length, 1, '[1,1,1] at zoom 0 has 1 tile');
  t.equal(zoomDown1.toString(), [0,0,0].toString(), '[1,1,1] zoomed out should be [0,0,0]');

  var zoomDown2 = tilesToZoom([[9372,12536,15]],13);
  t.equal(zoomDown2.length, 1, '[9372,12536,15] at zoom 13 has 1 tile');
  t.equal(zoomDown2.toString(), [2343,3134,13].toString(), 'expected tile');

  t.end();
});

cc @aaronlidman

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions