package com.revolsys.geometry.cs.epsg;
import java.io.PrintWriter;
import java.util.Map.Entry;
import com.revolsys.geometry.cs.AngularUnit;
import com.revolsys.geometry.cs.Authority;
import com.revolsys.geometry.cs.CoordinateSystem;
import com.revolsys.geometry.cs.Datum;
import com.revolsys.geometry.cs.GeographicCoordinateSystem;
import com.revolsys.geometry.cs.LinearUnit;
import com.revolsys.geometry.cs.PrimeMeridian;
import com.revolsys.geometry.cs.ProjectedCoordinateSystem;
import com.revolsys.geometry.cs.Projection;
import com.revolsys.geometry.cs.Spheroid;
import com.revolsys.util.number.Numbers;
public class EpsgCsWktWriter {
public static void write(final PrintWriter out, final AngularUnit unit) {
if (unit != null) {
out.print(",UNIT[");
write(out, unit.getName());
out.write(',');
out.print(unit.getConversionFactor());
final Authority authority = unit.getAuthority();
write(out, authority);
out.write(']');
}
}
public static void write(final PrintWriter out, final Authority authority) {
if (authority != null) {
out.print(",AUTHORITY[");
write(out, authority.getName());
out.write(",\"");
out.print(authority.getCode());
out.write("\"]");
}
}
public static void write(final PrintWriter out, final CoordinateSystem coordinateSystem) {
if (coordinateSystem instanceof ProjectedCoordinateSystem) {
final ProjectedCoordinateSystem projCs = (ProjectedCoordinateSystem)coordinateSystem;
write(out, projCs);
} else if (coordinateSystem instanceof GeographicCoordinateSystem) {
final GeographicCoordinateSystem geoCs = (GeographicCoordinateSystem)coordinateSystem;
write(out, geoCs);
}
}
public static void write(final PrintWriter out, final Datum datum) {
if (datum != null) {
out.print(",DATUM[");
write(out, datum.getName());
final Spheroid spheroid = datum.getSpheroid();
if (spheroid != null) {
write(out, spheroid);
}
final Authority authority = datum.getAuthority();
write(out, authority);
out.write(']');
}
}
public static void write(final PrintWriter out,
final GeographicCoordinateSystem coordinateSystem) {
if (coordinateSystem != null) {
out.print("GEOGCS[");
write(out, coordinateSystem.getCoordinateSystemName());
final Datum datum = coordinateSystem.getDatum();
write(out, datum);
final PrimeMeridian primeMeridian = coordinateSystem.getPrimeMeridian();
write(out, primeMeridian);
final AngularUnit unit = coordinateSystem.getAngularUnit();
write(out, unit);
final Authority authority = coordinateSystem.getAuthority();
write(out, authority);
out.write(']');
}
}
public static void write(final PrintWriter out, final LinearUnit unit) {
if (unit != null) {
out.print(",UNIT[");
write(out, unit.getName());
out.write(',');
write(out, unit.getConversionFactor());
final Authority authority = unit.getAuthority();
write(out, authority);
out.write(']');
}
}
private static void write(final PrintWriter out, final Number number) {
out.print(Numbers.toString(number));
}
public static void write(final PrintWriter out, final PrimeMeridian primeMeridian) {
if (primeMeridian != null) {
out.print(",PRIMEM[");
write(out, primeMeridian.getName());
out.write(',');
final double longitude = primeMeridian.getLongitude();
write(out, longitude);
final Authority authority = primeMeridian.getAuthority();
write(out, authority);
out.write(']');
}
}
public static void write(final PrintWriter out,
final ProjectedCoordinateSystem coordinateSystem) {
if (coordinateSystem != null) {
out.print("PROJCS[");
write(out, coordinateSystem.getCoordinateSystemName());
final GeographicCoordinateSystem geoCs = coordinateSystem.getGeographicCoordinateSystem();
out.print(",");
write(out, geoCs);
final Projection projection = coordinateSystem.getProjection();
write(out, projection);
for (final Entry<String, Object> parameter : coordinateSystem.getParameters().entrySet()) {
final String name = parameter.getKey();
final Object value = parameter.getValue();
write(out, name, value);
}
final LinearUnit unit = coordinateSystem.getLinearUnit();
if (unit != null) {
write(out, unit);
}
final Authority authority = coordinateSystem.getAuthority();
write(out, authority);
out.write(']');
}
}
public static void write(final PrintWriter out, final Projection projection) {
if (projection != null) {
out.print(",PROJECTION[");
write(out, projection.getName());
out.write(']');
}
}
public static void write(final PrintWriter out, final Spheroid spheroid) {
if (spheroid != null) {
out.print(",SPHEROID[");
write(out, spheroid.getName());
out.write(',');
final double semiMajorAxis = spheroid.getSemiMajorAxis();
write(out, semiMajorAxis);
out.print(',');
final double inverseFlattening = spheroid.getInverseFlattening();
write(out, inverseFlattening);
final Authority authority = spheroid.getAuthority();
write(out, authority);
out.write(']');
}
}
public static void write(final PrintWriter out, final String value) {
out.write('"');
if (value != null) {
out.print(value);
}
out.write('"');
}
public static void write(final PrintWriter out, final String name, final Object value) {
out.print(",PARAMETER[");
write(out, name);
out.write(',');
if (value instanceof Number) {
final Number number = (Number)value;
write(out, number);
} else {
out.print(value);
}
out.write(']');
}
}