package net.refractions.linecleaner.cleansing;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.vividsolutions.jts.geom.Envelope;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryCollection;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.Point;
public class NodeCollection {
List<Point> endNodes;
private boolean flagged;
public NodeCollection () {
this.endNodes = new ArrayList<Point>();
}
public boolean add( Point feature ) {
return endNodes.add(feature);
}
public Point remove(int index) {
return endNodes.remove(index);
}
public boolean remove(Point endNode) {
return endNodes.remove(endNode);
}
public void setFlagged( boolean flagged ) {
this.flagged = flagged;
}
public Iterator<Point> iterator() {
return endNodes.iterator();
}
/**
*
* If this collection is flagged, no processing should be performed on it,
* as manual intervention is required.
*
* @return
*/
public boolean isFlagged() {
return flagged;
}
public boolean contains( Point endNode ) {
return endNodes.contains(endNode);
}
public int size() {
return endNodes.size();
}
public Envelope getEnvelope() {
return createGeometryCollection().getEnvelopeInternal();
}
private GeometryCollection createGeometryCollection() {
GeometryFactory factory = new GeometryFactory();
Geometry[] geometries = endNodes.toArray(new Geometry[endNodes.size()]);
GeometryCollection geometryCollection = factory.createGeometryCollection(geometries);
return geometryCollection;
}
public Point calculateAveragePoint() {
return createGeometryCollection().getCentroid();
}
public static final String NEWLINE = System.getProperty("line.separator");
public String toString() {
StringBuffer buffer = new StringBuffer();
buffer.append("Size: " + size() + " Flagged: " + isFlagged() + "[" + NEWLINE);
Iterator iter = iterator();
while (iter.hasNext()) {
Point endNode = (Point) iter.next();
buffer.append(EndNodesProcessor.endNodeToString(endNode));
if (!iter.hasNext()) {
buffer.append("]");
}
buffer.append(NEWLINE);
}
return buffer.toString();
}
public void merge(NodeCollection collectionB) {
this.endNodes.addAll(collectionB.endNodes);
}
// public Envelope getEnvelope() {
// Envelope envelope = new Envelope();
//
// for (Point point : endNodes) {
// envelope.expandToInclude(point.getCoordinate());
// }
// return envelope;
// }
}