/** * Create a clone from this object. * * @return cloned tile code */ @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "CN_IDIOM_NO_SUPER_CALL", justification = "needed for GWT") public TileCode clone() { // NOSONAR super.clone() not supported by GWT return new TileCode(tileLevel, x, y); }
/** * Convert to readable string. * * @return readable string */ public String toString() { if (code == null) { return "[bounds=" + bounds + ",url=" + url + "]"; } return "[z=" + code.getTileLevel() + ",x=" + code.getX() + ",y=" + code.getY() + ",bounds=" + bounds + ",url=" + url + "]"; }
public VectorTilePresenter addTile(TileCode tileCode) { VectorTilePresenter tilePresenter = tiles.get(tileCode.toString()); if (tilePresenter == null) { tilePresenter = new VectorTilePresenter(commandService, this, tileCode.clone(), scale, crs, new TileLoadCallback()); nrLoadingTiles++; tiles.put(tileCode.toString(), tilePresenter); } return tilePresenter; }
/** * @param relativeUrl just the part with level/x/y.extension * @return */ public static TileCode parseTileCode(String relativeUrl) { TileCode tc = new TileCode(); StringTokenizer tokenizer = new StringTokenizer(relativeUrl, "/"); tc.setTileLevel(Integer.parseInt(tokenizer.nextToken())); tc.setX(Integer.parseInt(tokenizer.nextToken())); tc.setY(Integer.parseInt(tokenizer.nextToken().split("\\.")[0])); return tc; } }
private Bbox getPixelBounds(List<RasterTile> tiles) { Bbox bounds = null; int imageWidth = configurationService.getRasterLayerInfo(getLayerId()).getTileWidth(); int imageHeight = configurationService.getRasterLayerInfo(getLayerId()).getTileHeight(); for (RasterTile tile : tiles) { Bbox tileBounds = new Bbox(tile.getCode().getX() * imageWidth, tile.getCode().getY() * imageHeight, imageWidth, imageHeight); if (bounds == null) { bounds = new Bbox(tileBounds.getX(), tileBounds.getY(), tileBounds.getWidth(), tileBounds.getHeight()); } else { double minx = Math.min(tileBounds.getX(), bounds.getX()); double maxx = Math.max(tileBounds.getMaxX(), bounds.getMaxX()); double miny = Math.min(tileBounds.getY(), bounds.getY()); double maxy = Math.max(tileBounds.getMaxY(), bounds.getMaxY()); bounds = new Bbox(minx, miny, maxx - minx, maxy - miny); } } return bounds; }
@Override public List<RasterTile> getTiles(double scale, Bbox worldBounds) { List<TileCode> codes = tileService.getTileCodesForBounds(getViewPort(), tileConfig, worldBounds, scale); List<RasterTile> tiles = new ArrayList<RasterTile>(); if (!codes.isEmpty()) { double actualScale = viewPort.getZoomStrategy().getZoomStepScale(codes.get(0).getTileLevel()); for (TileCode code : codes) { Bbox bounds = tileService.getWorldBoundsForTile(getViewPort(), tileConfig, code); RasterTile tile = new RasterTile(getScreenBounds(actualScale, bounds), code.toString()); tile.setCode(code); tile.setUrl(wmsService.getMapUrl(getConfig(), getCrs(), bounds, tileConfig.getTileWidth(), tileConfig.getTileHeight())); tiles.add(tile); } } return tiles; }
private boolean isYIndexUp(List<RasterTile> tiles) { RasterTile first = tiles.iterator().next(); for (RasterTile tile : tiles) { if (tile.getCode().getY() > first.getCode().getY()) { return tile.getBounds().getY() > first.getBounds().getY(); } else if (tile.getCode().getY() < first.getCode().getY()) { return tile.getBounds().getY() < first.getBounds().getY(); } } return false; }
public VectorTilePresenter getTile(TileCode tileCode) { return tiles.get(tileCode.toString()); }
public void render(Bbox bounds) { if (layer.isShowing()) { List<TileCode> tilesForBounds = tileService.getTileCodesForBounds(layer.getViewPort(), layer.getTileConfig(), bounds, scale); for (TileCode tileCode : tilesForBounds) { if (!tiles.containsKey(tileCode.toString())) { RasterTile tile = createTile(tileCode); // Add the tile to the list and render it: tiles.put(tileCode.toString(), tile); nrLoadingTiles++; renderTile(tile, new ImageCounter()); } } } }
@Override public String buildUrl(TileCode tileCode, String baseTmsUrl) { StringBuilder builder = new StringBuilder(baseTmsUrl); if (!baseTmsUrl.endsWith("/")) { builder.append("/"); } builder.append(tileCode.getTileLevel()); builder.append("/"); builder.append(tileCode.getX()); builder.append("/"); builder.append(tileCode.getY()); builder.append(extension); return builder.toString(); }
codes.add(new TileCode(currentTileLevel, x, y));
@Override public void render(Bbox bbox) { // Only fetch when inside the layer bounds: if (BboxService.intersects(bbox, layerBounds) && vectorLayer.isShowing()) { // Find needed tile codes: List<TileCode> tempCodes = calcCodesForBounds(bbox); for (TileCode tileCode : tempCodes) { VectorTilePresenter tilePresenter = tiles.get(tileCode.toString()); if (tilePresenter == null) { // New tile tilePresenter = addTile(tileCode); tilePresenter.render(); } else if (tilePresenter.getSiblingStatus() == VectorTilePresenter.STATUS.EMPTY) { // Tile already exists, but the siblings have not yet been loaded: tilePresenter.renderSiblings(); } } } }
private static String buildUrl(TileCode tileCode, TileMap tileMap, String baseTmsUrl) { if (tileCode == null || tileMap == null || baseTmsUrl == null) { throw new IllegalArgumentException("All parameters are required"); } StringBuilder builder; // assuming they are ordered: TileSet tileSet = tileMap.getTileSets().getTileSets().get(tileCode.getTileLevel()); String href = tileSet.getHref(); if (href.startsWith("http://") || href.startsWith("https://")) { builder = new StringBuilder(href); if (!href.endsWith("/")) { builder.append("/"); } } else { builder = new StringBuilder(baseTmsUrl); if (!baseTmsUrl.endsWith("/")) { builder.append("/"); } builder.append(href); builder.append("/"); } builder.append(tileCode.getX()); builder.append("/"); builder.append(tileCode.getY()); builder.append("."); builder.append(tileMap.getTileFormat().getExtension()); return builder.toString(); }
@Override public TileCode getTileCodeForLocation(ViewPort viewPort, WmsTileConfiguration tileConfig, Coordinate location, double scale) { double actualScale = viewPort.getZoomStrategy().checkScale(scale, ZoomOption.LEVEL_CLOSEST); int tileLevel = viewPort.getZoomStrategy().getZoomStepIndex(actualScale); double resolution = 1 / actualScale; double worldTileWidth = tileConfig.getTileWidth() * resolution; double worldTileHeight = tileConfig.getTileHeight() * resolution; Coordinate tileOrigin = tileConfig.getTileOrigin(); int x = (int) Math.floor((location.getX() - tileOrigin.getX()) / worldTileWidth); int y = (int) Math.floor((location.getY() - tileOrigin.getY()) / worldTileHeight); return new TileCode(tileLevel, x, y); } }
private RasterTile createTile(TileCode tileCode) { Bbox worldBounds = tileService.getWorldBoundsForTile(layer.getViewPort(), layer.getTileConfig(), tileCode); RasterTile tile = new RasterTile(getScreenBounds(worldBounds), tileCode.toString()); tile.setCode(tileCode); tile.setUrl(wmsService.getMapUrl(layer.getConfig(), layer.getCrs(), worldBounds, layer.getTileConfig() .getTileWidth(), layer.getTileConfig().getTileHeight())); return tile; }
private Coordinate getTilePosition() { org.geomajas.geometry.Bbox layerBounds = renderer.getLayer().getLayerInfo().getMaxExtent(); // Calculate tile width and height for tileLevel=tileCode.getTileLevel(); This is in world space. double div = Math.pow(2, tileCode.getTileLevel()); double tileWidth = Math.ceil((scale * layerBounds.getWidth()) / div) / scale; double tileHeight = Math.ceil((scale * layerBounds.getHeight()) / div) / scale; // Now get the top-left corner for the tile in world space: double x = layerBounds.getX() + tileCode.getX() * tileWidth; double y = layerBounds.getY() + tileCode.getY() * tileHeight; // Convert to screen space. Note that the Y-axis is inverted, and so the top corner from the tile BBOX (world) // becomes the bottom corner (screen). That is why the tileHeight is added before compensating with the scale. x *= scale; y = -Math.round(scale * (y + tileHeight)); return new Coordinate(x, y); } }
codes.add(new TileCode(tileLevel, x, y));
@Override public Bbox getWorldBoundsForTile(ViewPort viewPort, WmsTileConfiguration tileConfig, TileCode tileCode) { double resolution = 1 / viewPort.getZoomStrategy().getZoomStepScale(tileCode.getTileLevel()); double worldTileWidth = tileConfig.getTileWidth() * resolution; double worldTileHeight = tileConfig.getTileHeight() * resolution; double x = tileConfig.getTileOrigin().getX() + tileCode.getX() * worldTileWidth; double y = tileConfig.getTileOrigin().getY() + tileCode.getY() * worldTileHeight; return new Bbox(x, y, worldTileWidth, worldTileHeight); }
image.setCode(new TileCode(zoomLevel, i, j)); image.setUrl(url); log.debug("adding image {}", image);