/** {@inheritDoc} */ @Override public void setBin(int x, int y, T value) { if (x < 0 || x >= _definition.getXBins()) { throw new IllegalArgumentException("Bin x index is outside of tile's valid bin range"); } if (y < 0 || y >= _definition.getYBins()) { throw new IllegalArgumentException("Bin y index is outside of tile's valid bin range"); } if (!_data.containsKey(x)) _data.put(x, new HashMap<Integer, T>()); _data.get(x).put(y, value); }
/** {@inheritDoc} */ @Override public T getBin(int x, int y) { if (x < 0 || x >= _definition.getXBins()) { throw new IllegalArgumentException("Bin x index is outside of tile's valid bin range"); } if (y < 0 || y >= _definition.getYBins()) { throw new IllegalArgumentException("Bin y index is outside of tile's valid bin range"); } return _data.get(x + y * _definition.getXBins()); }
/** {@inheritDoc} */ @Override public void setBin(int x, int y, T value) { if (x < 0 || x >= _definition.getXBins()) { throw new IllegalArgumentException("Bin x index is outside of tile's valid bin range"); } if (y < 0 || y >= _definition.getYBins()) { throw new IllegalArgumentException("Bin y index is outside of tile's valid bin range"); } _data.set(x + y * _definition.getXBins(), value); }
@Override public void encodeJSON (JSONNode propertyNode, TileIndex value) throws JSONException { JSONObject result = new JSONObject(); result.put("level", value.getLevel()); result.put("xIndex", value.getX()); result.put("yIndex", value.getY()); result.put("xBinCount", value.getXBins()); result.put("yBinCount", value.getYBins()); propertyNode.setAsJSONObject(result); }
@Override public BinIndex rootToBin (double x, double y, TileIndex tile) { Point2D tileMercator = rootToTileMercator(x, y, tile.getLevel()); return new BinIndex((int) Math.floor((tileMercator.getX()-tile.getX())*tile.getXBins()), tile.getYBins()-1-(int) Math.floor((tileMercator.getY()-tile.getY())*tile.getYBins())); }
@Override public BinIndex rootToBin (Point2D point, TileIndex tile) { Point2D tileMercator = rootToTileMercator(point, tile.getLevel()); return new BinIndex((int) Math.floor((tileMercator.getX()-tile.getX())*tile.getXBins()), tile.getYBins()-1-(int) Math.floor((tileMercator.getY()-tile.getY())*tile.getYBins())); }
@Override public void setBin(int x, int y, List<T> value) { if (x < 0 || x >= getDefinition().getXBins()) { throw new IllegalArgumentException("Bin x index is outside of tile's valid bin range"); } if (y < 0 || y >= getDefinition().getYBins()) { throw new IllegalArgumentException("Bin y index is outside of tile's valid bin range"); } _base.setBin( x, y, value ); }
@Override public T getBin (int x, int y) { if (x < 0 || x >= getDefinition().getXBins()) { throw new IllegalArgumentException("Bin x index is outside of tile's valid bin range"); } if (y < 0 || y >= getDefinition().getYBins()) { throw new IllegalArgumentException("Bin y index is outside of tile's valid bin range"); } return _source.getBin(x + _xOffset, y + _yOffset); }
@Override public Rectangle2D getBinBounds(TileIndex tile, BinIndex bin) { long pow2 = 1L << tile.getLevel(); double tileXSize = (_maxX-_minX)/pow2; double tileYSize = (_maxY-_minY)/pow2; double binXSize = tileXSize/tile.getXBins(); double binYSize = tileYSize/tile.getYBins(); int adjustedBinY = tile.getYBins()-1-bin.getY(); return new Rectangle2D.Double(_minX+tileXSize*tile.getX()+binXSize*bin.getX(), _minY+tileYSize*tile.getY()+binYSize*adjustedBinY, binXSize, binYSize); }
@Override public void setBin(int x, int y, T value) { if (x < 0 || x >= getDefinition().getXBins()) { throw new IllegalArgumentException("Bin x index is outside of tile's valid bin range"); } if (y < 0 || y >= getDefinition().getYBins()) { throw new IllegalArgumentException("Bin y index is outside of tile's valid bin range"); } _source.setBin(x + _xOffset, y + _yOffset, value); }
public BinaryOperationTileView(TileData<List<T>> tileData1, TileData<List<T>> tileData2, BinaryOperator.OPERATOR_TYPE op, Number errorValue) { _errorValue = errorValue; _tileData1 = tileData1; _tileData2 = tileData2; _op = new BinaryOperator(op); if ( getDefinition().getXBins() != _tileData1.getDefinition().getXBins() || getDefinition().getYBins() != _tileData1.getDefinition().getYBins()) { throw new IllegalArgumentException("Constructor for BinaryOperationTileBucketView: " + "arguments are invalid. Tiles to compare are incompatible"); } }
private Point getBinCoordinates (double x, double y) { Point2D point = new Point2D.Double(x, y); TileIndex tile = _pyramid.rootToTile(point, _level); if (tile.getXBins() != _numXBins && tile.getYBins() != _numYBins) { tile = new TileIndex(tile.getLevel(), tile.getX(), tile.getY(), _numXBins, _numYBins); } BinIndex bin = _pyramid.rootToBin(point, tile); return new Point(tile.getX()*tile.getXBins()+bin.getX(), tile.getY()*tile.getYBins()+(tile.getYBins()-1-bin.getY())); }
private boolean isDense () { TileIndex index = getDefinition(); int nullBins = 0; int bins = 0; for (int x=0; x<index.getXBins(); ++x) { for (int y=0; y<index.getYBins(); ++y) { if (binNullForUs(_base.getBin(x, y))) ++nullBins; ++bins; } } return nullBins*2 < bins; }
@Override public Rectangle2D getBinBounds (TileIndex tile, BinIndex bin) { int level = tile.getLevel(); double binXInc = 1.0/tile.getXBins(); double baseX = tile.getX()+bin.getX()*binXInc; double binYInc = 1.0/tile.getYBins(); double baseY = tile.getY()+(tile.getYBins()-1-bin.getY())*binYInc; double north = tileToLat(baseY + binYInc, level); double south = tileToLat(baseY, level); double east = tileToLon(baseX + binXInc, level); double west = tileToLon(baseX, level); return new Rectangle2D.Double(west, south, east-west, north-south); }
/** * Get the tile one level up from a given tile. * @param child The tile from which to search * @return The tile one level up (lower level number) containing the child tile */ public static TileIndex getParent (TileIndex child) { return new TileIndex( child.getLevel() - 1, child.getX() / 2, child.getY() / 2, child.getXBins(), child.getYBins() ); }
private TileData<Double> createRandomTile () { TileIndex index = new TileIndex(0, 0, 0); TileData<Double> datum = new DenseTileData<>(index); for (int x=0; x<index.getXBins(); ++x) { for (int y=0; y<index.getYBins(); ++y) { datum.setBin(x, y, Math.random()); } } return datum; } private TileData<Double> addTiles (TileData<Double> a, TileData<Double> b) {
private TileData<Double> addTiles (TileData<Double> a, TileData<Double> b) { int xBins = a.getDefinition().getXBins(); int yBins = a.getDefinition().getYBins(); List<Double> dc = new ArrayList<>(); for (int y = 0; y < yBins; ++y) { for (int x = 0; x < xBins; ++x) { dc.add(a.getBin(x, y) + b.getBin(x, y)); } } return new DenseTileData<Double>(a.getDefinition(), dc); }
/** * Check if two (single-value-per-bin) tiles are equal */ public static <T> void assertTilesEqual (TileData<T> expected, TileData<T> actual) { Assert.assertEquals(expected.getDefinition(), actual.getDefinition()); int xN = expected.getDefinition().getXBins(); int yN = expected.getDefinition().getYBins(); for (int x=0; x<xN; ++x) { for (int y=0; y<yN; ++y) { Assert.assertEquals(expected.getBin(x, y), actual.getBin(x, y)); } } }
@Test public void testSimpleTwoLevels () { SubTileDataView<Integer> underTest = SubTileDataView.fromSourceAbsolute(source16, new TileIndex(2, 1, 1)); Assert.assertEquals(2, underTest.getDefinition().getLevel()); Assert.assertEquals(1, underTest.getDefinition().getX()); Assert.assertEquals(1, underTest.getDefinition().getY()); Assert.assertEquals(1, underTest.getDefinition().getXBins()); Assert.assertEquals(1, underTest.getDefinition().getYBins()); Assert.assertEquals(9, (int)underTest.getBin(0,0)); }
@Test public void testSimple () { SubTileDataView<Integer> underTest = SubTileDataView.fromSourceAbsolute(source16, new TileIndex(1, 1, 1)); Assert.assertEquals(1, underTest.getDefinition().getLevel()); Assert.assertEquals(1, underTest.getDefinition().getX()); Assert.assertEquals(1, underTest.getDefinition().getY()); Assert.assertEquals(2, underTest.getDefinition().getXBins()); Assert.assertEquals(2, underTest.getDefinition().getYBins()); Assert.assertEquals(2, (int)underTest.getBin(0,0)); Assert.assertEquals(7, (int)underTest.getBin(1,1)); }