/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2006-2008, 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.iso.io.wkt; import java.util.Collection; import java.util.Iterator; import java.util.List; import org.geotools.geometry.iso.primitive.RingImpl; import org.opengis.geometry.DirectPosition; import org.opengis.geometry.Geometry; import org.opengis.geometry.aggregate.MultiCurve; import org.opengis.geometry.aggregate.MultiPoint; import org.opengis.geometry.aggregate.MultiPrimitive; import org.opengis.geometry.aggregate.MultiSurface; import org.opengis.geometry.complex.CompositeCurve; import org.opengis.geometry.complex.CompositePoint; import org.opengis.geometry.coordinate.PointArray; import org.opengis.geometry.coordinate.Position; import org.opengis.geometry.primitive.Curve; import org.opengis.geometry.primitive.CurveSegment; import org.opengis.geometry.primitive.OrientableCurve; import org.opengis.geometry.primitive.Point; import org.opengis.geometry.primitive.Primitive; import org.opengis.geometry.primitive.Ring; import org.opengis.geometry.primitive.Surface; import org.opengis.geometry.primitive.SurfaceBoundary; public class GeometryToWKTString { private boolean lineBreak = false; public GeometryToWKTString(boolean lineBreak) { this.lineBreak = lineBreak; } public String getString(Geometry geom) { String rString = ""; if (this.lineBreak) { rString += "\n"; } if (geom instanceof Curve) rString += curveToString((Curve) geom); else if (geom instanceof Point) rString += pointToString((Point) geom); else if (geom instanceof Ring) rString += ringToString((Ring) geom); else if (geom instanceof SurfaceBoundary) rString += surfaceBoundaryToString((SurfaceBoundary) geom); else if (geom instanceof Surface) rString += surfaceToString((Surface) geom); else if (geom instanceof MultiPrimitive) rString += multiPrimitiveToString((MultiPrimitive) geom); else if (geom instanceof CompositePoint) rString += compositePointToString((CompositePoint) geom); else if (geom instanceof CompositeCurve) rString += compositeCurveToString((CompositeCurve) geom); else rString = ""; return rString; } private String pointToString(Point c) { return "Point(" + pointCoordToString(c) + ")"; } private String curveToString(Curve c) { return "Curve(" + curveCoordToString(c) + ")"; } private String ringToString(Ring r) { return "Ring(" + ringCoordToString(r) + ")"; } private String surfaceBoundaryToString(SurfaceBoundary sb) { return "SurfaceBoundary(" + surfaceBoundaryCoordToString(sb) + ")"; } private String surfaceToString(Surface s) { return "Surface(" + surfaceBoundaryCoordToString((SurfaceBoundary)s.getBoundary()) + ")"; } private String multiPrimitiveToString(MultiPrimitive mp) { if (mp instanceof MultiPoint) return multiPointToString((MultiPoint) mp); else if (mp instanceof MultiCurve) return multiCurveToString((MultiCurve) mp); else if (mp instanceof MultiSurface) return multiSurfaceToString((MultiSurface) mp); else return "MultiPrimitive(" + this.multiPrimitiveCoordToString(mp) + ")"; } private String multiPointToString(MultiPoint mp) { return "MultiPoint(" + this.multiPointCoordToString(mp) + ")"; } private String multiCurveToString(MultiCurve mc) { return "MultiCurve(" + this.multiCurveCoordToString(mc) + ")"; } private String multiSurfaceToString(MultiSurface ms) { return "MultiSurface(" + this.multiSurfaceCoordToString(ms) + ")"; } private String compositePointToString(CompositePoint cp) { Point p = (Point) cp.getElements().iterator().next(); return "CompositePoint(" + this.pointCoordToString(p) + ")"; } private String compositeCurveToString(CompositeCurve cc) { return "CompositeCurve(" + compositeCurveCoordToString(cc) + ")"; } /** * * @param dp * @return Format: "x1 y1 z1" */ private String directPositionToString(DirectPosition dp) { double coord[] = dp.getCoordinates(); String str = Double.toString(coord[0]); for (int i = 1; i < coord.length; ++i) { str += " " + Double.toString(coord[i]); } return str; } private String lineStringCoordToStringWithoutFirstCoord(CurveSegment ls) { return pointArrayCoordToStringWithoutFirstCoord(ls.getSamplePoints()); } private String pointArrayCoordToStringWithoutFirstCoord(PointArray pa) { String rString = ""; List<Position> positions = pa.positions(); if (positions.size() == 0) return ""; for (int i = 1; i < positions.size(); i++) { if (i > 1) { rString += ", "; } rString += directPositionToString(positions.get(i).getPosition()); } return rString; } private String curveCoordToString(Curve c) { String rString = ""; List<? extends CurveSegment> segments = c.getSegments(); rString += directPositionToString(c.getStartPoint()); for (int i = 0; i < segments.size(); i++) { rString += ", "; rString += lineStringCoordToStringWithoutFirstCoord(segments.get(i)); } return rString; } private String curveCoordToStringWithoutFirstCoord(Curve c) { String rString = ""; for (CurveSegment segment : c.getSegments()) { rString += ", "; rString += lineStringCoordToStringWithoutFirstCoord(segment); } return rString; } private String ringCoordToString(Ring r) { Collection<? extends Primitive> orientableCurves = r.getGenerators(); String rString = directPositionToString(((Curve) orientableCurves.iterator().next()).getStartPoint()); for (Primitive p : orientableCurves) { rString += curveCoordToStringWithoutFirstCoord((Curve) p); } return rString; } private String compositeCurveCoordToString(CompositeCurve cc) { Collection<? extends Primitive> orientableCurves = cc.getGenerators(); String rString = directPositionToString(((Curve) orientableCurves.iterator().next()).getStartPoint()); for (Primitive p : orientableCurves) { rString += curveCoordToStringWithoutFirstCoord((Curve) p); } return rString; } private String surfaceBoundaryCoordToString(SurfaceBoundary sb) { String rString = "("; rString += ringCoordToString((Ring) sb.getExterior()); rString += ")"; List<Ring> interior = sb.getInteriors(); if (interior.size() > 0) { for (int i = 0; i < interior.size(); i++) { rString += ", ("; rString += ringCoordToString((Ring) interior.get(i)); rString += ")"; } } return rString; } private String multiPointCoordToString(MultiPoint mp) { Iterator mpIter = mp.getElements().iterator(); String rString = this.pointCoordToString((Point)mpIter.next()); while (mpIter.hasNext()) { rString += ", ("; rString += this.pointCoordToString((Point)mpIter.next()); rString += ")"; } return rString; } private String multiCurveCoordToString(MultiCurve mc) { Iterator mpIter = mc.getElements().iterator(); String rString = "(" + this.curveCoordToString((Curve)mpIter.next()) + ")"; while (mpIter.hasNext()) { if (this.lineBreak) { rString += "\n\t"; } rString += ", ("; rString += this.curveCoordToString((Curve)mpIter.next()); rString += ")"; } return rString; } private String multiSurfaceCoordToString(MultiSurface mc) { Iterator mpIter = mc.getElements().iterator(); String rString = "(" + this.surfaceBoundaryCoordToString((SurfaceBoundary) ((Surface)mpIter.next()).getBoundary()) + ")"; while (mpIter.hasNext()) { if (this.lineBreak) { rString += "\n\t"; } rString += ", "; rString += "(" + this.surfaceBoundaryCoordToString((SurfaceBoundary) ((Surface)mpIter.next()).getBoundary()) + ")"; } return rString; } private String pointCoordToString(Point p) { return this.directPositionToString(p.getPosition()); } private String multiPrimitiveCoordToString(MultiPrimitive mp) { Iterator<Primitive> primitives = (Iterator<Primitive>) mp.getElements().iterator(); String rString = ""; while (primitives.hasNext()) { Primitive p = primitives.next(); if (p instanceof Point) rString += "\n\t" + pointToString((Point) p); else if (p instanceof Curve) rString += "\n\t" + curveToString((Curve) p); else if (p instanceof Surface) rString += "\n\t" + surfaceToString((Surface) p); else rString += "\n[INVALID TYPE in MULTIPRIMITIVE]"; } return rString; } }