public void xtestNullNaNHandling() throws Exception { // create a feature collection SimpleFeatureType ft = DataUtilities.createType("classification.nullnan", "id:0,foo:int,bar:double"); Integer iVal[] = new Integer[] { new Integer(0), new Integer(0), new Integer(0), new Integer(13), new Integer(13), new Integer(13), null, null, null }; Double dVal[] = new Double[] { new Double(0.0), new Double(50.01), null, new Double(0.0), new Double(50.01), null, new Double(0.0), new Double(50.01), null }; SimpleFeature[] testFeatures = new SimpleFeature[iVal.length]; for (int i = 0; i < iVal.length; i++) { testFeatures[i] = SimpleFeatureBuilder.build( ft, new Object[] { new Integer(i + 1), iVal[i], dVal[i], }, "nantest.t" + (i + 1)); } MemoryDataStore store = new MemoryDataStore(); store.createSchema(ft); store.addFeatures(testFeatures); FeatureCollection<SimpleFeatureType, SimpleFeature> thisFC = store.getFeatureSource("nullnan").getFeatures(); // create the expression Divide divide = ff.divide(ff.property("foo"), ff.property("bar")); QuantileFunction qf = (QuantileFunction) ff.function("Quantile", divide, ff.literal(3)); RangedClassifier range = (RangedClassifier) qf.evaluate(thisFC); assertEquals(2, range.getSize()); // 2 or 3? assertEquals("0..0", range.getTitle(0)); assertEquals("0..0.25995", range.getTitle(1)); }
public void testEvaluateWithExpressions() throws Exception { Literal classes = ff.literal(2); PropertyName exp = ff.property("foo"); Function func = ff.function("Quantile", exp, classes); Object value = func.evaluate(featureCollection); assertTrue(value instanceof RangedClassifier); RangedClassifier ranged = (RangedClassifier) value; // the values being quantiled are // {4,90,20,43,29,61,8,12}; // so there should be two groups: // {4, 8, 12, 20} 4 <= x < 29 // {29, 43, 61, 90} 29 <= x <= 90 assertEquals(2, ranged.getSize()); assertEquals("4..29", ranged.getTitle(0)); assertEquals("29..90", ranged.getTitle(1)); }
/** * Test a feature collection where each feature will be in it's own bin. * * <p>Creates a feature collection with five features 1-5. Then uses the quantile function to put * these features in 5 bins. Each bin should have a single feature. * * @throws Exception */ public void testSingleBin() throws Exception { // create a feature collection with five features values 1-5 SimpleFeatureType dataType = DataUtilities.createType("classification.test1", "id:0,value:int"); int iVal[] = new int[] {1, 2, 3, 4, 5}; SimpleFeature[] myfeatures = new SimpleFeature[iVal.length]; for (int i = 0; i < iVal.length; i++) { myfeatures[i] = SimpleFeatureBuilder.build( dataType, new Object[] {new Integer(i + 1), new Integer(iVal[i])}, "classification.test1" + (i + 1)); } MemoryDataStore store = new MemoryDataStore(); store.createSchema(dataType); store.addFeatures(myfeatures); FeatureCollection<SimpleFeatureType, SimpleFeature> myFeatureCollection = store.getFeatureSource("test1").getFeatures(); // run the quantile function org.opengis.filter.expression.Expression function = ff.function("Quantile", ff.property("value"), ff.literal(5)); Classifier classifier = (Classifier) function.evaluate(myFeatureCollection); // verify the results assertNotNull(classifier); assertEquals(classifier.getClass(), RangedClassifier.class); RangedClassifier range = (RangedClassifier) classifier; assertEquals(5, range.getSize()); for (int i = 0; i < 5; i++) { assertTrue(i + 1 == ((Number) range.getMin(i)).doubleValue()); if (i != 4) { assertTrue(i + 2 == ((Number) range.getMax(i)).doubleValue()); assertEquals((i + 1) + ".." + (i + 2), range.getTitle(i)); } else { assertTrue(i + 1 == ((Number) range.getMax(i)).doubleValue()); assertEquals((i + 1) + ".." + (i + 1), range.getTitle(i)); } } }