package com.revolsys.geometry.test.function; import java.util.ArrayList; import java.util.List; import com.revolsys.geometry.model.Geometry; interface GeometryPredicate { boolean isTrue(Geometry geom); } public class SelectionFunctions { public static Geometry areaGreater(final Geometry a, final double minArea) { return select(a, new GeometryPredicate() { @Override public boolean isTrue(final Geometry g) { return g.getArea() > minArea; } }); } public static Geometry areaZero(final Geometry a) { return select(a, new GeometryPredicate() { @Override public boolean isTrue(final Geometry g) { return g.getArea() == 0.0; } }); } public static Geometry coveredBy(final Geometry a, final Geometry mask) { return select(a, new GeometryPredicate() { @Override public boolean isTrue(final Geometry g) { return g.coveredBy(mask); } }); } public static Geometry covers(final Geometry a, final Geometry mask) { return select(a, new GeometryPredicate() { @Override public boolean isTrue(final Geometry g) { return g.covers(mask); } }); } public static Geometry disjoint(final Geometry a, final Geometry mask) { final List selected = new ArrayList(); for (int i = 0; i < a.getGeometryCount(); i++) { final Geometry g = a.getGeometry(i); if (mask.disjoint(g)) { selected.add(g); } } return a.getGeometryFactory().buildGeometry(selected); } public static Geometry firstNComponents(final Geometry g, final int n) { final List comp = new ArrayList(); for (int i = 0; i < g.getGeometryCount() && i < n; i++) { comp.add(g.getGeometry(i)); } return g.getGeometryFactory().buildGeometry(comp); } public static Geometry intersects(final Geometry a, final Geometry mask) { return select(a, new GeometryPredicate() { @Override public boolean isTrue(final Geometry g) { return mask.intersects(g); } }); } public static Geometry invalid(final Geometry a) { final List selected = new ArrayList(); for (int i = 0; i < a.getGeometryCount(); i++) { final Geometry g = a.getGeometry(i); if (!g.isValid()) { selected.add(g); } } return a.getGeometryFactory().buildGeometry(selected); } private static Geometry select(final Geometry geom, final GeometryPredicate pred) { final List selected = new ArrayList(); for (int i = 0; i < geom.getGeometryCount(); i++) { final Geometry g = geom.getGeometry(i); if (pred.isTrue(g)) { selected.add(g); } } return geom.getGeometryFactory().buildGeometry(selected); } public static Geometry valid(final Geometry a) { final List selected = new ArrayList(); for (int i = 0; i < a.getGeometryCount(); i++) { final Geometry g = a.getGeometry(i); if (g.isValid()) { selected.add(g); } } return a.getGeometryFactory().buildGeometry(selected); } public static Geometry within(final Geometry a, final Geometry mask) { return select(a, new GeometryPredicate() { @Override public boolean isTrue(final Geometry g) { return g.within(mask); } }); } }