使用 GTRenderer 渲染 OSM 瓦片

Render OSM tiles using GTRenderer

我正在尝试以这种方式使用 GTRenderer 渲染 OSM 瓦片:

MapContent map = new MapContent();    
String baseURL = "http://<url>"; // OSM url
TileService service = new OSMService("OSM", baseURL);
TileLayer tileLayer = new TileLayer(service);
map.addLayer(tileLayer);

然后我将我的map发送给

public static void saveImage(final MapContent map,
                                 final String file,
                                 ReferencedEnvelope envelope,
                                 final int imageWidth,
                                 String formatName) {

        GTRenderer renderer = new StreamingRenderer();
        renderer.setMapContent(map);

        java.awt.Rectangle imageBounds = null;
        ReferencedEnvelope mapBounds = null;
        try {
            mapBounds = envelope;
            double heightToWidth = mapBounds.getSpan(1) / mapBounds.getSpan(0);
            imageBounds = new java.awt.Rectangle(
                    0, 0, imageWidth, (int) Math.round(imageWidth * heightToWidth));

        } catch (Exception e) {
            // failed to access map layers
            throw new RuntimeException(e);
        }

        BufferedImage image = new BufferedImage(imageBounds.width, imageBounds.height, BufferedImage.TYPE_INT_RGB);

        Graphics2D gr = image.createGraphics();
        gr.setPaint(Color.WHITE);
        gr.fill(imageBounds);

        try {
            renderer.paint(gr, imageBounds, mapBounds);
            File fileToSave = new File(file);
            ImageIO.write(image, formatName, fileToSave);

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

不过它 returns "white space" 图像。

同时,我的 saveImage 程序在 WMS 图层上运行良好。这可能是什么问题?

我还通过

检查了我的 OSM 服务
Tile t = new OSMTile(
        new OSMTileIdentifier(79234, 40978, new WebMercatorZoomLevel(17), service.getName()),
        service);

BufferedImage image = t.loadImageTileImage(t);

它 returns 正确的瓷砖。

已编辑

我还在日志中发现了以下信息:

[pool-2-thread-1] org.geotools.tile Reached tile limit of 128. Returning an empty collection.

感谢 Ian Turton 关于缩放级别的评论。 我在TileLayer的draw(Graphics2D graphics, MapContent map, MapViewport theViewport)方法中放置了stop-point,发现我的MapViewport不正确。 添加

// map is my MapContent object, envelope is a map's ReferencedEnvelope
imageBounds = new java.awt.Rectangle(
                0, 0, imageWidth, (int) Math.round(imageWidth * heightToWidth));
map.getViewport().setScreenArea(imageBounds);
map.getViewport().setBounds(envelope);

解决问题。