package org.geoserver.web.crs; import java.awt.image.RenderedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Locale; import javax.imageio.ImageIO; import org.apache.wicket.markup.html.WebResource; import org.apache.wicket.util.resource.IResourceStream; import org.apache.wicket.util.resource.ResourceStreamNotFoundException; import org.apache.wicket.util.value.ValueMap; import org.opengis.referencing.crs.CoordinateReferenceSystem; import com.vividsolutions.jts.geom.Envelope; /** * A wicket resource that acts as a mini WMS to generate a map for a * {@link CoordinateReferenceSystem CRS}'s area of validity. * <p> * This resource expects the following parameters in order to generate the area of validity map: * <ul> * <li>WIDTH * <li>HEIGHT * <li>BBOX * </ul> * </p> * * @author Gabriel Roldan */ public class DynamicCrsMapResource extends WebResource { private static final long serialVersionUID = 1L; private final CoordinateReferenceSystem crs; public DynamicCrsMapResource(CoordinateReferenceSystem crs) { this.crs = crs; } @Override public IResourceStream getResourceStream() { ValueMap parameters = getParameters(); int width = parameters.getInt("WIDTH", 400); int height = parameters.getInt("HEIGHT", 200); String bboxStr = parameters.getString("BBOX"); ByteArrayOutputStream output = null; if (bboxStr != null) { try { CRSAreaOfValidityMapBuilder builder = new CRSAreaOfValidityMapBuilder(width, height); Envelope envelope = parseEnvelope(bboxStr); RenderedImage image = builder.createMapFor(crs, envelope); output = new ByteArrayOutputStream(); ImageIO.write(image, "PNG", output); } catch (Exception e) { output = null; e.printStackTrace(); } } final byte[] byteArray = output == null ? null : output.toByteArray(); return new ByteArrayResourceStream(byteArray); } private Envelope parseEnvelope(String bboxStr) { String[] split = bboxStr.split(","); double minx = Double.valueOf(split[0]); double miny = Double.valueOf(split[1]); double maxx = Double.valueOf(split[2]); double maxy = Double.valueOf(split[3]); return new Envelope(minx, maxx, miny, maxy); } private static class ByteArrayResourceStream implements IResourceStream { private static final long serialVersionUID = 1L; private final byte[] content; public ByteArrayResourceStream(final byte[] content) { this.content = content; } public void setLocale(Locale arg0) { } public long length() { return content == null? 0 : content.length; } public Locale getLocale() { return null; } public InputStream getInputStream() throws ResourceStreamNotFoundException { if (content == null) { throw new ResourceStreamNotFoundException(); } return new ByteArrayInputStream(content); } public String getContentType() { return "image/png"; } public void close() throws IOException { } public org.apache.wicket.util.time.Time lastModifiedTime() { return null; } } }