private boolean isTileSet(long tileX, long tileY, int level) { long[] coverage = getGridCoverages()[level]; if (tileX < coverage[0] || tileX > coverage[2] || tileY < coverage[1] || tileY > coverage[3]) { return false; } /* * Use getRaster instead of getData(), getData() returns a copy */ final Raster raster = byLevelMasks[level].getRaster(); // Changing index to top left hand origin long rasx = tileX; long rasy = (raster.getHeight() - 1) - tileY; if (rasx < 0 || rasy < 0 || rasx >= raster.getWidth() || rasy >= raster.getHeight()) { // coverage might include meta tiling factors but raster doesn't! return false; } int sample = raster.getSample((int) rasx, (int) rasy, 0); return sample != noDataValue; } }
public boolean lookup(final long x, final long y, final int z) { long tileX = x; long tileY = y; int level = z; long[] coverage = getGridCoverages()[level]; if (tileX < coverage[0] || tileX > coverage[2] || tileY < coverage[1] || tileY > coverage[3]) { return false; } if (level > maxMaskLevel) { // downsample long[] requestedCoverage = fullCoverage[level]; long[] lastMaskedCoverage = fullCoverage[maxMaskLevel]; double requestedW = requestedCoverage[2] - requestedCoverage[0]; double requestedH = requestedCoverage[3] - requestedCoverage[1]; double availableW = lastMaskedCoverage[2] - lastMaskedCoverage[0]; double availableH = lastMaskedCoverage[3] - lastMaskedCoverage[1]; tileX = Math.round(tileX * (availableW / requestedW)); tileY = Math.round(tileY * (availableH / requestedH)); // tileX = Math.max(Math.min(tileX, lastMaskedCoverage[2]), lastMaskedCoverage[0]); // tileY = Math.max(Math.min(tileY, lastMaskedCoverage[3]), lastMaskedCoverage[1]); level = maxMaskLevel; } return isTileSet(tileX, tileY, level); }
/** */ public void testDiscontinuousTileRange() throws Exception { rasterMask = createMock(RasterMask.class); expect(rasterMask.getGridCoverages()).andReturn(gridCoverages); // mock up RasterMask to return TRUE only for tiles 0,0,0 and 1,1,1 expect(rasterMask.lookup(eq(0L), eq(0L), eq(0))).andReturn(Boolean.TRUE); expect(rasterMask.lookup(eq(0L), eq(0L), eq(1))).andReturn(Boolean.FALSE); expect(rasterMask.lookup(eq(1L), eq(0L), eq(1))).andReturn(Boolean.FALSE); expect(rasterMask.lookup(eq(0L), eq(1L), eq(1))).andReturn(Boolean.FALSE); expect(rasterMask.lookup(eq(1L), eq(1L), eq(1))).andReturn(Boolean.TRUE); replay(rasterMask); final int zoomStart = 0; final int zoomStop = 1; final int[] metaTilingFactors = {1, 1}; final int nThreads = 1; long tilesProcessed = traverseTileRangeIter( nThreads, gridCoverages, zoomStart, zoomStop, metaTilingFactors); final long expected = 2; assertEquals(expected, tilesProcessed); verify(rasterMask); }