我的任务是尝试查找给定的Shapefile中是否存在给定的纬度/经度(以度为单位,例如-50.55555,78.232222)。
我下载的Shapefile来自:https://www.census.gov/geo/maps-data/data/cbf/cbf_nation.html(它包含美国及其所有地区的形状文件)。
我正在寻找一种基于Java的解决方案,在给定随机生成的纬度/经度的情况下 - 确定该点是否位于美国境内。我发现一个有用的工具(但我是新手)是GeoTools。
所以有几个问题:
是否可以使用GeoTools来完成此要求(确定某些纬度/经度是否位于美国)?
如果GeoTools(或仅GeoTools)无法做到这一点,那么还有另一种方法可以为此找到一个java解决方案(不需要说谷歌地图等网络服务)。
还要注意:我下载了QGIS并使用mmqgis插件能够导出上面提到的Shapefile的所有形状文件内容(shape_id,lat,long)。也许我可以使用另一个Java库来读取这些形状并测试随机lat / long是否属于这些形状?
我对所有这些都是新手,请问任何/所有问题!非常感谢你。
答案 0 :(得分:2)
你可以通过多种方式做到这一点,但我会这样做:
private SimpleFeatureCollection features;
private ReferencedEnvelope env;
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;
}
然后读入你的shapefile并提取特征并在其上抛出点:
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 ");
}
}
}
完整的示例是here。