private Point2D rootToTileMercator (Point2D point, int level) { return rootToTileMercator(point.getX(), point.getY(), level); }
@Override public TileIndex rootToTile (Point2D point, int level, int xBins, int yBins) { Point2D tileMercator = rootToTileMercator(point, level); return new TileIndex(level, (int) Math.floor(tileMercator.getX()), (int) Math.floor(tileMercator.getY()), xBins, yBins); }
@Override public TileIndex rootToTile (double x, double y, int level, int xBins, int yBins) { Point2D tileMercator = rootToTileMercator(x, y, level); return new TileIndex(level, (int) Math.floor(tileMercator.getX()), (int) Math.floor(tileMercator.getY()), yBins, xBins); }
@Override public double getBinOverlap (TileIndex tile, BinIndex bin, Rectangle2D area) { Point2D lowerLeftRoot = new Point2D.Double(area.getMinX(), area.getMinY()); Point2D lowerLeftMercator = rootToTileMercator(lowerLeftRoot, tile.getLevel()); double left = (lowerLeftMercator.getX()-tile.getX())*tile.getXBins()-bin.getX(); double bottom = (tile.getYBins()-1) - (lowerLeftMercator.getY()-tile.getY())*tile.getYBins() - bin.getY(); Point2D upperRightRoot = new Point2D.Double(area.getMaxX(), area.getMaxY()); Point2D upperRightMercator = rootToTileMercator(upperRightRoot, tile.getLevel()); double right = (upperRightMercator.getX()-tile.getX())*tile.getXBins()-bin.getX(); double top = (tile.getYBins()-1) - (upperRightMercator.getY() - tile.getY())*tile.getYBins() - bin.getY(); // Top and bottom actually reversed, but since we take absolute values, it doesn't really matter. left = Math.min(Math.max(left, 0.0), 1.0); right = Math.min(Math.max(right, 0.0), 1.0); top = Math.min(Math.max(top, -1.0), 0.0); bottom = Math.min(Math.max(bottom, -1.0), 0.0); return Math.abs((right-left) * (top-bottom)); }
@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 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())); }