Визуализация плиток OSM с использованием GTRenderer - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь отобразить плитки OSM с помощью GTRenderer следующим образом:

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);
        }
    }

Однако он возвращает изображение «белого пространства».

В то же время моя saveImage процедура прекрасно работает со слоями WMS. В чем может быть проблема этого?

Я также проверил мой сервис OSM по

Tile t = new OSMTile(
        new OSMTileIdentifier(79234, 40978, new WebMercatorZoomLevel(17), service.getName()),
        service);

BufferedImage image = t.loadImageTileImage(t);

Возвращает правильную плитку.

ИЗД.

Я также нашел следующее сообщение в журнале:

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

1 Ответ

0 голосов
/ 10 января 2019

Спасибо Иану Тертону за его комментарий об уровне масштабирования. Я установил точку остановки в методе рисования TileLayer (графика Graphics2D, карта MapContent, theViewport MapViewport) и обнаружил, что мой 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);

решает проблему.

...