nodataConfigured ? configuredNoDataValues[0] : category.getRange().getMinimum(); double maximum = nodataConfigured ? configuredNoDataValues[0] : category.getRange().getMaximum(); if (Double.isNaN(minimum) && Double.isNaN(maximum)) { Class targetType = categories != null && !categories.isEmpty() ? categories.get(0).getRange().getElementClass() : Double.class; final NumberRange<?> dataRange = configuredRange.castTo(targetType); List<NumberRange<?>> newDataRanges = new ArrayList<>(); for (NumberRange<?> dr : dataRanges) { NumberRange<?>[] subtracted = dr.subtract(category.getRange()); for (NumberRange<?> range : subtracted) { if (!range.isEmpty()) {
Category cat = (Category) it.next(); if ((cat != null) && cat.getName().toString().equalsIgnoreCase("no data")) { double min = cat.getRange().getMinimum(); double max = cat.getRange().getMaximum(); writer.write("<value>" + min + "</value>\n"); if (min != max) writer.write("<value>" + max + "</value>\n");
/** * Returns a string representation of this category. The returned string is implementation * dependent. It is usually provided for debugging purposes. */ @Override public String toString() { final StringBuilder buffer = new StringBuilder(Classes.getShortClassName(this)); buffer.append("(\"").append(name).append("\":["); if (Classes.isInteger(getRange().getElementClass())) { buffer.append(Math.round(minimum)) .append("...") .append(Math.round(maximum)); // Inclusive } else { buffer.append(minimum).append(" ... ").append(maximum); // Inclusive } return buffer.append("])").toString(); }
static double getCandidateNoData(GridCoverage2D gc) { // no data management final GridSampleDimension sd = (GridSampleDimension) gc.getSampleDimension(0); final List<Category> categories = sd.getCategories(); final Iterator<Category> it = categories.iterator(); Category candidate; double inNoData = Double.NaN; final String noDataName = Vocabulary.format(VocabularyKeys.NODATA); while (it.hasNext()) { candidate = (Category) it.next(); final String name = candidate.getName().toString(); if (name.equalsIgnoreCase("No Data") || name.equalsIgnoreCase(noDataName)) { inNoData = candidate.getRange().getMaximum(); } } return inNoData; } }
/** * Returns the range of values in this category list. This is the union of the range of values * of every categories, excluding {@code NaN} values. A {@link NumberRange} object give more * informations than {@link org.opengis.CV_SampleDimension#getMinimum} and {@link * org.opengis.CV_SampleDimension#getMaximum} since it contains also the type (integer, float, * etc.) and inclusion/exclusion informations. * * @return The range of values. May be {@code null} if this category list has no quantitative * category. * @see Category#getRange */ public final NumberRange<?> getRange() { if (range == null) { NumberRange<?> range = null; for (int i = 0; i < categories.length; i++) { final NumberRange extent = categories[i].getRange(); if (!Double.isNaN(extent.getMinimum()) && !Double.isNaN(extent.getMaximum())) { if (range != null) { range = range.union(extent); } else { range = extent; } } } this.range = range; } return range; }
/** * Returns the quantitative category for a single {@linkplain GridSampleDimension sample * dimension} in the target {@linkplain GridCoverage2D grid coverage}. This method is invoked * automatically by the {@link #deriveSampleDimension deriveSampleDimension} method for each * band in the target image. The default implementation creates a default category from the * target range of values returned by {@link #deriveRange deriveRange}. * * @param categories The quantitative categories from every sources. For unary operations like, * this array has a length of 1. For binary operations like {@code "add"} and {@code * "multiply"}, this array has a length of 2. * @param parameters Parameters, rendering hints and coordinate reference system to use. * @return The quantitative category to use in the destination image, or {@code null} if * unknown. */ protected Category deriveCategory(final Category[] categories, final Parameters parameters) { final NumberRange[] ranges = new NumberRange[categories.length]; for (int i = 0; i < ranges.length; i++) { if (categories[i] == null) { continue; } ranges[i] = categories[i].getRange(); } final NumberRange range = deriveRange(ranges, parameters); if (range != null) { final Category category = categories[PRIMARY_SOURCE_INDEX]; return new Category(category.getName(), category.getColors(), range, true); } return null; }
if (lower != min || upper != max || !Classes.isInteger(category.getRange().getElementClass())) { throw new IllegalStateException( Errors.format(ErrorKeys.NON_INTEGER_CATEGORY));
for (Category category : categories) { if (category.getName().equals(NODATA)) { background[i] = category.getRange().getMinimum(); found = true; break;
Category category = categoryList.get(i); if (!category.isQuantitative()) { final NumberRange range = category.getRange(); final Comparable min = range.getMinValue(); final Comparable max = range.getMaxValue(); boolean maxIncluded = true; for (int i = categoryList.size(); --i >= 0; ) { final NumberRange range = categoryList.get(i).getRange(); final double min = range.getMinimum(); final double max = range.getMaximum();
for (Category cat : sd.getCategories()) { if (cat.getName().equals(NO_DATA)) { final NumberRange<? extends Number> catRange = cat.getRange(); if (!Double.isNaN(catRange.getMinimum())) { if (catRange.getMinimum() == catRange.getMaximum()) {
/** * Returns a string representation of this category. * The returned string is implementation dependent. * It is usually provided for debugging purposes. */ @Override public String toString() { final StringBuilder buffer = new StringBuilder(Classes.getShortClassName(this)); buffer.append("(\"").append(name).append("\":["); if (Double.isNaN(minimum) && Double.isNaN(maximum)) { buffer.append("NaN(").append(Math.round(inverse.minimum)) .append("...") .append(Math.round(inverse.maximum)).append(')'); } else { if (Classes.isInteger(getRange().getElementClass())) { buffer.append(Math.round(minimum)).append("...") .append(Math.round(maximum)); // Inclusive } else { buffer.append(minimum).append(" ... ") .append(maximum); // Inclusive } } return buffer.append("])").toString(); }
static double getCandidateNoData(GridCoverage2D gc) { // no data management final GridSampleDimension sd = (GridSampleDimension) gc .getSampleDimension(0); final List<Category> categories = sd.getCategories(); final Iterator<Category> it = categories.iterator(); Category candidate; double inNoData = Double.NaN; final String noDataName = Vocabulary.format(VocabularyKeys.NODATA); while (it.hasNext()) { candidate = (Category) it.next(); final String name = candidate.getName().toString(); if (name.equalsIgnoreCase("No Data") || name.equalsIgnoreCase(noDataName)) { inNoData = candidate.getRange().getMaximum(); } } return inNoData; }
static double getCandidateNoData(GridCoverage2D gc) { // no data management final GridSampleDimension sd = (GridSampleDimension) gc .getSampleDimension(0); final List categories = sd.getCategories(); final Iterator it = categories.iterator(); Category candidate; double inNoData = Double.NaN; final String noDataName = Vocabulary.format(VocabularyKeys.NODATA); while (it.hasNext()) { candidate = (Category) it.next(); final String name = candidate.getName().toString(); if (name.equalsIgnoreCase("No Data") || name.equalsIgnoreCase(noDataName)) { inNoData = candidate.getRange().getMaximum(); } } return inNoData; }
static double getCandidateNoData(GridCoverage gc) { // no data management final GridSampleDimension sd = (GridSampleDimension) gc .getSampleDimension(0); final List<Category> categories = sd.getCategories(); double inNoData = Double.NaN; if (categories != null) { Category candidate; final String noDataName = Vocabulary.format(VocabularyKeys.NODATA); for (Category category : categories) { candidate = category; final String name = candidate.getName().toString(); if (name.equalsIgnoreCase("No Data") || name.equalsIgnoreCase(noDataName)) { inNoData = candidate.getRange().getMaximum(); break; } } } return inNoData; } }
/** * Returns the quantitative category for a single {@linkplain GridSampleDimension sample dimension} * in the target {@linkplain GridCoverage2D grid coverage}. This method is invoked automatically * by the {@link #deriveSampleDimension deriveSampleDimension} method for each band in the * target image. The default implementation creates a default category from the target range * of values returned by {@link #deriveRange deriveRange}. * * @param categories The quantitative categories from every sources. For unary operations * like {@code "GradientMagnitude"}, this array has a length of 1. For binary * operations like {@code "add"} and {@code "multiply"}, this array has a length of 2. * @param parameters Parameters, rendering hints and coordinate reference system to use. * @return The quantitative category to use in the destination image, or {@code null} if unknown. */ protected Category deriveCategory(final Category[] categories, final Parameters parameters) { final NumberRange[] ranges = new NumberRange[categories.length]; for (int i=0; i<ranges.length; i++) { ranges[i] = categories[i].getRange(); } final NumberRange range = deriveRange(ranges, parameters); if (range != null) { final Category category = categories[PRIMARY_SOURCE_INDEX]; return new Category(category.getName(), category.getColors(), category.geophysics(false).getRange(), range).geophysics(true); } return null; }