package com.github.filosganga.geogson.model;
import static com.google.common.collect.Iterables.transform;
import com.github.filosganga.geogson.model.positions.AreaPositions;
import com.github.filosganga.geogson.model.positions.LinearPositions;
import com.google.common.base.Function;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableList;
/**
* Geometry composed by a collection of {@link LineString}.
*
* GeoJson reference: @see http://geojson.org/geojson-spec.html#multilinestring.
*
* eg: {@code
* MultiLineString mls = MultiLineString.of(
* LineString.of(Point.from(1,2), Point(2,2)),
* LineString.of(Point.from(2,3), Point(3,3))
* )
* }
*
* TODO Consider adding an abstract parent for this and Polygon.
*/
public class MultiLineString extends AbstractGeometry<AreaPositions> {
private static final long serialVersionUID = 1L;
public MultiLineString(AreaPositions positions) {
super(positions);
}
/**
* Creates a MultiLineString from the given LineStrings.
*
* @param lineStrings The {@link LineString} sequence.
* @return MultiLineString.
*/
public static MultiLineString of(LineString... lineStrings) {
return MultiLineString.of(ImmutableList.copyOf(lineStrings));
}
/**
* Creates a MultiLineString from the given LineStrings.
*
* @param lineStrings The Iterable of {@link LineString}.
* @return MultiLineString.
*/
public static MultiLineString of(Iterable<LineString> lineStrings) {
return new MultiLineString(new AreaPositions(transform(lineStrings, positionsFn(LinearPositions.class))));
}
@Override
public Type type() {
return Type.MULTI_LINE_STRING;
}
/**
* Converts to a {@link Polygon}.
*
* @throws IllegalArgumentException if this MultiLineString contains an open {@link LineString} or it is empty.
* @return Polygon
*/
public Polygon toPolygon() {
return new Polygon(positions());
}
/**
* Converts to a {@link MultiLineString}.
*
* @return this.
*/
public MultiLineString toMultiLineString() {
return new MultiLineString(positions());
}
/**
* Returns the {@link LineString} Iterable contained by this MultiLineString.
*
* @return Guava lazy {@code Iterable<LineString>}.
*/
public Iterable<LineString> lineStrings() {
return FluentIterable.from(positions().children())
.transform(new Function<LinearPositions, LineString>() {
@Override
public LineString apply(LinearPositions input) {
return new LineString(input);
}
});
}
}