/*$************************************************************************************************ ** ** $Id$ ** ** $Source: /cvs/ctree/LiteGO1/src/jar/com/polexis/lite/spatialschema/geometry/primitive/SurfaceImpl.java,v $ ** ** Copyright (C) 2003 Open GIS Consortium, Inc. All Rights Reserved. http://www.opengis.org/Legal/ ** *************************************************************************************************/ package org.geotoolkit.geometry.isoonjts.spatialschema.geometry.primitive; import java.util.ArrayList; import java.util.List; import java.util.Set; import org.geotoolkit.geometry.isoonjts.spatialschema.geometry.JTSGeometry; import org.geotoolkit.geometry.isoonjts.JTSUtils; import org.geotoolkit.geometry.isoonjts.spatialschema.geometry.AbstractJTSGeometry; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.opengis.geometry.DirectPosition; import org.opengis.geometry.complex.CompositeSurface; import org.opengis.geometry.primitive.OrientableSurface; import org.opengis.geometry.primitive.Primitive; import org.opengis.geometry.primitive.PrimitiveFactory; import org.opengis.geometry.primitive.Surface; import org.opengis.geometry.primitive.SurfacePatch; import org.opengis.geometry.primitive.SurfaceBoundary; /** * Surface with a positive orientation. * {@code Surface} is a subclass of {@link Primitive} and is the basis for 2-dimensional * geometry. Unorientable surfaces such as the Möbius band are not allowed. The orientation of * a surface chooses an "up" direction through the choice of the upward normal, which, if the * surface is not a cycle, is the side of the surface from which the exterior boundary appears * counterclockwise. Reversal of the surface orientation reverses the curve orientation of each * boundary component, and interchanges the conceptual "up" and "down" direction of the surface. * If the surface is the boundary of a solid, the "up" direction is usually outward. For closed * surfaces, which have no boundary, the up direction is that of the surface patches, which must * be consistent with one another. Its included {@linkplain SurfacePatch surface patches} describe * the interior structure of a {@code Surface}. * * <blockquote><font size=2> * <strong>NOTE:</strong> Other than the restriction on orientability, no other "validity" condition is required for GM_Surface. * </font></blockquote> * * @author ISO/DIS 19107 * @author <A HREF="http://www.opengis.org">OpenGIS® consortium</A> * @version 2.0 * * @see PrimitiveFactory#createSurface(List) * @see PrimitiveFactory#createSurface(SurfaceBoundary) * @module */ public class JTSSurface extends AbstractJTSGeometry implements Surface { protected List<JTSSurfacePatch> patches; public JTSSurface() { this(null); } public JTSSurface(final CoordinateReferenceSystem crs) { super(crs); patches = new ArrayList(); } /** * {@inheritDoc } */ @SuppressWarnings("unchecked") @Override public List<JTSSurfacePatch> getPatches() { return patches; } /** * {@inheritDoc } */ @Override public SurfaceBoundary getBoundary() { return (SurfaceBoundary) super.getBoundary(); } /** * {@inheritDoc } */ @Override public double [] getUpNormal(final DirectPosition point) { return new double [] { 0, 0, 1 }; } /** * {@inheritDoc } */ @Override public double getPerimeter() { return getJTSGeometry().getBoundary().getLength(); } /** * {@inheritDoc } */ @Override public double getArea() { return getJTSGeometry().getArea(); } /** * {@inheritDoc } */ @Override public CompositeSurface getComposite() { return null; } /** * {@inheritDoc } */ @Override public int getOrientation() { return 0; } /** * {@inheritDoc } */ @Override public Surface getPrimitive() { return this; } /** * {@inheritDoc } */ @Override public Set getComplexes() { return null; } /** * {@inheritDoc } */ @Override public Set getContainingPrimitives() { return null; } /** * {@inheritDoc } */ @Override public OrientableSurface[] getProxy() { return null; } /** * {@inheritDoc } */ @Override public Set getContainedPrimitives() { return null; } /** * {@inheritDoc } */ @Override protected com.vividsolutions.jts.geom.Geometry computeJTSPeer() { if (patches.size() > 1) { //throw new UnsupportedOperationException("This implementation does not support surfaces with multiple patches."); final com.vividsolutions.jts.geom.Polygon[] polygons = new com.vividsolutions.jts.geom.Polygon[patches.size()]; for (int i = 0; i < patches.size(); i++) { final JTSGeometry jtsGeometry = (JTSGeometry) patches.get(i); polygons[i] = (com.vividsolutions.jts.geom.Polygon) jtsGeometry.getJTSGeometry(); } return JTSUtils.GEOMETRY_FACTORY.createMultiPolygon(polygons); } return ((JTSGeometry) patches.get(0)).getJTSGeometry(); } }