private boolean isRegular(Counters.Counter resol) { if (resol.getUnique() == 1) return true; // all same resolution, or n == 1 Comparable mode = resol.getMode(); Number modeNumber = (Number) mode; if (modeNumber == null || modeNumber.intValue() == 0) return false; int modeCount = 0; int nonModeCount = 0; for (Comparable value : resol.getValues()) { if (value.compareTo(mode) == 0) modeCount = resol.getCount(value); else { Number valueNumber = (Number) value; // non mode must be a multiple of mode - means there are some missing values int rem = (valueNumber.intValue() % modeNumber.intValue()); if (rem != 0) return false; int multiple = (valueNumber.intValue() / modeNumber.intValue()); nonModeCount += (multiple - 1) * resol.getCount(value); } } if (modeCount == 0) return true; // cant happen i think // only tolerate these many missing values double ratio = (nonModeCount / (double) modeCount); return ratio < missingTolerence; }
private void setSpacingFromPointValues() { assert (values.length == ncoords); this.startValue = values[0]; this.endValue = values[ncoords - 1]; this.resolution = (ncoords == 1) ? 0.0 : (endValue - startValue) / (ncoords - 1); if (ncoords == 1) { this.spacing = CoverageCoordAxis.Spacing.regularPoint; values = null; return; } this.resolution = (endValue - startValue) / (ncoords - 1); Counters.Counter resol = new Counters.Counter("resol"); for (int i = 0; i < values.length - 1; i++) { double diff = values[i + 1] - values[i]; resol.count(diff); } Comparable resolMode = resol.getMode(); if (resolMode != null) this.resolution = ((Number) resolMode).doubleValue(); boolean isRegular = isRegular(resol); this.spacing = isRegular ? CoverageCoordAxis.Spacing.regularPoint : CoverageCoordAxis.Spacing.irregularPoint; if (isRegular) values = null; }
Comparable resolMode = resol.getMode(); if (resolMode != null) { double modeValue = ((Number) resolMode).doubleValue();