/* * Geotoolkit - An Open Source Java GIS Toolkit * http://www.geotoolkit.org * * (C) 2010-2013, Geomatys * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotoolkit.wcs.map; import java.awt.Dimension; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.URL; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.logging.Level; import javax.imageio.ImageIO; import org.geotoolkit.coverage.grid.GridCoverage2D; import org.geotoolkit.coverage.grid.GridCoverageBuilder; import org.geotoolkit.display.canvas.RenderingContext; import org.geotoolkit.display.VisitFilter; import org.geotoolkit.display.canvas.control.CanvasMonitor; import org.geotoolkit.display.PortrayalException; import org.geotoolkit.display.SearchArea; import org.geotoolkit.display.canvas.Canvas; import org.geotoolkit.display2d.GO2Utilities; import org.geotoolkit.display2d.canvas.J2DCanvas; import org.geotoolkit.display2d.canvas.RenderingContext2D; import org.geotoolkit.display2d.primitive.GraphicJ2D; import org.geotoolkit.map.GraphicBuilder; import org.geotoolkit.map.MapLayer; import org.opengis.display.primitive.Graphic; import org.opengis.geometry.Envelope; import org.opengis.referencing.crs.CoordinateReferenceSystem; /** * Render WCS layer in default geotoolkit rendering engine. * * @author Johann Sorel (Geomatys) * @module */ final class WCSGraphicBuilder implements GraphicBuilder<GraphicJ2D>{ /** * One instance for all WCS map layers. Object is concurrent. */ static final WCSGraphicBuilder INSTANCE = new WCSGraphicBuilder(); private WCSGraphicBuilder(){}; @Override public Collection<GraphicJ2D> createGraphics(final MapLayer layer, final Canvas canvas) { if(layer instanceof WCSMapLayer && canvas instanceof J2DCanvas){ return Collections.singleton((GraphicJ2D) new WCSGraphic((J2DCanvas)canvas, (WCSMapLayer)layer)); }else{ return Collections.emptyList(); } } @Override public Class<GraphicJ2D> getGraphicType() { return GraphicJ2D.class; } @Override public Image getLegend(final MapLayer layer) throws PortrayalException { //no legend in WCS specification return new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); } private static class WCSGraphic extends GraphicJ2D{ private final WCSMapLayer layer; private WCSGraphic(final J2DCanvas canvas, final WCSMapLayer layer){ super(canvas); this.layer = layer; } @Override public void paint(final RenderingContext2D context2D) { final CanvasMonitor monitor = context2D.getMonitor(); CoordinateReferenceSystem queryCrs = context2D.getObjectiveCRS2D(); Envelope env = context2D.getCanvasObjectiveBounds(); final Dimension dim = context2D.getCanvasDisplayBounds().getSize(); final URL url; try { url = layer.query(env, dim); } catch (Exception ex) { monitor.exceptionOccured(ex, Level.WARNING); return; } getLogger().log(Level.WARNING, "[WCSMapLayer] : GETCOVERAGE request : {0}", url); final BufferedImage image; try { image = ImageIO.read(url); } catch (IOException io) { monitor.exceptionOccured(new PortrayalException(io), Level.WARNING); return; } if (image == null) { monitor.exceptionOccured(new PortrayalException("WCS server did not return an image."), Level.WARNING); return; } final GridCoverageBuilder gc = new GridCoverageBuilder(); gc.setEnvelope(env); gc.setRenderedImage(image); final GridCoverage2D coverage = gc.getGridCoverage2D(); try { GO2Utilities.portray(context2D, coverage); } catch (PortrayalException ex) { monitor.exceptionOccured(ex, Level.WARNING); return; } } @Override public List<Graphic> getGraphicAt(final RenderingContext context, final SearchArea mask, final VisitFilter filter, final List<Graphic> graphics) { return graphics; } @Override public Object getUserObject() { return layer; } @Override public Envelope getEnvelope() { return layer.getBounds(); } } }