Как нарисовать линию, окружающую все полигоны в одном слое в GeoTools? - PullRequest
1 голос
/ 03 апреля 2019

Я написал некоторый код на Java с использованием библиотеки GeoTools (v.22), которая открывает шейп-файл, берет все полигоны в нем и делит их на разные FeatureCollections на основе значения, связанного с каждым; затем он создает слой для каждой коллекции FeatureCollection и добавляет его на карту, в результате чего все полигоны отделены друг от друга черным штрихом.

как я могу нарисовать другую цветную линию, окружающую все многоугольники в том же слое?

1 Ответ

1 голос
/ 03 апреля 2019

Вы ищете Вогнутый корпус ваших возможностей.Итак, сначала вам нужно получить GeometryCollection ваших функций.Затем вы можете вызвать реализацию Concave Hull Эрика Гроссо .

Так что-то вроде:

    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

whileпорог 1 дает:

enter image description here

...