/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2015, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotools.geometry.jts;
import java.util.List;
import com.vividsolutions.jts.geom.CoordinateSequence;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.MultiPolygon;
import com.vividsolutions.jts.geom.Polygon;
/**
* A subclass of {@link MultiPolygon} that can host also {@link CurvePolygon} and will linearize if
* needed
*
* @author Andrea Aime - GeoSolutions
*/
public class MultiSurface extends MultiPolygon implements MultiCurvedGeometry<MultiPolygon> {
private static final long serialVersionUID = -5796254063449438787L;
double tolerance;
public MultiSurface(List<Polygon> components, GeometryFactory factory, double tolerance) {
super(components.toArray(new Polygon[components.size()]), factory);
this.tolerance = tolerance;
}
public MultiSurface(Polygon[] polygons, GeometryFactory factory, double tolerance) {
super(polygons, factory);
this.tolerance = tolerance;
}
public MultiPolygon linearize() {
return linearize(tolerance);
}
public MultiPolygon linearize(double tolerance) {
int numGeometries = getNumGeometries();
Polygon[] linearized = new Polygon[numGeometries];
for (int k = 0; k < numGeometries; k++) {
Polygon component = (Polygon) getGeometryN(k);
if (component instanceof CurvedGeometry<?>) {
CurvedGeometry<?> curved = (CurvedGeometry<?>) component;
linearized[k] = (Polygon) curved.linearize(tolerance);
} else {
linearized[k] = component;
}
}
return getFactory().createMultiPolygon(linearized);
}
public String toCurvedText() {
StringBuilder sb = new StringBuilder("MULTISURFACE ");
int numGeometries = getNumGeometries();
if (numGeometries == 0) {
sb.append("EMPTY");
} else {
sb.append("(");
for (int k = 0; k < numGeometries; k++) {
Polygon component = (Polygon) getGeometryN(k);
if (component instanceof CurvedGeometry<?>) {
CurvedGeometry<?> curved = (CurvedGeometry<?>) component;
sb.append(curved.toCurvedText());
} else {
// straight lines polygon
sb.append("(");
writeCoordinateSequence(sb, component.getExteriorRing().getCoordinateSequence());
int numHoles = component.getNumInteriorRing();
for (int i = 0; i < numHoles; i++) {
sb.append(", ");
writeCoordinateSequence(sb, component.getInteriorRingN(i)
.getCoordinateSequence());
}
sb.append(")");
}
if (k < numGeometries - 1) {
sb.append(", ");
}
}
sb.append(")");
}
return sb.toString();
}
private void writeCoordinateSequence(StringBuilder sb, CoordinateSequence cs) {
sb.append("(");
for (int i = 0; i < cs.size(); i++) {
sb.append(cs.getX(i) + " " + cs.getY(i));
if (i < cs.size() - 1) {
sb.append(", ");
}
}
sb.append(")");
}
@Override
public double getTolerance() {
return tolerance;
}
@Override
public int getCoordinatesDimension() {
return 2;
}
}