/*$************************************************************************************************ ** ** $Id$ ** ** $Source: /cvs/ctree/LiteGO1/src/jar/com/polexis/lite/spatialschema/geometry/aggregate/AggregateImpl.java,v $ ** ** Copyright (C) 2003 Open GIS Consortium, Inc. All Rights Reserved. http://www.opengis.org/Legal/ ** *************************************************************************************************/ package org.geotoolkit.geometry.isoonjts.spatialschema.geometry.aggregate; import com.vividsolutions.jts.geom.LineString; import com.vividsolutions.jts.geom.Point; import com.vividsolutions.jts.geom.Polygon; import java.util.*; import org.geotoolkit.geometry.isoonjts.spatialschema.geometry.JTSGeometry; import org.geotoolkit.geometry.isoonjts.JTSUtils; import org.geotoolkit.geometry.isoonjts.spatialschema.geometry.AbstractJTSGeometry; import org.geotoolkit.geometry.jts.SRIDGenerator; import org.geotoolkit.geometry.jts.SRIDGenerator.Version; import org.opengis.geometry.Geometry; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.opengis.geometry.aggregate.Aggregate; /** * * @author Johann Sorel (Geomatys) * @module */ public abstract class AbstractJTSAggregate<T extends Geometry> extends AbstractJTSGeometry implements Aggregate { private Set<T> elements = new LinkedHashSet(); public AbstractJTSAggregate() { super(); } public AbstractJTSAggregate(final CoordinateReferenceSystem crs) { super(crs); } /** * {@inheritDoc } */ @Override protected com.vividsolutions.jts.geom.Geometry computeJTSPeer() { final List<com.vividsolutions.jts.geom.Geometry> childParts = new ArrayList<com.vividsolutions.jts.geom.Geometry>(); for(Geometry prim : elements) { if(prim instanceof JTSGeometry){ final JTSGeometry jtsGeom = (JTSGeometry) prim; final com.vividsolutions.jts.geom.Geometry geom = jtsGeom.getJTSGeometry(); if (geom != null) { childParts.add(geom); } }else{ throw new IllegalStateException("Only JTSGeometries are allowed in the JTSAggregate class."); } } com.vividsolutions.jts.geom.Geometry result = null; // we want a multi geometry event if there is only one geometry if (childParts.size() == 1) { com.vividsolutions.jts.geom.Geometry geom = childParts.get(0); if (geom instanceof LineString) { result = JTSUtils.GEOMETRY_FACTORY.createMultiLineString(new LineString[] {(LineString)geom}); } if (geom instanceof Polygon) { result = JTSUtils.GEOMETRY_FACTORY.createMultiPolygon(new Polygon[] {(Polygon)geom}); } if (geom instanceof Point) { result = JTSUtils.GEOMETRY_FACTORY.createMultiPoint(new Point[] {(Point)geom}); } } if (result == null) { result = JTSUtils.GEOMETRY_FACTORY.buildGeometry(childParts); } CoordinateReferenceSystem crs = getCoordinateReferenceSystem(); if (crs != null) { final int srid = SRIDGenerator.toSRID(crs, Version.V1); result.setSRID(srid); } return result; } /** * {@inheritDoc } */ @Override public Set<T> getElements() { return elements; } public void setElements(final Set<T> elements) { this.elements = elements; } @Override public String toString() { StringBuilder sb = new StringBuilder(super.toString()); sb.append("elements:").append('\n'); for (Geometry g : elements) { sb.append(g).append('\n'); } return sb.toString(); } @Override public boolean equals(final Object object) { if (this == object) return true; if (object instanceof AbstractJTSAggregate && super.equals(object)) { AbstractJTSAggregate that = (AbstractJTSAggregate) object; return Objects.equals(this.elements, that.elements); } return false; } @Override public int hashCode() { int hash = super.hashCode(); hash = 41 * hash + (this.elements != null ? this.elements.hashCode() : 0); return hash; } }