package mil.nga.giat.geowave.analytic.distance; import org.opengis.feature.simple.SimpleFeature; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.operation.distance.DistanceOp; /** * Calculate distance between two SimpleFeatures, assuming each has a Geometry. * * @see org.opengis.feature.simple.SimpleFeature * */ public class FeatureGeometryDistanceFn implements DistanceFn<SimpleFeature> { /** * */ private static final long serialVersionUID = 3824608959408031752L; private DistanceFn<Coordinate> coordinateDistanceFunction = new CoordinateCircleDistanceFn(); public FeatureGeometryDistanceFn() {} public FeatureGeometryDistanceFn( final DistanceFn<Coordinate> coordinateDistanceFunction ) { super(); this.coordinateDistanceFunction = coordinateDistanceFunction; } public DistanceFn<Coordinate> getCoordinateDistanceFunction() { return coordinateDistanceFunction; } public void setCoordinateDistanceFunction( final DistanceFn<Coordinate> coordinateDistanceFunction ) { this.coordinateDistanceFunction = coordinateDistanceFunction; } private Geometry getGeometry( final SimpleFeature x ) { for (final Object attr : x.getAttributes()) { if (attr instanceof Geometry) { return (Geometry) attr; } } return (Geometry) x.getDefaultGeometry(); } @Override public double measure( final SimpleFeature x, final SimpleFeature y ) { final Geometry xGeo = getGeometry(x); final Geometry yGeo = getGeometry(y); final DistanceOp op = new DistanceOp( xGeo, yGeo); Coordinate[] points = op.nearestPoints(); return coordinateDistanceFunction.measure( points[0], points[1]); } }