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.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.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="PolygonType", namespace="http://www.opengis.net/gml")
public class PolygonType {
/**
* CRS for this geometry.
*/
@XmlAttribute(name="srsName")
@XmlJavaTypeAdapter(CoordinateReferenceSystemAdapter.class)
private CoordinateReferenceSystem coordinateReferenceSystem;
@XmlElement(namespace = "http://www.opengis.net/gml")
@XmlJavaTypeAdapter(RingAdapter.class)
private Ring exterior;
@XmlElement(namespace = "http://www.opengis.net/gml")
@XmlJavaTypeAdapter(RingAdapter.class)
private Ring outerBoundaryIs;
@XmlElement(namespace = "http://www.opengis.net/gml")
@XmlJavaTypeAdapter(RingAdapter.class)
private List<Ring> interior;
@XmlElement(namespace = "http://www.opengis.net/gml")
@XmlJavaTypeAdapter(RingAdapter.class)
private List<Ring> innerBoundaryIs;
public PolygonType() {
}
public PolygonType(final JTSPolygon poly) {
if (poly != null && poly.getBoundary() != null) {
this.coordinateReferenceSystem = poly.getBoundary().getCoordinateReferenceSystem();
this.exterior = poly.getBoundary().getExterior();
this.interior = poly.getBoundary().getInteriors();
}
}
/**
* @return the exterior
*/
public Ring getExterior() {
return exterior;
}
/**
* @param exterior the exterior to set
*/
public void setExterior(final Ring exterior) {
this.exterior = exterior;
}
/**
* @return the interior
*/
public List<Ring> getInterior() {
return interior;
}
/**
* @param interior the interior to set
*/
public void setInterior(final List<Ring> interior) {
this.interior = interior;
}
/**
* @return the coordinateReferenceSystem
*/
public CoordinateReferenceSystem getCoordinateReferenceSystem() {
return coordinateReferenceSystem;
}
/**
* @param coordinateReferenceSystem the coordinateReferenceSystem to set
*/
public void setCoordinateReferenceSystem(final CoordinateReferenceSystem coordinateReferenceSystem) {
this.coordinateReferenceSystem = coordinateReferenceSystem;
}
public SurfaceBoundary getSurfaceBoundary() {
return new JTSSurfaceBoundary(coordinateReferenceSystem, exterior, interior);
}
public JTSPolygon getJTSPolygon() {
final Ring out;
if (exterior != null) {
out = exterior;
} else {
out = outerBoundaryIs;
}
if (out != null) {
((JTSRing) out).setCoordinateReferenceSystem(coordinateReferenceSystem);
for (Primitive p : out.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;
line.setCoordinateReferenceSystem(coordinateReferenceSystem);
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);
}
}
}
}
}
List<Ring> inte;
if (interior != null) {
inte = interior;
} else {
inte = innerBoundaryIs;
}
if (inte != null) {
for (Ring ring : inte) {
((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;
line.setCoordinateReferenceSystem(coordinateReferenceSystem);
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);
}
}
}
}
}
} else {
inte = new ArrayList<Ring>();
}
final JTSPolygon result = new JTSPolygon(new JTSSurfaceBoundary(coordinateReferenceSystem, out, inte));
result.setCoordinateReferenceSystem(coordinateReferenceSystem);
return result;
}
}