【问题标题】:Extract polygons from shapefile using Geotools使用 Geotools 从 shapefile 中提取多边形
【发布时间】:2014-03-09 04:28:09
【问题描述】:

我有一个形状文件 (Sample.shp) 以及另外两个文件(Sample.shx 和 Sample.dbf),其中包含为 Bombay 的 15 个 pincode 定义的几何形状(多边形)。

我可以使用快速入门教程查看 .shp 文件。

    File file = JFileDataStoreChooser.showOpenFile("shp", null);
    if (file == null) {
        return;
    }

    FileDataStore store = FileDataStoreFinder.getDataStore(file);
    SimpleFeatureSource featureSource = store.getFeatureSource();

    // Create a map content and add our shapefile to it
    MapContent map = new MapContent();
    map.setTitle("Quickstart");

    Style style = SLD.createSimpleStyle(featureSource.getSchema());
    Layer layer = new FeatureLayer(featureSource, style);
    map.addLayer(layer);

    // Now display the map
    JMapFrame.showMap(map);

现在我想将这 15 个 pincode 的几何图形转换为 15 个 Geometry/Polygon 对象,以便我可以使用 Geometry.contains() 来查找某个点是否落在特定的 Geometry/Polygon 中。

我试过了:

ShapefileReader r = new ShapefileReader(new ShpFiles(file),true,false,geometryFactory);
System.out.println(r.getCount(0)); >> returns 51
System.out.println(r.hasNext()); >> returns false

非常感谢任何帮助

【问题讨论】:

    标签: shapefile geotools


    【解决方案1】:

    事实上,您不需要自己提取几何图形 - 只需创建一个过滤器并遍历过滤后的集合。在您的情况下,可能只会返回一个功能。

    Filter pointInPolygon = CQL.toFilter("CONTAINS(the_geom, POINT(1 2))");
    SimpleFeatureCollection features = source.getFeatures(filter);
    
        SimpleFeatureIterator iterator = features.features();
        try {
            while (iterator.hasNext()) {
                SimpleFeature feature = iterator.next();
                Geometry geom = (Geometry) feature.getDefaultGeometry();
               /*... do something here */
            }
        } finally {
            iterator.close(); // IMPORTANT
        }
    

    有关查询数据存储的完整讨论,请参阅Query Lab

    【讨论】:

    • 感谢您的回复。看起来这应该对我有用。我尝试了 featureSource.getFeatures().size() >> 15 (这是正确的,因为我有 15 个多边形)。但是当我做 Filter filter = CQL.toFilter("CONTAINS(THE_GEOM, POINT(72.83 18.94))");然后 featureSource.getFeatures(filter) >> NULL (这应该返回 1 的大小,因为该点位于其中一个多边形中)。谷歌坐标是 (18.94,72.83) 有什么建议吗?
    • 尝试 POINT(72.83 18.94) - lat/lon 和 x/y 不直观
    • 嘿,感谢您的解决方案。我刚刚将“THE_GEOM”更改为“the_geom”,它起作用了。
    【解决方案2】:

    我使用了上述解决方案并尝试了几种组合。刚刚将“THE_GEOM”改为小写,POINT 是有序的(Lon Lat)

    Filter filter = CQL.toFilter("CONTAINS(the_geom, POINT(72.82916 18.942883))");
    SimpleFeatureCollection collection=featureSource.getFeatures(filter);
    SimpleFeatureIterator iterator = collection.features();
    
            try {
                while (iterator.hasNext()) {
                    SimpleFeature feature = iterator.next();
                    .....
                }
            } finally {
                iterator.close(); // IMPORTANT
            }
    

    【讨论】:

    • 接受 iant 的回答会很好,因为您的更改非常小。
    • 是的,我同意。但我想引导用户找到确切的解决方案,我只能选择一个正确的答案。希望你理解
    • 好的。我已经编辑了iant 的答案以解决区分大小写的问题。
    猜你喜欢
    • 2018-03-18
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 2019-12-20
    • 2011-08-24
    • 2013-04-19
    相关资源
    最近更新 更多