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. The distance is planar * distance between to two closest sides. * * @see org.opengis.feature.simple.SimpleFeature * */ public class FeatureDistanceFn implements DistanceFn<SimpleFeature> { /** * */ private static final long serialVersionUID = 3824608959408031752L; private DistanceFn<Coordinate> coordinateDistanceFunction = new CoordinateCircleDistanceFn(); public FeatureDistanceFn() {} public FeatureDistanceFn( 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 ) { double dist = Double.MAX_VALUE; final Coordinate[] coords = new DistanceOp( getGeometry(x), getGeometry(y)).nearestPoints(); for (int i = 0; i < coords.length; i++) { for (int j = i + 1; j < coords.length; j++) { dist = Math.min( dist, coordinateDistanceFunction.measure( coords[j], coords[i])); } } return dist; } }