/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2014, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotools.geometry.jts;
import java.util.List;
import com.vividsolutions.jts.geom.CoordinateSequence;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.MultiLineString;
/**
* A subclass of multi line string that can host also curves and will linearize if needed
*
* @author Andrea Aime - GeoSolutions
*/
public class MultiCurve extends MultiLineString implements MultiCurvedGeometry<MultiLineString> {
private static final long serialVersionUID = -5796254063449438787L;
double tolerance;
public MultiCurve(List<LineString> components, GeometryFactory factory, double tolerance) {
super(components.toArray(new LineString[components.size()]), factory);
this.tolerance = tolerance;
}
public MultiLineString linearize() {
return linearize(tolerance);
}
public MultiLineString linearize(double tolerance) {
int numGeometries = getNumGeometries();
LineString[] linearized = new LineString[numGeometries];
for (int k = 0; k < numGeometries; k++) {
LineString component = (LineString) getGeometryN(k);
if (component instanceof CurvedGeometry<?>) {
CurvedGeometry<?> curved = (CurvedGeometry<?>) component;
linearized[k] = (LineString) curved.linearize(tolerance);
} else {
linearized[k] = component;
}
}
return getFactory().createMultiLineString(linearized);
}
public String toCurvedText() {
StringBuilder sb = new StringBuilder("MULTICURVE(");
int numGeometries = getNumGeometries();
for (int k = 0; k < numGeometries; k++) {
LineString component = (LineString) getGeometryN(k);
if (component instanceof SingleCurvedGeometry<?>) {
SingleCurvedGeometry<?> curved = (SingleCurvedGeometry<?>) component;
sb.append(curved.toCurvedText());
} else {
sb.append("(");
CoordinateSequence cs = component.getCoordinateSequence();
for (int i = 0; i < cs.size(); i++) {
sb.append(cs.getX(i) + " " + cs.getY(i));
if (i < cs.size() - 1) {
sb.append(", ");
}
}
sb.append(")");
}
if (k < numGeometries - 1) {
sb.append(", ");
}
}
sb.append(")");
return sb.toString();
}
@Override
public double getTolerance() {
return tolerance;
}
@Override
public int getCoordinatesDimension() {
return 2;
}
}