/** * Returns a JTS geometry for the given {@link Ring} (which is linearized first). * * @param ring * {@link Ring} that consists of {@link LineStringSegment}, {@link Arc} and {@link Circle} segments only * @return linear JTS ring geometry, null if no * @throws IllegalArgumentException * if the given input ring contains other segment types than {@link LineStringSegment}, {@link Arc} and * {@link Circle} */ private LinearRing getJTSRing( Ring ring ) { Ring linearizedRing = (Ring) linearizer.linearize( ring, crit ); List<Coordinate> coordinates = new LinkedList<Coordinate>(); for ( Curve member : linearizedRing.getMembers() ) { for ( CurveSegment segment : member.getCurveSegments() ) { for ( Point point : ( (LineStringSegment) segment ).getControlPoints() ) { coordinates.add( new Coordinate( point.get0(), point.get1() ) ); } } } return jtsFactory.createLinearRing( coordinates.toArray( new Coordinate[coordinates.size()] ) ); }
for ( Curve c : ring.getMembers() ) { writer.writeStartElement( gmlNs, "curveMember" ); exportCurve( c );
if ( curve instanceof Ring ) { Ring ring = (Ring) curve; List<Curve> curves = ring.getMembers(); List<Curve> linearizedMembers = new ArrayList<Curve>( curves.size() ); for ( Curve member : curves ) {
public static Ring invertOrientation( Ring ring ) { Ring fixedRing = null; switch ( ring.getRingType() ) { case LinearRing: { LinearRing linearRing = (LinearRing) ring; fixedRing = new DefaultLinearRing( ring.getId(), ring.getCoordinateSystem(), ring.getPrecision(), invertOrientation( linearRing.getControlPoints() ) ); break; } case Ring: { List<Curve> fixedMemberCurves = new ArrayList<Curve>( ring.getMembers().size() ); for ( Curve memberCurve : ring.getMembers() ) { fixedMemberCurves.add( invertOrientation( memberCurve ) ); } fixedRing = new DefaultRing( ring.getId(), ring.getCoordinateSystem(), ring.getPrecision(), fixedMemberCurves ); break; } } fixedRing.setProperties( ring.getProperties() ); return fixedRing; }
/** * Returns a fixed version of the given {@link Ring} object. * * @param ring * ring to be repaired * @return repaired ring, never <code>null</code> */ public static Ring fixUnclosedRing( Ring ring ) { Ring repaired = null; switch ( ring.getRingType() ) { case LinearRing: { LinearRing linearRing = (LinearRing) ring; Points fixedPoints = getFixedPoints( linearRing.getControlPoints(), linearRing.getStartPoint() ); repaired = new DefaultLinearRing( ring.getId(), ring.getCoordinateSystem(), ring.getPrecision(), fixedPoints ); break; } case Ring: { List<Curve> repairedCurves = new ArrayList<Curve>( ring.getMembers() ); Curve lastCurve = repairedCurves.get( repairedCurves.size() - 1 ); repairedCurves.set( repairedCurves.size() - 1, fixCurve( lastCurve, ring.getStartPoint() ) ); repaired = new DefaultRing( ring.getId(), ring.getCoordinateSystem(), ring.getPrecision(), repairedCurves ); break; } } repaired.setProperties( ring.getProperties() ); return repaired; }
List<Curve> repairedCurves = new ArrayList<Curve>( ring.getMembers() ); Curve lastCurve = repairedCurves.get( repairedCurves.size() - 1 ); repairedCurves.set( repairedCurves.size() - 1, fixCurve( lastCurve, ring.getStartPoint() ) );
public static Ring forceOrientation( Ring ring, boolean ccw ) { double shoelaceSum = 0; final List<Curve> curves = ring.getMembers(); for ( final Curve curve : curves ) { final List<CurveSegment> curveSegments = curve.getCurveSegments(); for ( final CurveSegment curveSegment : curveSegments ) { final CurveSegmentType segmentType = curveSegment.getSegmentType(); Points points; switch ( segmentType ) { case ARC_STRING: points = ( (ArcString) curveSegment ).getControlPoints(); case LINE_STRING_SEGMENT: points = ( (LineStringSegment) curveSegment ).getControlPoints(); for ( int i = 0; i < points.size(); i++ ) { final Point first = points.get( i ); final Point second = points.get( ( i + 1 ) % points.size() ); shoelaceSum += ( second.get0() - first.get0() ) * ( second.get1() + first.get1() ); } continue; default: LOG.warn( "Calculating orientation of " + segmentType.name() + " segments is not implemented yet. Ring orientation remains unchanged." ); return ring; } } } return shoelaceSum > 0 == ccw ? invertOrientation( ring ) : ring; }