/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2006-2008, 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.iso.operation;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.geotools.geometry.iso.coordinate.DirectPositionImpl;
import org.geotools.geometry.iso.coordinate.LineStringImpl;
import org.geotools.geometry.iso.coordinate.PointArrayImpl;
import org.geotools.geometry.iso.primitive.CurveImpl;
import org.opengis.geometry.DirectPosition;
import org.opengis.geometry.coordinate.Position;
import org.opengis.geometry.primitive.CurveSegment;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
/**
* Merges curves at end points
*
* @author Sanjay Dominik Jena
*
*
* @source $URL$
*/
public class Merger {
//FeatGeomFactoryImpl mFactory = null;
CoordinateReferenceSystem crs;
/*
public Merger(FeatGeomFactoryImpl factory) {
this.mFactory = factory;
this.crs = factory.getCoordinateReferenceSystem();
}
*/
public Merger(CoordinateReferenceSystem crs) {
// TODO Auto-generated constructor stub
this.crs = crs;
}
/**
* Merges a list of continuous curves into a new single curve.
* In order two neighboured curves are merged, their end and startpoint must be equal.
*
* @param curves
* @return null or tosses IllegalArgumentException
*/
public CurveImpl merge(List<CurveImpl> curves) {
for (int i=0; i<curves.size()-1; i++) {
if (!curves.get(i).getEndPoint().equals(curves.get(i+1).getStartPoint())) {
throw new IllegalArgumentException("Curves are not continuous");
}
}
return null;
}
/**
* Merges a set of curves into a new single curve.
* This method trys all combinations of curve´s start and end points.
*
* @param curves
* @return null
*/
public CurveImpl merge(Set<CurveImpl> curves) {
return null;
}
/**
* Constructs a new Curve by merging this Curve with another Curve
* The two input curves will not be modified.
* There will be no more references to positions or lists of the input curves, all values are copied.
*
* @param curve1
* @param curve2
* @return new curve
*/
public CurveImpl merge(CurveImpl curve1, CurveImpl curve2) {
CurveImpl firstCurve = null;
CurveImpl secondCurve = null;
if (curve1.getStartPoint().equals(curve2.getEndPoint())) {
firstCurve = curve2;
secondCurve = curve1;
} else
if (curve1.getEndPoint().equals(curve2.getStartPoint())) {
firstCurve = curve1;
secondCurve = curve2;
} else
throw new IllegalArgumentException("Curves do not share a start and end point ");
List<CurveImpl> curves = new ArrayList<CurveImpl>();
curves.add(firstCurve);
curves.add(secondCurve);
return this.mergeContinuousCurves(curves);
}
/**
* Merges a list of continuous curves into a new single curve.
* In order two neighboured curves are merged, their end and startpoint must be equal.
*
* @param curves
* @return
*/
private CurveImpl mergeContinuousCurves(List<CurveImpl> curves) {
List<Position> positionList = new ArrayList<Position>();
int i=0;
int j=0;
for (i=0; i<curves.size(); i++) {
List<DirectPosition> dPList = curves.get(i).asDirectPositions();
for (j=0; j<dPList.size()-1; j++) {
positionList.add( new DirectPositionImpl( dPList.get(j) ));
}
}
positionList.add(curves.get(curves.size()-1).getEndPoint());
// Create List of CurveSegment´s (LineString´s)
LineStringImpl lineString = new LineStringImpl(new PointArrayImpl(positionList), 0.0);
// LineStringImpl lineString =
// coordFactory.createLineString(aPositions);
List<CurveSegment> segments = new ArrayList<CurveSegment>();
segments.add(lineString);
// Create List of OrientableCurve´s (Curve´s)
// test OK
if (segments == null)
throw new NullPointerException();
// A curve will be created
// - The curve will be set as parent curves for the Curve segments
// - Start and end params for the CurveSegments will be set
return new CurveImpl( crs, segments);
}
}