Объединение геометрий WKT через объединение в JTS

Я пытаюсь читать многоугольники WKT (сотни тысяч из них) и объединять их в более крупные, «содержащие» многоугольники, чтобы уменьшить размер данных. Для краткости я не упомянул цикл, который хотел бы использовать, поэтому два полигона должны служить примером.

Я никогда не работал с JTS, поэтому мой наивный подход таков:

static Geometry combineIntoOneGeometry()
{
       WKTReader wkt = new WKTReader();
       Geometry[] geometries;
       try
       {
              Geometry polygon1 = (Geometry) wkt.read("...");
              Geometry polygon2 = (Geometry) wkt.read("...");
              geometries = new Geometry[] {  }; //add them here ?
              geometries.add(polygon1, polygon2); //add doesn't exist, of course...
       }
       catch (ParseException e)
       {
              e.printStackTrace();
       }

       GeometryCollection gc = new GeometryFactory().createGeometryCollection(geometries); //can't instantiate GeometryFactory
       return gc.union();
}

Есть несколько проблем:

  1. Я не могу создать экземпляр GeometryCollection
  2. GeometryCollection, похоже, не имеет метода для принятия / добавления геометрии - как я могу «заполнить» GeometryCollection геометриями?
  3. Массив геометрий не может быть добавлен, и я не нашел способа сделать это через конструктор.
  4. Я не могу назвать союз по геометрии

Помимо вопроса: если некоторые из полигонов, которые я хочу объединить, будут разъединенными, приведет ли это к мультиполигону? Было бы хорошо, просто любопытно.

Спасибо !


person Hiro Protagonist    schedule 16.03.2017    source источник


Ответы (1)


Это работает для меня:

static Geometry combineIntoOneGeometry()
{
    WKTReader wkt = new WKTReader();
    GeometryFactory geoFac = new GeometryFactory();
    ArrayList<Geometry> geometries = new ArrayList<>();

    try
    {
        Geometry polygon1 = wkt.read("POLYGON ((...))");
        Geometry polygon2 = wkt.read("POLYGON ((...))");
        Geometry polygon3 = wkt.read("POLYGON ((...))");
        Geometry polygon4 = wkt.read("POLYGON ((...))");
        geometries.add(polygon1);
        geometries.add(polygon2);
        geometries.add(polygon3);
        geometries.add(polygon4);
    }
    catch (ParseException e)
    {
        e.printStackTrace();
    }
    GeometryCollection geometryCollection = (GeometryCollection) geoFac.buildGeometry(geometries);

    return geometryCollection.union();
}
person Hiro Protagonist    schedule 17.03.2017