/******************************************************************************* * Copyright (c) 2015 VoyagerSearch * All rights reserved. This program and the accompanying materials * are made available under the terms of the Apache License, Version 2.0 which * accompanies this distribution and is available at * http://www.apache.org/licenses/LICENSE-2.0.txt ******************************************************************************/ package org.locationtech.spatial4j.io; import org.locationtech.spatial4j.shape.Circle; import org.locationtech.spatial4j.shape.Point; import org.locationtech.spatial4j.shape.Rectangle; import org.locationtech.spatial4j.shape.Shape; import org.locationtech.spatial4j.shape.ShapeCollection; import org.locationtech.spatial4j.shape.impl.BufferedLine; import org.locationtech.spatial4j.shape.impl.BufferedLineString; import java.io.IOException; import java.io.Writer; import java.math.RoundingMode; import java.text.NumberFormat; import java.util.Iterator; public class WKTWriter implements ShapeWriter { @Override public String getFormatName() { return ShapeIO.WKT; } protected StringBuilder append(StringBuilder buffer, Point p, NumberFormat nf) { return buffer.append(nf.format(p.getX())).append(' ').append( nf.format(p.getY())); } @Override public String toString(Shape shape) { NumberFormat nf = LegacyShapeWriter.makeNumberFormat(6); if (shape instanceof Point) { StringBuilder buffer = new StringBuilder(); return append(buffer.append("POINT ("),(Point)shape,nf).append(")").toString(); } if (shape instanceof Rectangle) { NumberFormat nfMIN = nf; NumberFormat nfMAX = LegacyShapeWriter.makeNumberFormat(6); nfMIN.setRoundingMode( RoundingMode.FLOOR ); nfMAX.setRoundingMode( RoundingMode.CEILING ); Rectangle rect = (Rectangle)shape; return "ENVELOPE (" + // '(' x1 ',' x2 ',' y2 ',' y1 ')' nfMIN.format(rect.getMinX()) + ", " + nfMAX.format(rect.getMaxX()) + ", "+ nfMAX.format(rect.getMaxY()) + ", " + nfMIN.format(rect.getMinY()) + ")"; // // return "POLYGON(( "+ // nf.format(rect.getMinX()) + " " + nf.format(rect.getMinY()) + ", "+ // nf.format(rect.getMinX()) + " " + nf.format(rect.getMaxY()) + ", "+ // nf.format(rect.getMaxX()) + " " + nf.format(rect.getMaxY()) + ", "+ // nf.format(rect.getMaxX()) + " " + nf.format(rect.getMinY()) + ", "+ // nf.format(rect.getMinX()) + " " + nf.format(rect.getMinY()) + "))"; } if (shape instanceof Circle) { Circle c = (Circle) shape; StringBuilder str = new StringBuilder(); str.append("BUFFER (POINT (") .append(nf.format(c.getCenter().getX())).append(" ") .append(nf.format(c.getCenter().getY())) .append("), ") .append(nf.format(c.getRadius())) .append(")"); return str.toString(); } if (shape instanceof BufferedLineString) { BufferedLineString line = (BufferedLineString) shape; StringBuilder str = new StringBuilder(); double buf = line.getBuf(); if (buf > 0d) { str.append("BUFFER ("); } str.append("LINESTRING ("); Iterator<BufferedLine> iter = line.getSegments().iterator(); while(iter.hasNext()) { BufferedLine seg = iter.next(); append(str,seg.getA(),nf).append(", "); if(!iter.hasNext()) { append(str,seg.getB(),nf); } } str.append(")"); if (buf > 0d) { str.append(", ").append(nf.format(buf)).append(")"); } return str.toString(); } if(shape instanceof ShapeCollection) { StringBuilder buffer = new StringBuilder(); buffer.append("GEOMETRYCOLLECTION ("); boolean first = true; for(Shape sub : ((ShapeCollection<? extends Shape>)shape).getShapes()) { if(!first) { buffer.append(","); } buffer.append(toString(sub)); first = false; } buffer.append(")"); return buffer.toString(); } return LegacyShapeWriter.writeShape(shape, nf); } @Override public void write(Writer output, Shape shape) throws IOException { output.append( toString(shape) ); } }