/** * Compare two raw input values according to our pyramid scheme * * @return Standard comparison values, as per {@link Comparator} */ public int compareRaw (double x1, double y1, double x2, double y2) { TileIndex tile1 = _pyramid.rootToTile(x1, y1, _comparisonLevel); TileIndex tile2 = _pyramid.rootToTile(x2, y2, _comparisonLevel); return compareIndexAtLevel(tile1, tile2); }
private List<Double> readMetaMaxFromElasticsearch() { Rectangle2D bounds = tilePyramid.getBounds(); List<Double> maxCountList = new ArrayList<>(); double pixelsPerTile = 256.0; for ( int i = 0; i < this.numZoomlevels ; i++ ){ // calculated by dividing the entirety of the dataset bounds // by the number of pixels in a tile and the number of tiles at that Zoom level double tilesAtZoomLevel = Math.pow(2, i); double xInterval = bounds.getWidth() / (pixelsPerTile * tilesAtZoomLevel); double yInterval = bounds.getHeight() / (pixelsPerTile * tilesAtZoomLevel); if (xInterval < 1){ xInterval = 1; } if (yInterval < 1){ yInterval = 1; } // search ES based off the calculated interval double maxDocCount = searchForMaxBucketValue(xInterval, yInterval); maxCountList.add(i, maxDocCount); } while(maxCountList.size() < 15){ maxCountList.add(maxCountList.get(maxCountList.size()-1)*0.75); } return maxCountList; }
private void updatePyramidType () { _pyramid = null; try { String rawMetaData = _pyramidIO.readMetaData(_pyramidId); PyramidMetaData metaData = new PyramidMetaData(rawMetaData); _pyramid = metaData.getTilePyramid(); } catch (Exception e) { LOGGER.log(Level.WARNING, "Error getting level metadata for " + _pyramidId); } if (null == _pyramid) { _pyramidField.setSelectedIndex(-1); _pyramidDesc.setText(""); } else if (_pyramid instanceof WebMercatorTilePyramid) { _pyramidField.setSelectedItem(PyramidEnum.Geographic); _pyramidDesc.setText(""); } else if (_pyramid instanceof AOITilePyramid) { _pyramidField.setSelectedItem(PyramidEnum.AreaOfInterest); Rectangle2D bounds = _pyramid.getTileBounds(new TileIndex(0, 0, 0)); _pyramidDesc.setText(String.format("bounds: [%.4f, %.4f] to [%.4f, %.4f]", bounds.getMinX(), bounds.getMinY(), bounds.getMaxX(), bounds.getMaxY())); } } private void updateAvailableCoordinates () {
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 Map<Integer, Map> parseAggregations(Histogram date_agg, TileIndex tileIndex) { List<? extends Histogram.Bucket> dateBuckets = date_agg.getBuckets(); Map<Integer, Map> result = new HashMap<>(); long maxval = 0; for (Histogram.Bucket dateBucket : dateBuckets) { Histogram cluster_agg = dateBucket.getAggregations().get("yField"); List<? extends Histogram.Bucket> clusterBuckets = cluster_agg.getBuckets(); BinIndex xBinIndex = tilePyramid.rootToBin(dateBucket.getKeyAsNumber().doubleValue(), 0, tileIndex); int xBin = xBinIndex.getX(); Map<Integer,Long> intermediate = new HashMap<>(); result.put(xBin, intermediate); for( Histogram.Bucket clusterBucket : clusterBuckets) { //given the bin coordinates, see if there's any data in those bins, add values to existing bins BinIndex binIndex = tilePyramid.rootToBin(dateBucket.getKeyAsNumber().doubleValue(), clusterBucket.getKeyAsNumber().doubleValue(), tileIndex); int yBin = binIndex.getY(); if (result.containsKey(xBin) && result.get(xBin).containsKey(yBin)) { intermediate.put(yBin, (long) intermediate.get(yBin) + clusterBucket.getDocCount()); } else if (result.containsKey(xBin) && !(intermediate.containsKey(yBin))) { intermediate.put(yBin, clusterBucket.getDocCount()); } if (maxval < clusterBucket.getDocCount()){ maxval = clusterBucket.getDocCount(); } } } return result; }
private Point2D getBinCenter (TilePyramid binner, int level, int tileX, int tileY, int binX, int binY) { TileIndex tile = new TileIndex(level, tileX, tileY); BinIndex bin = new BinIndex(binX, binY); Rectangle2D area = binner.getBinBounds(tile, bin); return new Point2D.Double(area.getCenterX(), area.getCenterY()); }
@Override public List<TileAndBinIndices> getIndicesByLevel( AnnotationData<?> data, int level, TilePyramid pyramid ) { List<TileAndBinIndices> tileAndBins = new LinkedList<>(); if ( !data.isRangeBased() ) { // point annotation Double x = ( data.getX() == null ) ? 0 : data.getX(); Double y = ( data.getY() == null ) ? 0 : data.getY(); // map from x and y to tile and bin TileIndex tile = pyramid.rootToTile( x, y, level, NUM_BINS, NUM_BINS ); BinIndex bin = pyramid.rootToBin( x, y, tile ); tileAndBins.add( new TileAndBinIndices( tile, bin ) ); return tileAndBins; } else { // range annotations Double x0 = ( data.getX0() == null ) ? 0 : data.getX0(); Double y0 = ( data.getY0() == null ) ? 0 : data.getY0(); Double x1 = ( data.getX1() == null ) ? 0 : data.getX1(); Double y1 = ( data.getY1() == null ) ? 0 : data.getY1(); // bottom left TileIndex tileBL = pyramid.rootToTile(x0, y0, level, NUM_BINS, NUM_BINS); // top right TileIndex tileTR = pyramid.rootToTile( x1, y1, level, NUM_BINS, NUM_BINS ); for (int i=tileBL.getX(); i<=tileTR.getX(); i++) { for (int j=tileBL.getY(); j <= tileTR.getY(); j++) { tileAndBins.add( new TileAndBinIndices( new TileIndex(level, i, j, NUM_BINS, NUM_BINS ), RANGE_BIN ) ); } } } return tileAndBins; }
/** * Compare two raw input values according to our pyramid scheme * * @return Standard comparison values, as per {@link Comparator} */ public int compareRaw (Point2D pt1, Point2D pt2) { // Mostly taken from http://en.wikipedia.org/wiki/Z-order_curve, but // this is a very simple 2-dimensional case, so the results are rather // simplified. TileIndex tile1 = _pyramid.rootToTile(pt1, _comparisonLevel); TileIndex tile2 = _pyramid.rootToTile(pt2, _comparisonLevel); return compareIndexAtLevel(tile1, tile2); }
private void updatePyramidType () { _pyramid = null; try { String rawMetaData = _pyramidIO.readMetaData(_pyramidId); PyramidMetaData metaData = new PyramidMetaData(rawMetaData); _pyramid = metaData.getTilePyramid(); } catch (Exception e) { LOGGER.log(Level.WARNING, "Error getting level metadata for " + _pyramidId); } if (null == _pyramid) { _pyramidField.setSelectedIndex(-1); _pyramidDesc.setText(""); } else if (_pyramid instanceof WebMercatorTilePyramid) { _pyramidField.setSelectedItem(PyramidEnum.Geographic); _pyramidDesc.setText(""); } else if (_pyramid instanceof AOITilePyramid) { _pyramidField.setSelectedItem(PyramidEnum.AreaOfInterest); Rectangle2D bounds = _pyramid.getTileBounds(new TileIndex(0, 0, 0)); _pyramidDesc.setText(String.format("bounds: [%.4f, %.4f] to [%.4f, %.4f]", bounds.getMinX(), bounds.getMinY(), bounds.getMaxX(), bounds.getMaxY())); } } private void updateAvailableCoordinates () {
@Override public String readMetaData(String pyramidId) throws IOException { Rectangle2D bounds = tilePyramid.getBounds(); try {
private Point getTileCoordinates (double x, double y) { Point2D point = new Point2D.Double(x, y); TileIndex tile = _pyramid.rootToTile(point, _level); return new Point(tile.getX(), tile.getY()); }
@Override public <T> List<TileData<T>> readTiles(String pyramidId, TileSerializer<T> serializer, Iterable<TileIndex> tiles, JSONObject properties) throws IOException{ List<TileData<T>> results = new LinkedList<TileData<T>>(); // iterate over the tile indices for (TileIndex tileIndex: tiles) { Rectangle2D rect = tilePyramid.getTileBounds(tileIndex); // get minimum/start time, max/end time double startX = rect.getX(); double endX = rect.getMaxX(); double startY = rect.getMaxY(); double endY = rect.getY(); SearchResponse sr = timeFilteredRequest(startX, endX, startY, endY, properties); if (responseHasData(sr)) { Histogram date_agg = sr.getAggregations().get("xField"); Map<Integer, Map> tileMap = parseAggregations(date_agg, tileIndex); SparseTileData tileData = new SparseTileData(tileIndex,tileMap, 0); results.add(tileData); } } return results; }
TileIndex index = _pyramid.rootToTile(rawX, rawY, _comparisonLevel); long x = index.getX(); long y = index.getY();
int order1 = _order.get(y1).get(x1); Point2D point1 = _points.get(y1).get(x1); TileIndex index1 = _pyramid.rootToTile(point1, L1); int order2 = _order.get(y2).get(x2); Point2D point2 = _points.get(y2).get(x2); TileIndex index2 = _pyramid.rootToTile(point2, L2); TileIndex index1AtLevel2 = _pyramid.rootToTile(point1, L2); TileIndex index2AtLevel1 = _pyramid.rootToTile(point2, L1);