Как создать открытую полилинию в GeoTools 12-RC1?

Мне нужно создать поток GeoJSON, содержащий данные о дорогах. Дороги похожи на многоугольники, за исключением того, что они открыты (начальная и конечная точки разные).

Я попытался использовать следующий код для достижения этой цели:

protected void addPolyLine(final double[] coords,
    final GeometryBuilder builder,
    final SimpleFeatureBuilder fbuilder,
    final List<SimpleFeature> features,
    final String id) {
    final double[] modcoords = new double[coords.length+2];
    for (int i=0; i < coords.length; i++) {
        modcoords[i] = coords[i];
    }
    modcoords[modcoords.length-2] = coords[0];
    modcoords[modcoords.length-1] = coords[1];
    final double[] holeStart = new double[] {coords[0], coords[1],
        coords[coords.length-2], coords[coords.length - 1]};
    final LinearRing shell = builder.linearRing(modcoords);
    final LinearRing hole = builder.linearRing(holeStart);

    final Polygon polygon = builder.polygon(shell, hole);

    fbuilder.add(polygon);
    final SimpleFeature feature = fbuilder.buildFeature(id);
    features.add(feature);
}

Не работает - получаю ошибку

java.lang.IllegalArgumentException: Invalid number of points in LinearRing (found 3 - must be 0 or >= 4)
    at com.vividsolutions.jts.geom.LinearRing.validateConstruction(LinearRing.java:114)
    at com.vividsolutions.jts.geom.LinearRing.<init>(LinearRing.java:106)
    at com.vividsolutions.jts.geom.GeometryFactory.createLinearRing(GeometryFactory.java:341)
    at org.geotools.geometry.jts.GeometryBuilder.linearRing(GeometryBuilder.java:199)

Когда я использую builder.lineString(coords), результирующий GeoJSON не содержит координат, как и должно быть.

Как создать полилинию (линию, соединяющую несколько точек и не замкнутую) с помощью GeoTools 12-RC1?

Обновление 1 (05.07.2015 21:22 МСК): Так я определяю типы объектов для точек, полигонов и линий. Точки и полигоны работают нормально, линии — нет.

private final static SimpleFeatureType POINT =
    createType("Test", "Location:Point");
private final static SimpleFeatureType POLYGON =
    createType("Test2", "Location:Polygon");
private final BuildingsReader buildingsReader =
    new DefaultBuildingsReader();
private final static SimpleFeatureType LINE =
    createType("Test3", "Line");    
private static SimpleFeatureType createType(final String x1, final String x2) {
    try
    {
        return DataUtilities.createType(x1, x2);
    }
    catch (final SchemaException exception) {
        exception.printStackTrace();
    }
    return null;
}

person Mentiflectax    schedule 04.07.2015    source источник


Ответы (1)


Вам нужно что-то сделать с createLineString например:

 line=builder.createLineString(Arrays.asList(coords));
 fbuilder.add(line);
 final SimpleFeature feature = fbuilder.buildFeature(id);
 features.add(feature);

Вам нужно будет изменить тип объекта, чтобы он представлял собой линию вместо полигона.

person Ian Turton    schedule 05.07.2015
comment
Объявление Вам нужно будет изменить тип объекта: Где я могу узнать, какой тип объекта соответствует линии? - person Mentiflectax; 05.07.2015
comment
Найдите место, где создается ваш SimpleFeatureBuilder, он должен иметь схему с типом геометрии. - person Ian Turton; 05.07.2015
comment
Смотрите мое обновление 1. Оно показывает, как я создаю файл SimpleFeatureBuilder. Типы для точек я взял из какого-то учебника в сети, для полигонов я просто угадал тип. Эти двое работают. Мое предположение о линиях нет. - person Mentiflectax; 05.07.2015
comment
Угадывание не поможет — попробуйте прочитать документацию (docs.geotools .org/stable/userguide/library/main/data.html) — вам нужна LineString, а не строка - person Ian Turton; 06.07.2015