package org.geotoolkit.internal.jaxb; import java.util.ArrayList; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlType; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import org.apache.sis.geometry.GeneralDirectPosition; import org.geotoolkit.geometry.isoonjts.spatialschema.geometry.geometry.JTSLineString; import org.geotoolkit.geometry.isoonjts.spatialschema.geometry.geometry.JTSPolygon; import org.geotoolkit.geometry.isoonjts.spatialschema.geometry.primitive.JTSCurve; import org.geotoolkit.geometry.isoonjts.spatialschema.geometry.primitive.JTSPolyhedralSurface; import org.geotoolkit.geometry.isoonjts.spatialschema.geometry.primitive.JTSRing; import org.geotoolkit.geometry.isoonjts.spatialschema.geometry.primitive.JTSSurfaceBoundary; import org.opengis.geometry.coordinate.PointArray; import org.opengis.geometry.coordinate.Position; import org.opengis.geometry.primitive.CurveSegment; import org.opengis.geometry.primitive.Primitive; import org.opengis.geometry.primitive.Ring; import org.opengis.geometry.primitive.SurfaceBoundary; import org.opengis.referencing.crs.CoordinateReferenceSystem; /** * * @author Guilhem Legal (Geomatys) */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name="PolyhedralSurfaceType", namespace="http://www.opengis.net/gml") public class PolyhedralSurfaceType { /** * CRS for this geometry. */ @XmlAttribute(name="srsName") @XmlJavaTypeAdapter(CoordinateReferenceSystemAdapter.class) private CoordinateReferenceSystem coordinateReferenceSystem; @XmlElement(name = "polygonPatches", namespace = "http://www.opengis.net/gml") private PolygonPatchesListType patchList; public PolyhedralSurfaceType() { } public PolyhedralSurfaceType(final JTSPolyhedralSurface poly) { this.coordinateReferenceSystem = poly.getCoordinateReferenceSystem(); this.patchList = new PolygonPatchesListType(poly.getPatches()); } /** * @return the patches */ public List<JTSPolygon> getPatches() { List<JTSPolygon> result = new ArrayList<JTSPolygon>(); for (SurfaceBoundary sb : patchList.getPatches()) { result.add(new JTSPolygon(sb)); } return result; } /** * @param patches the patches to set */ public void setPatches(final List<JTSPolygon> patches) { this.patchList.setPolygonPatches(patches); } /** * @return the coordinateReferenceSystem */ public CoordinateReferenceSystem getCoordinateReferenceSystem() { return coordinateReferenceSystem; } /** * @param coordinateReferenceSystem the coordinateReferenceSystem to set */ public void setCoordinateReferenceSystem(final CoordinateReferenceSystem coordinateReferenceSystem) { this.coordinateReferenceSystem = coordinateReferenceSystem; } public JTSPolyhedralSurface getIsoPolyHedralSurface() { JTSPolyhedralSurface result = new JTSPolyhedralSurface(coordinateReferenceSystem); for (JTSSurfaceBoundary s : patchList.getPatches()) { s.setCoordinateReferenceSystem(coordinateReferenceSystem); ((JTSRing)s.getExterior()).setCoordinateReferenceSystem(coordinateReferenceSystem); for (Primitive p : s.getExterior().getElements()) { if (p instanceof JTSCurve) { JTSCurve curve = (JTSCurve) p; curve.setCoordinateReferenceSystem(coordinateReferenceSystem); for (CurveSegment cv :curve.getSegments()) { if (cv instanceof JTSLineString) { JTSLineString line = (JTSLineString) cv; PointArray pa = line.getControlPoints(); List<Position> newPositions = new ArrayList<Position>(); for (Position pos : pa.positions()) { if (pos instanceof GeneralDirectPosition) { ((GeneralDirectPosition)pos).setCoordinateReferenceSystem(coordinateReferenceSystem); newPositions.add(pos); } } line.getControlPoints().clear(); line.getControlPoints().addAll(newPositions); } } } } if (s.getInteriors() != null) { for (Ring ring : s.getInteriors()) { ((JTSRing)ring).setCoordinateReferenceSystem(coordinateReferenceSystem); for (Primitive p : ring.getElements()) { if (p instanceof JTSCurve) { JTSCurve curve = (JTSCurve) p; curve.setCoordinateReferenceSystem(coordinateReferenceSystem); for (CurveSegment cv :curve.getSegments()) { if (cv instanceof JTSLineString) { JTSLineString line = (JTSLineString) cv; PointArray pa = line.getControlPoints(); List<Position> newPositions = new ArrayList<Position>(); for (Position pos : pa.positions()) { if (pos instanceof GeneralDirectPosition) { ((GeneralDirectPosition)pos).setCoordinateReferenceSystem(coordinateReferenceSystem); newPositions.add(pos); } } line.getControlPoints().clear(); line.getControlPoints().addAll(newPositions); } } } } } } result.getPatches().add(new JTSPolygon(s)); } return result; } @Override public String toString() { StringBuilder sb = new StringBuilder("[polyHedralSurfaceType]\n"); if (coordinateReferenceSystem != null) { sb.append("crs:").append(coordinateReferenceSystem); } if (patchList != null) { sb.append("patchList:").append(patchList); } return sb.toString(); } }