import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.map.MapContent;
import org.geotools.ows.ServiceException;
import org.geotools.ows.wms.Layer;
import org.geotools.ows.wms.WMSCapabilities;
import org.geotools.ows.wms.WebMapServer;
import org.geotools.ows.wms.map.WMSLayer;
import org.geotools.referencing.CRS;
import org.geotools.renderer.lite.StreamingRenderer;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

public class WmsTest {
    public static void main(String[] args) throws IOException, ServiceException, FactoryException {
        Rectangle paintArea = new Rectangle(0, 0, 512, 512);
        CoordinateReferenceSystem crs = CRS.decode("<suitable epsg code here>");

        WebMapServer webMapServer = new WebMapServer(new URL("<some wms here>"));
        WMSCapabilities capabilities = webMapServer.getCapabilities();
        Layer layer = capabilities.getLayer();
        WMSLayer wmsLayer = new WMSLayer(webMapServer, layer);

        MapContent mapContent = new MapContent();
        mapContent.addLayer(wmsLayer);
        mapContent.getViewport().setScreenArea(paintArea);
        mapContent.getViewport().setMatchingAspectRatio(true);
        mapContent.getViewport().setCoordinateReferenceSystem(crs);
        mapContent.getViewport().setBounds(new ReferencedEnvelope(layer.getEnvelope(crs).toRectangle2D(), crs));

        BufferedImage image1 = new BufferedImage(paintArea.width, paintArea.height, BufferedImage.TYPE_4BYTE_ABGR);
        BufferedImage image2 = new BufferedImage(paintArea.width, paintArea.height, BufferedImage.TYPE_4BYTE_ABGR);

        StreamingRenderer renderer = new StreamingRenderer();
        renderer.setMapContent(mapContent);

        System.out.println("Begin 1");
        Graphics2D g1 = image1.createGraphics();
        renderer.paint(g1, paintArea, mapContent.getViewport().getBounds());
        g1.dispose();
        System.out.println("End 1");

        System.out.println("Begin 2");
        Graphics2D g2 = image2.createGraphics();
        renderer.paint(g2, paintArea, mapContent.getViewport().getBounds());
        g2.dispose();
        System.out.println("End 2");
    }
}
