package com.revolsys.record.io.format.kml;
import java.io.IOException;
import java.io.Writer;
import com.revolsys.geometry.model.Geometry;
import com.revolsys.geometry.model.LineString;
import com.revolsys.geometry.model.LinearRing;
import com.revolsys.geometry.model.Point;
import com.revolsys.geometry.model.Polygon;
import com.revolsys.util.number.Doubles;
public class KmlWriterUtil {
public static void writeCoordinates(final Writer out, final LineString line) throws IOException {
out.write("<coordinates>");
final int vertexCount = line.getVertexCount();
final int axisCount = line.getAxisCount();
for (int vertexIndex = 0; vertexIndex < vertexCount; vertexIndex++) {
if (vertexIndex > 0) {
out.write(' ');
}
out.write(Doubles.toString(line.getX(vertexIndex)));
out.write(',');
out.write(Doubles.toString(line.getY(vertexIndex)));
for (int axisIndex = 2; axisIndex < axisCount; axisIndex++) {
out.write(',');
out.write(String.valueOf(line.getCoordinate(vertexIndex, axisIndex)));
}
}
out.write("</coordinates>\n");
}
public static void writeCoordinates(final Writer out, final Point point) throws IOException {
out.write("<coordinates>");
if (point != null && !point.isEmpty()) {
out.write(Doubles.toString(point.getX()));
out.write(',');
out.write(Doubles.toString(point.getY()));
for (int axisIndex = 2; axisIndex < point.getAxisCount(); axisIndex++) {
final double value = point.getCoordinate(axisIndex);
out.write(',');
out.write(Doubles.toString(value));
}
}
out.write("</coordinates>\n");
}
// Assumes geometry is wgs84
public static void writeGeometry(final Writer out, final Geometry geometry, final int axisCount)
throws IOException {
if (geometry != null) {
final int numGeometries = geometry.getGeometryCount();
if (numGeometries > 1) {
out.write("<MultiGeometry>\n");
for (int i = 0; i < numGeometries; i++) {
writeGeometry(out, geometry.getGeometry(i), axisCount);
}
out.write("</MultiGeometry>\n");
} else {
if (geometry instanceof Point) {
final Point point = (Point)geometry;
writePoint(out, point);
} else if (geometry instanceof LinearRing) {
final LinearRing line = (LinearRing)geometry;
writeLinearRing(out, line);
} else if (geometry instanceof LineString) {
final LineString line = (LineString)geometry;
writeLineString(out, line);
} else if (geometry instanceof Polygon) {
final Polygon polygon = (Polygon)geometry;
writePolygon(out, polygon);
} else if (geometry.isGeometryCollection()) {
writeMultiGeometry(out, geometry, axisCount);
}
}
}
}
public static void writeLinearRing(final Writer out, final LineString ring) throws IOException {
out.write("<LinearRing>\n");
writeCoordinates(out, ring);
out.write("</LinearRing>\n");
}
public static void writeLineString(final Writer out, final LineString line) throws IOException {
out.write("<LineString>\n");
writeCoordinates(out, line);
out.write("</LineString>\n");
}
public static void writeMultiGeometry(final Writer out, final Geometry collection,
final int axisCount) throws IOException {
out.write("<MultiGeometry>\n");
for (int i = 0; i < collection.getGeometryCount(); i++) {
final Geometry geometry = collection.getGeometry(i);
writeGeometry(out, geometry, axisCount);
}
out.write("</MultiGeometry>\n");
}
public static void writePoint(final Writer out, final Point point) throws IOException {
out.write("<Point>\n");
writeCoordinates(out, point);
out.write("</Point>\n");
}
public static void writePolygon(final Writer out, final Polygon polygon) throws IOException {
out.write("<Polygon>\n");
if (!polygon.isEmpty()) {
out.write("<outerBoundaryIs>\n");
writeLinearRing(out, polygon.getShell());
out.write("</outerBoundaryIs>\n");
for (final LineString hole : polygon.holes()) {
out.write("<innerBoundaryIs>\n");
writeLinearRing(out, hole);
out.write("</innerBoundaryIs>\n");
}
}
out.write("</Polygon>\n");
}
}