package org.activityinfo.geoadmin.writer;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.util.zip.GZIPOutputStream;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONWriter;
import org.geotools.feature.FeatureCollection;
import com.google.common.base.Charsets;
import com.google.common.io.Files;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.Polygon;
public class GoogleMapsWriter implements OutputWriter {
private StringWriter stringWriter = new StringWriter();
private JSONWriter writer;
private GooglePolylineEncoder encoder;
private File outputDir;
private int adminLevelId;
public GoogleMapsWriter(File outputDir, int adminLevelId) throws IOException {
this.outputDir = outputDir;
this.adminLevelId = adminLevelId;
encoder = new GooglePolylineEncoder();
writer = new JSONWriter(stringWriter);
// writer.setIndent(" ");
}
public void start(FeatureCollection features) throws IOException {
try {
writer.object();
writer.key("zoomFactor");
writer.value(encoder.getZoomFactor());
writer.key("numLevels");
writer.value(encoder.getNumLevels());
writer.key("entities");
writer.array();
} catch (JSONException e) {
throw new IOException(e);
}
}
public void write(int adminEntityId, Geometry geometry) throws IOException {
try {
writer.object();
writer.key("id");
writer.value(adminEntityId);
writer.key("polygons");
writer.array();
for (int i = 0; i != geometry.getNumGeometries(); ++i) {
Polygon polygon = (Polygon) geometry.getGeometryN(i);
writeLinearRing(polygon.getExteriorRing());
for (int j = 0; j != polygon.getNumInteriorRing(); ++j) {
writeLinearRing(polygon.getInteriorRingN(j));
}
}
writer.endArray();
writer.endObject();
} catch (JSONException e) {
throw new IOException(e);
}
}
private void writeLinearRing(LineString ring) throws IOException, JSONException {
PolylineEncoded encoded = encoder.dpEncode(ring.getCoordinates());
writer.object();
writer.key("points");
writer.value(encoded.getPoints());
writer.key("levels");
writer.value(encoded.getLevels());
writer.endObject();
}
public void close() throws IOException {
try {
writer.endArray();
writer.endObject();
} catch (JSONException e) {
throw new IOException(e);
}
// write uncompressed JSON file
File outFile = new File(outputDir, adminLevelId + ".json");
Files.write(stringWriter.toString(), outFile, Charsets.UTF_8);
// write compressed JSON
File compressedOutFile = new File(outputDir, adminLevelId + ".json.gz");
FileOutputStream fos = new FileOutputStream(compressedOutFile);
GZIPOutputStream zos = new GZIPOutputStream(fos);
zos.write(stringWriter.toString().getBytes(Charsets.UTF_8));
zos.finish();
zos.close();
}
}