使用Geotools从shapefile中提取多边形

4

我有一个shape文件(Sample.shp),还有两个其他文件(Sample.shx和Sample.dbf),其中定义了孟买15个邮政区域的几何图形(多边形)。

我能够使用Quickstart教程查看.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个邮政编码的几何形状转换为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

非常感谢您的帮助

2个回答

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
    }

要全面讨论查询数据存储的内容,请参见查询实验室


感谢您的回复。看起来这对我应该有效。我尝试了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)。有什么建议吗? - Manisha
尝试使用POINT(72.83 18.94) - 纬度/经度和x/y并不直观。 - Ian Turton
嘿,感谢您的解决方案。我只是将“THE_GEOM”更改为“the_geom”,然后它就起作用了。 - Manisha

0

我使用了上述解决方案并尝试了几种组合。只是将"THE_GEOM"改为小写,并按照经纬度的顺序排列点。

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的答案会很好。 - Leif Gruenwoldt
是的,我同意。但我想直接引导用户到确切的解决方案,我只能选择一个正确答案。希望你理解。 - Manisha
好的。我已编辑 iant 的答案以解决大小写敏感问题。 - Leif Gruenwoldt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接