package org.geoserver.wcs2_0; import java.io.IOException; import java.util.Arrays; import javax.xml.datatype.XMLGregorianCalendar; import net.opengis.ows11.BoundingBoxType; import net.opengis.ows11.CodeType; import net.opengis.ows11.Ows11Factory; import net.opengis.wcs11.DomainSubsetType; import net.opengis.wcs11.OutputType; import net.opengis.wcs11.TimeSequenceType; import net.opengis.wcs11.Wcs11Factory; import net.opengis.wcs20.DimensionSliceType; import net.opengis.wcs20.DimensionTrimType; import net.opengis.wcs20.GetCoverageType; import net.opengis.wcs20.Wcs20Factory; import org.geotools.wcs.v2_0.WCS; import org.geotools.wcs.v2_0.WCSConfiguration; import org.geotools.xml.Encoder; /** * A simple helper class to build WCS 1.1.1 and WCS 2.0 requests. * */ public class WCS2GetCoverageRequestBuilder { private GetCoverageType getCoverageType; private net.opengis.wcs11.GetCoverageType wcs111GetCoverage; private WCS2GetCoverageRequestBuilder(){ getCoverageType = Wcs20Factory.eINSTANCE.createGetCoverageType(); wcs111GetCoverage = Wcs11Factory.eINSTANCE.createGetCoverageType(); wcs111GetCoverage.setVersion("1.1.1"); OutputType outputType = Wcs11Factory.eINSTANCE.createOutputType(); outputType.setFormat("image/tiff"); wcs111GetCoverage.setOutput(outputType); getCoverageType.setVersion("2.0.0"); getCoverageType.setFormat("image/tiff"); } /** * Sets the id of the coverage to request. * @param coverageId A coverage id * * @return this builder */ public WCS2GetCoverageRequestBuilder coverageId(String coverageId){ getCoverageType.setCoverageId(coverageId); CodeType codeType = Ows11Factory.eINSTANCE.createCodeType(); codeType.setValue(coverageId); wcs111GetCoverage.setIdentifier(codeType); return this; } /** * Request only a given date, currently fails for WCS 1.1.1 * @param date * @return this builder */ public WCS2GetCoverageRequestBuilder date(XMLGregorianCalendar date){ DimensionSliceType dimensionTrim = Wcs20Factory.eINSTANCE.createDimensionSliceType(); dimensionTrim.setSlicePoint(date.toXMLFormat()); dimensionTrim.setDimension("time"); dimensionTrim.setCRS("http://www.opengis.net/def/trs/ISO-8601/0/Gregorian UTC"); getCoverageType.getDimensionSubset().add(dimensionTrim); TimeSequenceType timeSequenceType = Wcs11Factory.eINSTANCE.createTimeSequenceType(); timeSequenceType.getTimePosition().add(date); //TODO the encoder throws an exception on this one //getWCS11DomainSubset().setTemporalSubset(timeSequenceType); return this; } /** * Sets a lat/lon bounding box. * @param minLat * @param maxLat * @param minLon * @param maxLon * */ public WCS2GetCoverageRequestBuilder bbox(double minLon,double maxLon,double minLat, double maxLat){ DimensionTrimType latTrim = Wcs20Factory.eINSTANCE.createDimensionTrimType(); latTrim.setCRS("http://www.opengis.net/def/crs/EPSG/0/4326"); latTrim.setTrimLow(minLat+""); latTrim.setTrimHigh(maxLat+""); latTrim.setDimension("Lat"); getCoverageType.getDimensionSubset().add(latTrim); DimensionTrimType lonTrim = Wcs20Factory.eINSTANCE.createDimensionTrimType(); lonTrim.setCRS("http://www.opengis.net/def/crs/EPSG/0/4326"); lonTrim.setTrimLow(minLon+""); lonTrim.setTrimHigh(maxLon+""); lonTrim.setDimension("Long"); getCoverageType.getDimensionSubset().add(lonTrim); DomainSubsetType domainSubset = getWCS11DomainSubset(); BoundingBoxType boundingbox = Ows11Factory.eINSTANCE.createBoundingBoxType(); boundingbox.setCrs("http://www.opengis.net/def/crs/EPSG/0/4326"); boundingbox.setLowerCorner(Arrays.asList(minLat,minLon)); boundingbox.setUpperCorner(Arrays.asList(maxLat,maxLon)); domainSubset.setBoundingBox(boundingbox); return this; } private DomainSubsetType getWCS11DomainSubset() { DomainSubsetType domainSubset = wcs111GetCoverage.getDomainSubset(); if(domainSubset==null){ domainSubset = Wcs11Factory.eINSTANCE.createDomainSubsetType(); wcs111GetCoverage.setDomainSubset(domainSubset); } return domainSubset; } /** * Returns the xml encoding of the created request. * @param version * * @throws IOException */ public String asXML(String version) throws IOException{ if("1.1.1".equals(version)){ Encoder encoder = new Encoder(new org.geotools.wcs.v1_1.WCSConfiguration()); encoder.setIndenting(true); encoder.setOmitXMLDeclaration(true); //prefix is set to 'null' if we don't declare it explicitly encoder.getNamespaces().declarePrefix("ows", "http://www.opengis.net/ows/1.1"); return encoder.encodeAsString(wcs111GetCoverage, org.geotools.wcs.v1_1.WCS.GetCoverage); }else{ Encoder encoder = new Encoder(new WCSConfiguration()); encoder.setIndenting(true); encoder.setOmitXMLDeclaration(true); return encoder.encodeAsString(getCoverageType, WCS.GetCoverage); } } /** * Create a new builder * @return a new builder */ public static WCS2GetCoverageRequestBuilder newBuilder(){ return new WCS2GetCoverageRequestBuilder(); } }