@Override public List<Points> getInteriorRingsCoordinates() { List<Points> controlPoints = new ArrayList<Points>(); if ( patches.size() == 1 ) { if ( patches.get( 0 ) instanceof PolygonPatch ) { PolygonPatch patch = (PolygonPatch) patches.get( 0 ); List<Ring> interiorRings = patch.getInteriorRings(); for ( Ring ring : interiorRings ) { controlPoints.add( ring.getControlPoints() ); } } else { throw new IllegalArgumentException( Messages.getMessage( "SURFACE_IS_NON_PLANAR" ) ); } } else { throw new IllegalArgumentException( Messages.getMessage( "SURFACE_MORE_THAN_ONE_PATCH" ) ); } return controlPoints; }
private void exportPolygonPatch( PolygonPatch polygonPatch ) throws XMLStreamException, UnknownCRSException, TransformationException { switch ( polygonPatch.getPolygonPatchType() ) { case POLYGON_PATCH: writer.writeStartElement( gmlNs, "PolygonPatch" ); writer.writeStartElement( gmlNs, "exterior" ); exportRing( polygonPatch.getExteriorRing() ); writer.writeEndElement(); for ( Ring ring : polygonPatch.getInteriorRings() ) { writer.writeStartElement( gmlNs, "interior" ); exportRing( ring ); writer.writeEndElement(); } writer.writeEndElement(); break; case TRIANGLE: exportTriangle( (Triangle) polygonPatch ); break; case RECTANGLE: exportRectangle( (Rectangle) polygonPatch ); break; } }
LOG.warn( "The exterior ring of a polygon patch did not contain any coordinates, discarding this patch." ); } else { List<Ring> interior = patch.getInteriorRings(); List<float[]> interiors = new ArrayList<float[]>( interior.size() ); int size = extC.length;
/** * Returns a linearized version (i.e. a {@link PolygonPatch} that only uses {@link LinearRing}s as boundaries) of * the given {@link PolygonPatch}. * * @param patch * @param crit * determines the interpolation quality / number of interpolation points * @return {@link PolygonPatch} that only uses {@link LinearRing}s as boundaries */ public PolygonPatch linearize( PolygonPatch patch, LinearizationCriterion crit ) { Ring exteriorRing = patch.getExteriorRing(); Ring linearizedExteriorRing = null; if ( exteriorRing != null ) { linearizedExteriorRing = (Ring) curveLinearizer.linearize( exteriorRing, crit ); } List<Ring> interiorRings = patch.getInteriorRings(); List<Ring> linearizedInteriorRings = new ArrayList<Ring>( interiorRings.size() ); for ( Ring interiorRing : interiorRings ) { linearizedInteriorRings.add( (Ring) curveLinearizer.linearize( interiorRing, crit ) ); } return geomFac.createPolygonPatch( linearizedExteriorRing, linearizedInteriorRings ); } }
@Override protected com.vividsolutions.jts.geom.Geometry buildJTSGeometry() { if ( patches.size() < 1 || !( patches.get( 0 ) instanceof PolygonPatch ) ) { throw new IllegalArgumentException( Messages.getMessage( "SURFACE_NOT_EQUIVALENT_TO_POLYGON" ) ); } // TODO handle the other patches as well PolygonPatch patch = (PolygonPatch) patches.get( 0 ); Ring exteriorRing = patch.getExteriorRing(); List<Ring> interiorRings = patch.getInteriorRings(); LinearRing shell = (LinearRing) getAsDefaultGeometry( exteriorRing ).getJTSGeometry(); LinearRing[] holes = null; if ( interiorRings != null ) { holes = new LinearRing[interiorRings.size()]; int i = 0; for ( Ring ring : interiorRings ) { holes[i++] = (LinearRing) getAsDefaultGeometry( ring ).getJTSGeometry(); } } return jtsFactory.createPolygon( shell, holes ); } }
private void writePolygonPatch( String id, ICRS crs, PrecisionModel pm, PolygonPatch polyPatch, Writer writer ) throws IOException { PolygonPatchType type = polyPatch.getPolygonPatchType(); Polygon poly = null; switch ( type ) { case POLYGON_PATCH: case RECTANGLE: case TRIANGLE: poly = new DefaultPolygon( id, crs, pm, polyPatch.getExteriorRing(), polyPatch.getInteriorRings() ); break; } writePolygonWithoutPrefix( poly, writer ); }
private PolygonPatch transform( PolygonPatch patch, Transformation trans ) throws TransformationException { Ring exterior = patch.getExteriorRing(); LinearRing transformedExteriorRing = transform( exterior, trans ); PolygonPatch result = null; PolygonPatchType type = patch.getPolygonPatchType(); switch ( type ) { case POLYGON_PATCH: List<Ring> interiorRings = ( patch ).getInteriorRings(); List<Ring> transformedInteriorRings = new ArrayList<Ring>( interiorRings == null ? 0 : interiorRings.size() ); if ( interiorRings != null && !interiorRings.isEmpty() ) { for ( Ring interior : interiorRings ) { if ( interior != null ) { LinearRing lr = transform( interior, trans ); transformedInteriorRings.add( lr ); } } } result = geomFactory.createPolygonPatch( transformedExteriorRing, transformedInteriorRings ); break; case RECTANGLE: result = geomFactory.createRectangle( transformedExteriorRing ); break; case TRIANGLE: result = geomFactory.createTriangle( transformedExteriorRing ); break; } return result; }
List<Ring> interiorRings = patch.getInteriorRings(); simplified = geomFac.createPolygon( geometry.getId(), geometry.getCoordinateSystem(), exteriorRing, interiorRings ); for ( SurfacePatch patch : linearized.getPatches() ) { Ring exteriorRing = ( (PolygonPatch) patch ).getExteriorRing(); List<Ring> interiorRings = ( (PolygonPatch) patch ).getInteriorRings(); members.add( geomFac.createPolygon( null, geometry.getCoordinateSystem(), exteriorRing, interiorRings ) );
List<Ring> interiorRings = patch.getInteriorRings(); List<LinearRing> interiorJTSRings = new ArrayList<LinearRing>( interiorRings.size() ); List<Polygon> interiorJTSRingsAsPolygons = new ArrayList<Polygon>( interiorRings.size() );
offx, offy ) ); List<Ring> interiorRings = ( (PolygonPatch) patch ).getInteriorRings(); List<Ring> movedInteriorRings = new ArrayList<Ring>( interiorRings.size() ); for ( Ring interior : interiorRings ) {