用于查找Shapefile中是否存在纬度/经度的Java解决方案

时间:2014-12-12 21:44:39

标签: java geocoding latitude-longitude geotools

我的任务是尝试查找给定的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是否属于这些形状?

我对所有这些都是新手,请问任何/所有问题!非常感谢你。

1 个答案:

答案 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