@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(); }
/** * 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 + "]"; }
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(); }
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); } }
@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; }
@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); }