package org.ianturton.cookbook.filters;
import java.io.File;
import java.io.IOException;
import org.geotools.data.FileDataStore;
import org.geotools.data.FileDataStoreFinder;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.data.simple.SimpleFeatureSource;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.factory.GeoTools;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.swing.data.JFileDataStoreChooser;
import org.opengis.filter.Filter;
import org.opengis.filter.FilterFactory2;
import org.opengis.filter.expression.Expression;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.Point;
public class PointInPolygon {
FilterFactory2 filterFactory;
private SimpleFeatureCollection features;
private ReferencedEnvelope env;
public static void main(String[] args) throws IOException {
File file = null;
if (args.length == 0) {
// display a data store file chooser dialog for shapefiles
file = JFileDataStoreChooser.showOpenFile("shp", null);
if (file == null) {
return;
}
} else {
file = new File(args[0]);
if (!file.exists()) {
System.err.println(file + " doesn't exist");
return;
}
}
PointInPolygon tester = new PointInPolygon();
FileDataStore store = FileDataStoreFinder.getDataStore(file);
SimpleFeatureSource featureSource = store.getFeatureSource();
tester.setFeatures(featureSource.getFeatures());
GeometryFactory fac = new GeometryFactory();
for (int i = 0; i < 1000; i++) {
double lat = (Math.random() * 180.0) - 90.0;
double lon = (Math.random() * 360.0) - 180.0;
Point p = fac.createPoint(new Coordinate(lat, lon));
boolean flag = tester.isInShape(p);
if (flag) {
System.out.println(p + " is in States ");
}
}
}
public PointInPolygon() {
filterFactory = CommonFactoryFinder.getFilterFactory2(GeoTools
.getDefaultHints());
}
private boolean isInShape(Point p) {
if (!env.contains(p.getCoordinate())) {
return false;
}
Expression propertyName = filterFactory.property(features.getSchema()
.getGeometryDescriptor().getName());
Filter filter = filterFactory.contains(propertyName,
filterFactory.literal(p));
SimpleFeatureCollection sub = features.subCollection(filter);
if (sub.size() > 0) {
return true;
}
return false;
}
private void setFeatures(SimpleFeatureCollection features) {
this.features = features;
env = features.getBounds();
}
}