如何在GeoTools的单个图层中围绕所有多边形绘制一条线?

时间:2019-04-03 08:56:39

标签: java geotools

我已经使用GeoTools(v.22)库用Java编写了一些代码,该库打开一个shapefile,获取其中的所有多边形,并根据与每个多边形相关的值将它们划分为不同的FeatureCollection。 然后,它为每个FeatureCollection创建一个图层并将其添加到地图中,从而导致所有多边形彼此之间被黑色笔划分开。

我如何在同一层中围绕所有多边形绘制另一条彩色线?

1 个答案:

答案 0 :(得分:1)

您正在寻找功能的Concave Hull。因此,首先您需要获得功能的GeometryCollection。然后,您可以致电Eric Grosso的Concave Hull implementation

类似这样:

    File f = new File("/home/ian/Data/states/states.shp");
    FileDataStore ds = FileDataStoreFinder.getDataStore(f);

    Filter filter = ECQL.toFilter("strEndsWith(\"STATE_NAME\",'a')=true");
    SimpleFeatureCollection collection = ds.getFeatureSource().getFeatures(filter);
    ArrayList<Geometry> geoms = new ArrayList<>();
    try (SimpleFeatureIterator it = collection.features()) {
      while (it.hasNext()) {
        SimpleFeature feature = it.next();
        Geometry geom = (Geometry) feature.getDefaultGeometry();

        geoms.add(geom);
      }
    }
    GeometryFactory gf = new GeometryFactory();
    GeometryCollection gc = gf.createGeometryCollection(geoms.toArray(new Geometry[] {}));
    gc = (GeometryCollection) Densifier.densify(gc, 5);
    double threshold = 10;
    ConcaveHull ch = new ConcaveHull(gc, threshold);
    Geometry concaveHull = ch.getConcaveHull();
    System.out.println(gc);
    System.out.println(concaveHull);

在这种情况下会生成以下地图:

enter image description here

阈值1给出:

enter image description here