/** * Set the timeDomain metadata in case the dimensionsHelper instance has a timeDimension * * @param helper * @throws IOException */ private void handleTimeMetadata(WCSDimensionsHelper helper) throws IOException { Utilities.ensureNonNull("helper", helper); final DimensionInfo timeDimension = helper.getTimeDimension(); if (timeDimension != null) { start(initStartMetadataTag(TAG.TIME_DOMAIN, null, timeDimension, helper)); final DimensionPresentation presentation = timeDimension.getPresentation(); final String id = helper.getCoverageId(); switch (presentation) { case CONTINUOUS_INTERVAL: encodeTimePeriod(helper.getBeginTime(), helper.getEndTime(), id + "_tp_0", null, null); break; case DISCRETE_INTERVAL: encodeTimePeriod( helper.getBeginTime(), helper.getEndTime(), id + "_tp_0", helper.getTimeResolutionUnit(), helper.getTimeResolutionValue()); break; default: // TODO: check if we are in the list of instants case, or in the list of periods case // list case final TreeSet<Object> domain = helper.getTimeDomain(); int i = 0; for (Object item : domain) { // gml:id is mandatory for time instant... if (item instanceof Date) { encodeDate((Date) item, helper, id + "_td_" + i); } else if (item instanceof DateRange) { encodeDateRange((DateRange) item, helper, id + "_td_" + i); } i++; } break; } end(TAG.TIME_DOMAIN); } }
/** * Initialize the metadata start tag for a custom dimension, setting dimension name, checking * for UOM, defaultValue, ... * * @param dimensionTag the TAG referring to type of dimension (Time, Elevation, Additional ,...) * @param name the name of the custom dimension * @param dimension the custom dimension {@link DimensionInfo} instance * @param helper the {@link WCSDimensionsHelper} instance used to parse default values * @return * @throws IOException */ private String initStartMetadataTag( final String dimensionTag, final String name, final DimensionInfo dimension, final WCSDimensionsHelper helper) throws IOException { final String uom = dimension.getUnitSymbol(); String defaultValue = null; String prolog = null; if (dimensionTag.equals(TAG.ADDITIONAL_DIMENSION)) { prolog = TAG.ADDITIONAL_DIMENSION + " name = \"" + name + "\""; defaultValue = helper.getDefaultValue(name); } else if (dimensionTag.equals(TAG.ELEVATION_DOMAIN)) { prolog = TAG.ELEVATION_DOMAIN; defaultValue = helper.getBeginElevation(); } else if (dimensionTag.equals(TAG.TIME_DOMAIN)) { prolog = TAG.TIME_DOMAIN; defaultValue = helper.getEndTime(); } return prolog + (uom != null ? (" uom=\"" + uom + "\"") : "") + (defaultValue != null ? (" default=\"" + defaultValue + "\"") : ""); }
/** * Encodes the boundedBy element * * <p>e.g.: * * <pre>{@code * <gml:boundedBy> * <gml:Envelope srsName="http://www.opengis.net/def/crs/EPSG/0/4326" axisLabels="Lat Long" uomLabels="deg deg" srsDimension="2"> * <gml:lowerCorner>1 1</gml:lowerCorner> * <gml:upperCorner>5 3</gml:upperCorner> * </gml:Envelope> * </gml:boundedBy> * }</pre> * * @param ci * @param gc2d * @param ePSGCode * @param axisSwap * @param srsName * @param axesNames * @param axisLabels * @throws IOException */ public void handleBoundedBy( final GeneralEnvelope envelope, boolean axisSwap, String srsName, String axisLabels, WCSDimensionsHelper dimensionHelper) throws IOException { final CoordinateReferenceSystem crs = envelope.getCoordinateReferenceSystem(); final CoordinateSystem cs = crs.getCoordinateSystem(); // TODO time String uomLabels = extractUoM(crs, cs.getAxis(axisSwap ? 1 : 0).getUnit()) + " " + extractUoM(crs, cs.getAxis(axisSwap ? 0 : 1).getUnit()); // time and elevation dimensions management boolean hasElevation = false; boolean hasTime = false; if (dimensionHelper != null) { if (dimensionHelper.getElevationDimension() != null) { uomLabels = uomLabels + " m"; // TODO: Check elevation uom hasElevation = true; } if (dimensionHelper.getTimeDimension() != null) { uomLabels = uomLabels + " s"; hasTime = true; } } final int srsDimension = cs.getDimension() + (hasElevation ? 1 : 0); // Setting up envelope bounds (including elevation) final String lower = new StringBuilder() .append(envelope.getLowerCorner().getOrdinate(axisSwap ? 1 : 0)) .append(" ") .append(envelope.getLowerCorner().getOrdinate(axisSwap ? 0 : 1)) .append(hasElevation ? " " + dimensionHelper.getBeginElevation() : "") .toString(); final String upper = new StringBuilder() .append(envelope.getUpperCorner().getOrdinate(axisSwap ? 1 : 0)) .append(" ") .append(envelope.getUpperCorner().getOrdinate(axisSwap ? 0 : 1)) .append(hasElevation ? " " + dimensionHelper.getEndElevation() : "") .toString(); // build the fragment final AttributesImpl envelopeAttrs = new AttributesImpl(); envelopeAttrs.addAttribute("", "srsName", "srsName", "", srsName); envelopeAttrs.addAttribute("", "axisLabels", "axisLabels", "", axisLabels); envelopeAttrs.addAttribute("", "uomLabels", "uomLabels", "", uomLabels); envelopeAttrs.addAttribute( "", "srsDimension", "srsDimension", "", String.valueOf(srsDimension)); start("gml:boundedBy"); String envelopeName; if (dimensionHelper != null && (hasTime || hasElevation)) { envelopeName = "gml:EnvelopeWithTimePeriod"; } else { envelopeName = "gml:Envelope"; } start(envelopeName, envelopeAttrs); element("gml:lowerCorner", lower); element("gml:upperCorner", upper); if (dimensionHelper != null && hasTime) { element("gml:beginPosition", dimensionHelper.getBeginTime()); element("gml:endPosition", dimensionHelper.getEndTime()); } end(envelopeName); end("gml:boundedBy"); }